使用C#和S7.NET读取PLC双字MD10数据异常的技术求助
解决PLC双字(MD10)读取浮点数错误的问题
问题核心是你把PLC中存储为**单精度浮点数(REAL,IEEE 754 32位)**的双字数据,直接当成无符号整数转换了,导致得到的是原始二进制对应的整数值,而非实际浮点数。
解决方案:解析32位二进制为浮点数
PLC的MD10存储的是REAL类型(32位浮点数),需要按照IEEE 754标准解析原始二进制数据,而不是直接转整数。以下是两种常见场景的代码:
场景1:plc.Read("MD10")返回byte[]类型
西门子S7系列PLC采用大端字节序存储REAL,而Windows系统的BitConverter默认是小端,需要先反转字节数组:
byte[] rawBytes = (byte[])plc.Read("MD10"); Array.Reverse(rawBytes); // 适配大端转小端 float realValue = BitConverter.ToSingle(rawBytes, 0); textBox4.Text = realValue.ToString("F3"); // 按需求格式化小数位数,如保留3位
场景2:plc.Read("MD10")返回uint类型
先将无符号整数转成字节数组,再反转后解析为浮点数:
uint rawUint = (uint)plc.Read("MD10"); byte[] rawBytes = BitConverter.GetBytes(rawUint); Array.Reverse(rawBytes); float realValue = BitConverter.ToSingle(rawBytes, 0); textBox4.Text = realValue.ToString("F3");
为什么字数据(MW0)读取正常?
因为MW0存储的是整数类型(比如INT),直接读取后转字符串就是正确的整数值,不需要额外解析浮点数格式。
内容的提问来源于stack exchange,提问作者sakis
相关产品推荐
相关产品推荐

