minimalModbus MSW is always 0



我有一个电能表EM340,具有以下modbus规格:

kWh (+) TOT - INTeger部分Value=INT(kWh)*1kWh (+) TOT - DECimal partValue=DEC(kWh)*1000

该设备的相关手册可在此处获得。第7页:

对于所有格式,字节顺序(在单个单词内)都是MSB->LSB。在INT32、UINT32和UINT64格式中,字序为LSW->垃圾

"MSW"="最重要的词"。Modbus保持/输入寄存器是16位(或一个字);为了保存较大的值(例如INT32),该值分布在多个寄存器中。Modbus规范没有提供任何关于如何做到这一点的指导,所以它是特定于设备的。上面告诉你,对于这个设备,最低有效字将存储在最低寄存器中。例如,0xFFFF0000可以存储为reg1 = 0x0000和reg2 = 0xFFFF。

注意:MSW总是0

"kWh (+) TOT - INTeger部分"是两个16位字的INT32。如上所述,这将存储在两个寄存器上(LSW = reg 0x402和MSW = reg 0x403)。注释表明MSW(寄存器0x403)将始终为0,并且可能被忽略(表明数据实际上是UINT16)。

我不确定的一个元素是规范说这是一个INT32,所以一个有符号的值。通常,这意味着最高位是一个符号位(如果值为负值则设置)。然而,由于MSB始终为0,因此完整值不能为负值。这是有意义的,因为这是一个更大的数字(reg 0x400/0x401)的十进制部分,所以符号位将在该值中。

DECimal部分
Value=DEC(kWh)*1000

这似乎证实了上述情况。由于该值是小数部分乘以1000,因此有效值将是0-999(因为1000/1000 = 1,而1不是小数部分的一部分)。因此,所有可能的值都适合INT16。

注:以上是我对文件的解读;我从来没用过这些装置!(可能是误读了)。

相关内容

  • 没有找到相关文章

最新更新