从两个 16 位 modbus 寄存器中提取日期和时间

extract Date and Time from two 16-bit modbus registers

我正在使用通过 Modbus RTU 协议与我的处理器通信的 ElNet 电能表。

有两个 16 位 ElNet 寄存器以 Win 格式(寄存器 85-86,this 文档的第 6 页)包含有关日期和时间的信息(分别)。我能够读取这两个寄存器。但是,我无法提取有关日期和时间的信息。

例如,日期寄存器包含今天日期 (31/07/2015) 的十进制值 17841。有没有人愿意向我解释如何将 17841 转换为 31/07/2015?

我的时间也有同样的问题。我的时间寄存器包含一个十进制值 55296。你能帮我从这个数字中提取时间吗?

这个帖子解决了同样的问题: HEX/Decimal to date and time from modbus 但是,我不确定我是否理解那里应用的提取算法。我的操作点是用C或C++编写代码的处理器。

非常感谢您花时间和精力帮助我。

此致,

博扬。

此处描述了 MS-DOS date/time 格式:https://archive.is/2bVlz (was http://proger.i-forge.net/MS-DOS_date_and_time_format/OFz 但已消失)

另一个问题中提到的 17256 值是有意义的,因为它转换为 2013-11-08。在这里查看操作方法:

Register bit description: 0bYYYYYYYMMMMDDDDD

Registervalue: 17256 0b0100001101101000

Yearmask: 0b1111111000000000
Yearpart: 0b0100001000000000
Yearpart rightshifted 9 steps: 0b0000000000100001 = 33 years after 1980

Monthmask: 0b0000000111100000
Monthpart: 0b0000000101100000
Monthpart rightshifted 5 steps: 0b0000000000001011 = 11

Daymask: 0b0000000000011111
Daypart: 0b0000000000001000 = 8

不幸的是,您的寄存器值 17841 没有意义,因为它转换为 2014-13-17(即第 13 个月)。

您确定:

  • 你读对了寄存器? (更改仪器中的时间设置,看看寄存器值会发生什么变化)
  • 你不会把寄存器中的两个字节搞混了吧?
  • 时间设置是否正确?