使用节点红色从 modbus TCP 读取 32 位浮点数

Reading 32 bit Float from modbus TCP using node red

如何使用节点红色功能块读取 modbus TCP 保持值 (03) - 32 位浮点字交换 (CD AB)?

我有 modbus 问题...

正在从 modbus TCP 读取(FC3,数据大小 32 位浮点数,地址 272 十进制)...

当 Node RED 读取值时(FC 3,读取保持寄存器,数量 2)returns 值如 [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

正确的解决方案是使用 writeUInt16BE 如下-

msg.payload = [0, 16833];
let pay = msg.payload;

const buf = Buffer.allocUnsafe(4);
buf.writeUInt16BE(pay[0],2);
buf.writeUInt16BE(pay[1],0);

msg.payload = buf.readFloatBE(0);
return msg;enter code here