Express Pi 开发实例-Modbus RTU

■ 软件需求

1540969920691745.png

本例程以Modbus RTU协议为例,ExpOS设备做主机,通讯串口使用com1连接4台modbus RTU从设备(地址01 ~ 04)进行通讯,查询和控制从机的状态。

■ 设计步骤

1.首先设置串口com1协议为ModbusRTU,速率为9600,如果需要处理通讯超时,需要勾选“使能超时”属性,默认接收超时为100mS,可以根据具体情况调整

1536793426107189.png

ExpOS设备目前支持的Modbus RTU功能码如下:

  • 功能码01:读线圈(开关量输出)
  • 功能码02:读输入状态(开关量输入)
  • 功能码03:读保持寄存器(模拟量输出)
  • 功能码04:读输入寄存器(模拟量输入)
  • 功能码05:写单线圈(开关量输出)
  • 功能码06:写单保持寄存器(模拟量输出)
  • 功能码15:写多线圈(开关量输出)
  • 功能码16:写多保持寄存器(模拟量输出)
  • 功能码0F: 写多个线圈寄存器
  • 功能码10: 写多个保持寄存器

2.主机发送Modbus指令

串口控件有专门的modbus写方法:device.com1.writeModbus(data) , 参数data可以是一个字符串(字符之间使用空格分隔),也可以是一个16进制的数组,也可以输入多个16进制做为参数

device.com1.writeModbus(’01 01 00 00 00 02′); // 字符串
device.com1.writeModbus([0x01, 0x01, 0x00, 0x00, 0x00, 0x02]); // 数组
device.com1.writeModbus(0x01, 0x01, 0x00, 0x00, 0x00, 0x02); // 16进制

串口硬件输出的字节流为:01 01 00 00 00 02 BD CB

当然我们也可以不使用writeModbus方法,自己计算CRC,最后使用通用的write方法来写串口

如:

var data = [0x01, 0x01, 0x00, 0x00, 0x00, 0x02];
var crc = util.calculateCRC16(data); // 返回长度为两个字节的数组
device.com1.write(data, crc);

串口硬件输出的字节流为:01 01 00 00 00 02 BD CB

3.主机接收Modbus从机回复

当第2步主机发送指令完成后,对应地址的从机回复,串口com1接收到一帧完整数据并CRC校验通过后,会调用串口控件的onReceive方法

如果串口控件设置勾选了“使能超时”属性,如果从机返回超时,或者从机返回数据帧校验有问题,会调用串口的onEvent方法

 

完整工程,请在最新版本的Studio中打开例程“Modbus RTU通讯”

1553634166299761.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值