使用S7.NET读取S7-1500 PLC REAL类型数据转C#类型的疑问
西门子S7-1500 REAL类型数据转C#类型的正确方法
核心类型对应关系
西门子S7-1500的REAL类型是32位单精度浮点数,与C#中的float(别名System.Single)完全匹配;C#的double是64位双精度浮点数,对应S7的LREAL类型。因此你用ConvertToFloat()转换REAL数据是正确方向,文档示例中ConvertToDouble()的写法大概率是混淆了REAL和LREAL,属于文档错误。
验证转换结果的准确性
你可以通过以下方式确认转换是否正确:
- 在PLC中设置已知的REAL值(比如
1.0、2.5),读取对应的uint原始值后用ConvertToFloat()转换,对比结果是否匹配。 - 手动计算验证:
比如PLC中0.5的REAL值,标准单精度浮点数十六进制表示为0x3F000000,对应十进制uint为1065353216。如果你的读取值经ConvertToFloat()得到0.5,说明通信库已自动处理了字节序差异(西门子PLC采用大端字节序,Windows平台默认小端,多数通信库会封装此逻辑)。
手动转换替代方案(可选)
如果想自行实现转换逻辑,可借助BitConverter类处理,注意反转字节序:
uint rawValue = (uint)Plc.Read("DB85.DBD50"); // 将uint转为字节数组 byte[] bytes = BitConverter.GetBytes(rawValue); // 反转字节以匹配西门子大端字节序 Array.Reverse(bytes); // 转换为float float result = BitConverter.ToSingle(bytes, 0);
关于找不到ConvertToDouble()的说明
ConvertToDouble()是为S7的LREAL(64位双精度)类型设计的,你读取的是32位REAL,因此通信库不为uint提供该方法是合理的——32位REAL数据无需转成64位double,强行转换也不会提升精度。
内容的提问来源于stack exchange,提问作者Bubble Bub
相关产品推荐
相关产品推荐

