You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用S7.Net读取西门子S7-1200 PLC字符串时旧数据残留问题

解决S7.Net读取西门子S7-1200字符串残留旧数据的问题

问题原因

西门子S7系列PLC的字符串采用固定格式存储:[最大长度字节][实际长度字节][字符数据]。当写入较短的新字符串时,PLC不会自动清空后续残留的旧字符;而你原代码中固定指定读取20个字符长度,就会把后面未被覆盖的旧字符一并读入,导致出现ABCName这类拼接结果。

解决方案

推荐使用以下两种方法处理:

方法1:使用S7.Net内置的ReadString方法(最简便)

ReadString方法会自动识别PLC字符串的实际长度字段,只读取有效字符,避免残留数据。代码示例:

// 最后一个参数对应PLC中字符串的定义最大长度(比如你DB里定义的是String[20]就填20)
var ss1 = plc.ReadString(DataType.DataBlock, 30, 0, 20);
txt_Textbox.Text = ss1;

方法2:手动读取实际长度后截取有效字符

如果需要更精细控制,可以先读取字符串的实际长度字段,再按需读取字符:

// 读取实际长度(西门子字符串的第二个字节是实际有效长度)
byte actualLength = (byte)plc.Read(DataType.DataBlock, 30, 1, VarType.Byte, 1);
// 根据实际长度读取有效字符
var ss1 = plc.Read(DataType.DataBlock, 30, 2, VarType.String, actualLength);
// 可选:去除末尾可能存在的空字符
txt_Textbox.Text = ss1.ToString().TrimEnd('\0');

额外建议:写入字符串时用WriteString方法

为了从源头避免问题,写入PLC字符串时也建议使用S7.Net的WriteString方法,它会自动更新实际长度字段,确保PLC存储的字符串信息正确:

// 参数依次是:数据类型、DB块号、起始偏移、要写入的字符串、字符串最大长度
plc.WriteString(DataType.DataBlock, 30, 0, "ABC", 20);

内容的提问来源于stack exchange,提问作者Vikky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:26:06