C#调用Snap7读取PLC char数组时空字符过滤失效问题排查
问题原因
你的过滤条件完全没生效,核心问题有两个:
- 你调用
S7.GetCharsAt时指定读取1个字符,这个方法返回的永远是长度为1的字符串,不可能等于长度为0的空字符串"",所以你写的c != ""判断恒成立,等于完全没做非空校验。 - PLC里char数组的空值根本不是C#概念里的空串,未赋值的位置存的是ASCII码为0的空字符
'\0',部分场景下也会填充空格,这两种字符打印到控制台看起来和空值一模一样,但实际既不是""也不是你要过滤的"?",自然会全部被拼接到结果里。
修复代码
直接取读取到的单个字符做值判断,不要拿长度为1的字符串和空串比:
String sealNumber = ""; for (int i = 90; i < 108; i++) { String c = S7.GetCharsAt(bufferLineToRead, i, 1); char current = c[0]; // 过滤空字符、空格、问号 if (current != '\0' && current != ' ' && current != '?') { Console.WriteLine("STRINGA " + c); sealNumber += c; } }
注意事项
如果后续读取出现乱码,先核对PLC侧的字符编码:西门子S7系列普通CHAR数组默认是ASCII编码,WCHAR类型才是UTF-16编码,调用Snap7读取方法时不要传错编码参数,避免字符识别错误导致过滤失效。
内容的提问来源于stack exchange,提问作者Nicola Rigoni
相关产品推荐
相关产品推荐

