node-red实现ModBus-RTU 通信协议(RS485信号输出)的数据交互


  本文参考《86 壳液晶温湿度变送器使用说明书(485 型)》,介绍基于485型 - 温湿度变表,通过node-red对数据进行读写的操作。
1

回到目录

一、介绍

  该变送器带有液晶显示,实时显示温湿度,背部免螺丝端子接线,可安装在标准86mm接线盒上。设备采用标准ModBus-RTU 通信协议,RS485信号输出,通信距离最大可达2000米(实测)。探头内置型、外延型可选,广泛适用于通讯机房、仓库楼宇以及自控等需要温湿度监测的场所。
1
回到目录

二、 通讯协议

2.1 通讯基本参数

1

回到目录

2.2 数据帧格式定义

采用 ModBus-RTU 通讯规约,格式如下:

  • 初始结构 ≥4 字节的时间
  • 地址码 = 1 字节
  • 功能码 = 1 字节
  • 数据区 = N 字节
  • 错误校验 = 16 位 CRC 码
  • 结束结构 ≥4 字节的时间
  • 地址码:为变送器的地址,在通讯网络中是唯一的(出厂默认 0x01)。
  • 功能码:主机所发指令功能指示。
  • 数据区:数据区是具体通讯数据,注意 16bits 数据高字节在前!
  • CRC 码:二字节的校验码。
    2

回到目录

2.3 寄存器地址

3
回到目录

2.4 通讯协议示例以及解释

1

  1. 温度计算:
    当温度低于 0 ℃ 时温度数据以补码的形式上传。
    温度:FF9B H(十六进制)= -101 => 温度 = -10.1℃
  2. 湿度计算:
    湿度:292 H (十六进制)= 658 => 湿度 = 65.8%RH
    2
    回到目录

三、 node-red实现数据交互

3.1 node-red读取数据

1
  根据第二章节对设备问询帧地址的定义,模拟读取如下配置信息的设备数据:

注意:这里地址码变了,我读的是地址码(devID)为40的设备地址数据,示例中读取的是地址码(devID)为1的数据,其他的设置是一样的

说明十进制十六进制
设备地址DevID400x28
功能码30x03
数据起始地址address00x00 0x00
数据长度len20x00 0x02
检验码crc20xC3 0xF2

  CRC(Cyclic Redundancy Check,循环冗余校验)是一种数据校验方式,主要用于判断数据传输过程中数据是否发生改变、传输是否出错,并在传输时保证数据完整性。上位机须按照MODBUS协议的命令格式发送数据(包括计算的CRC值),从机才能正确辨识数据。若无CRC值,从机将返回含有错误号的应答包,不会得到正确结果。标准的做法,发送前计算CRC值并一起发送,接收后也计算CRC值并与接收的校验码对比是否相等,以辨别数据是否准确。CRC校验码的计算,参考链接:modbus rtu协议的CRC(循环冗余校验)在线计算
1
计算CRC为:F2 C3 ,高位在左,低位在右,交换得到数据为:0xC3, 0xF2

  • 通过node-red进行读取操作如下
  1. 编辑命令:
    msg.payload = Buffer.from([0x28, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC3, 0xF2]);
  2. 向串口发送问询帧命令
    1
  3. 设备返回数据,格式如下:
    3
  4. 收到应答帧如下:
msg.payload = [0x28,0x03,0x04,0x01,0x3d,0x00,0xb8,0xd2,0xb3]

根据如下应答帧格式:
1
这里返回的数据为:
湿度值:0x01 0x3d -> 013dH -> 转换为10进制:11616+316+131 = 317
温度值:0x00,0xb8 -> 00b8H -> 转换为10进制:0+0+11×16+8×1 = 184

1

  1. 根据2.4节说明书中定义的温湿度计算方法,进行转换计算如下:
  • 当温度低于 0 ℃ 时温度数据以补码的形式上传,即温度是带符号的,需要进行处理
/** 有符号整数补码转换转成16位有符号整数:
 * 如-80的补码为65456,读取出来是65456,需要通过该函数转换成-80
 */
function Signed16ToInt16Be(num){
    //32767是16位带符号证书能表示的最大正数,当数值从32767再增加1时,就会上溢变成负数。
    //即mod通信中所有的负数都是用补码形式存储(如‘-80’实际读\写出来是‘65456’)
    //需要检测是否发生了从正数到负数的转换,即是否发生了上溢或下溢,如果有,进行转换
    return num >= 32768 ? num - 65536 : num;
}

5

  • 温湿度都需要进行分辨率处理,即最终数据为:值*0.1
    最终得到:
    • 湿度值:0x01 0x3d -> 013dH -> 转换为10进制:11616+316+131 = 317 * 0.1 = 31.7%RH
    • 温度值:0x00,0xb8 -> 00b8H -> 转换为10进制:0+0+11×16+8×1 = 184 = 18.4 ℃

回到目录

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node-RED是一款基于JavaScript的开源软件,用于创建基于流程的物联网应用程序。Modbus是一种通用的通信协议,常用于连接工业自动化设备。Node-RED通过Modbus插件,可以实现数据采集数据采集是指从各种传感器、设备或系统中收集数据的过程。使用Node-RED进行Modbus数据采集可以帮助我们获取工业设备的实时数据,并进行实时监测和分析。 在Node-RED中,我们需要安装Modbus插件来支持Modbus通信。安装插件后,我们可以在流程编辑器中添加Modbus节点,配置节点的通信参数,例如Modbus设备的IP地址和端口号。然后,我们可以选择读取或写入Modbus设备的寄存器数据。 在数据采集过程中,我们可以通过设置定时器节点来定期读取Modbus设备的数据。读取到的数据可以保存在本地的数据库中,或者通过其他节点进行处理和分析。我们还可以通过在网页上创建可视化界面,实时展示采集的Modbus数据Node-RED的流程编辑器提供了丰富的功能和节点库,可以灵活地处理和展示数据。我们可以根据具体的需求,选择适合的节点进行数据处理。例如,我们可以使用计算节点对数据进行转换、计算或筛选;使用图表节点可视化数据;使用报警节点根据设定的阈值触发警报等等。 通过Node-RED进行Modbus数据采集,我们可以快速建立起一个灵活、可扩展的数据采集系统。同时,Node-RED的直观界面和丰富的节点库,简化了数据采集过程,使我们能够更轻松地获取和利用Modbus设备的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值