使用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
相关产品推荐
相关产品推荐

