【问题标题】:Reading 32 bit Float from modbus TCP using node red使用红色节点从 modbus TCP 读取 32 位浮点数
【发布时间】:2019-10-08 23:49:00
【问题描述】:

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

我的 modbus 有问题...

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

当 Node RED 读取值(FC 3,读取保持寄存器,数量 2)返回类似 [0,16833] 的值时...这里我在函数中使用 msg.payload=msg.payload[1] 来获取值16833 从数组中出来...

这是我的温度传感器值..

要查看 modbus 地址是否正确,我正在使用外部应用程序从传感器读取值 (Rilheva modbus poll) ...

设置为:时从 PLC 模块读取正确的值:

读取保持值 (03) - 32 位浮点字交换 (CD AB) - 见屏幕...

那么,有谁知道如何将其转换为实际价值 - 这里是 24.25...

【问题讨论】:

标签: node-red modbus-tcp


【解决方案1】:

正确的解决方法是如下使用 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

【讨论】:

    【解决方案2】:

    您可以首先将两个整数保存到缓冲区(交换您在 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

    【讨论】:

    • 这行得通,它显示了正确的值。(单线温度传感器 18b20).. 我用 msg.payload = [0, msg.payload[1]] 更改了第一行; .....但是如果我使用另一个寄存器,其中输入值模拟电压(0-5V)我无法获得正确的值。(寄存器类型相同)..我收到范围错误....RangeError [ERR_OUT_OF_RANGE]:“值”的值超出范围。必须 >= -32768 和
    • ModBUS 保持寄存器可以在多个 16 位寄存器中存储任意二进制数据。如果您想理解这些数据,您需要知道如何使用什么规则来表示 16 位块中的数据。根据您的结果,很明显模拟电压没有存储为浮点数(两个交换字)。您提到的传感器甚至不需要使用所有 16 位,因为它的精度是 12 位。也许您甚至需要进行一些额外的操作(在读取寄存器之后)以有意义的方式表示数据。
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2011-12-14
    • 2018-04-17
    相关资源
    最近更新 更多