我非常了解 Modbus 及其相关领域。我需要实现节点 js 应用程序,该应用程序应该通过 TCP 连接从 Modbus 寄存器读取数据并将其转换为可读格式,例如整数、浮点数、时间、字符、字符串。我正在使用 Modbus 串行 npm 包。我以某种方式实现了对话部分,但不知道它是对还是错。请根据你的反馈提出建议。
假设每个寄存器都有 2 字节的信息 & 字节数据看起来像 So Integer, Char - 1 byte Float - 2 byte Time 分配了 3 个字节(假设存储在 UNIX 时间戳中,甚至请建议是否有其他更好的处理方式)
寄存器保持值 | 缓冲区数据(字节) | 转换值 | 数据类型 |
---|---|---|---|
97 | 缓冲器 00 61 | 97 | 整数 |
100 | 缓冲器 00 64 | d | 字符 |
[565,598] | 缓冲器 02 35 02 56 | 1.32984502248624 | 漂浮 |
[1,1,1] | 缓冲器 00 01 00 01 00 01 | 2106-02-08 00:40:33 3333 | 时间 |
Modbus 没有定义数据类型的发送方式,它只定义了一个或多个 16 位字以及位的发送。
由于这些寄存器被解释为有符号或无符号整数,或者两个连续的寄存器被解释为浮点数,甚至更少,因为 3 个寄存器被解释为时间,那么协议的每个实现都按照它认为最好的方式进行。
因此,当发送浮点数时,有时首先发送最重要的字,有时则相反。在这种情况下,Modbus 客户端应准备反转字。
而在传输时间的情况下,它可能会更加复杂。
同意 !。Modbus 不知道数据类型。因此,我们已经定义了数据类型和转换。问题是期待更多的转换方法结果正确或错误。
@Narayanan 因为标准没有定义除 16 位字和位以外的数据类型,您的问题无法回答(没有“正确”的方法)。Char、Float和Time的实现方式有多种;正确的方式将是您与之通信的设备制造商选择的任何方式!(如果与多个设备通信,您可能需要多种编码/解码方法)。我发现这个计算器在尝试计算使用的编码时很有用。
@Brits,你说的很清楚,谢谢!!