施耐德PLC读取电能表数值 双寄存器转REAL值结果异常问询
问题根源
你当前的转换逻辑存在根本性错误:这两个跨寄存器存储的数值不是放大10倍的整数,而是32位IEEE 754单精度浮点数(REAL)的原始二进制编码,你将其拼接为DWORD后按整数规则乘以0.1的操作完全不符合编码规则,是错误的核心原因。
错误逻辑验证
你当前的计算逻辑为:(高字 * 65536 + 低字) * 0.1,代入你拿到的数值计算如下:(17268 * 65536 + 2456) * 0.1 = 1131702680 * 0.1 = 1.13E+08,和你实际得到的错误值完全吻合,证实逻辑错误。
正确转换方案
不需要做任何乘法运算,直接将拼接完成的32位DWORD二进制数据重解释为REAL类型即可得到正确电压值。
在结构化文本(ST)中,推荐用联合体(UNION)的方式实现内存重解释,避免标准类型转换的数值换算逻辑,示例代码如下:
// 先定义共用体类型 TYPE Float_To_Dword_Union : UNION Raw_DWORD : DWORD; Split_Words : ARRAY[0..1] OF WORD; Converted_REAL : REAL; END_UNION END_TYPE // 业务代码调用 VAR PhaseV_Union : Float_To_Dword_Union; Phase1_Voltage : REAL; END_VAR // 按设备字序赋值(如果读出数值不对,调换两个WORD的赋值顺序即可适配不同字序) PhaseV_Union.Split_Words[1] := 17268; // 高字(MSW) PhaseV_Union.Split_Words[0] := 2456; // 低字(LSW) // 直接读取REAL成员即可得到正确电压 Phase1_Voltage := PhaseV_Union.Converted_REAL;
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

