如何使用节点红色功能块读取 modbus TCP 保持值 (03) - 32 位浮点字交换 (CD AB)?
我的modbus有问题...
从 modbus TCP 读取(FC3,数据大小 32 位浮点数,地址 272 十进制)...
当节点 RED 读取值(FC 3,读取保持寄存器,数量 2)返回类似 [0,16833] 的值时......这里我在函数中使用 msg.payload=msg.payload[1] 来从中获取值 16833大批...
这是我的温度传感器值..
要查看 modbus 地址是否正确,我正在使用外部应用程序从传感器读取值(Rilheva modbus poll)...
设置为 时从 PLC 模块读取正确值:
读取保持值 (03) - 32 位浮点字交换 (CD AB) - 见屏幕...
那么,有没有人知道如何将其转换为实际价值 - 这里是 24.25 ...
你可以先将两个整数保存到缓冲区中(交换你在 OP 中提到的单词)。之后,将缓冲区读取为浮点数。
这就是函数节点的样子(添加第一行是为了测试)。
msg.payload = [0, 16833];
let pay = msg.payload;
const buf = Buffer.allocUnsafe(4);
buf.writeInt16BE(pay[0],2);
buf.writeInt16BE(pay[1],0);
msg.payload = buf.readFloatBE(0);
return msg;
使用你的样本数据 [0,16833] 进行测试时,你将得到 msg.payload = 24.125
这有效,它显示了正确的值。(1 线温度传感器 18b20)。我用 msg.payload = [0, msg.payload[1]] 更改了第一行;.....但是如果我使用另一个寄存器,其中输入值模拟电压(0-5V)我无法得到正确的值。(寄存器类型是相同的)..我得到范围错误....RangeError [ERR_OUT_OF_RANGE]:“value”的值超出范围。它必须 >= -32768 和 <= 32767。这里收到 52880 必须输出 40...
ModBUS 保持寄存器可以在多个 16 位寄存器中存储任意二进制数据。如果您想理解这些数据,您需要知道如何使用什么规则以 16 位块表示该数据。从您的结果来看,很明显模拟电压没有存储为浮点数(有两个交换的字)。您提到的传感器甚至不需要使用所有 16 位,因为它的精度是 12 位。也许您甚至需要进行一些额外的操作(在读取寄存器之后)以有意义的方式表示数据。