■ 软件需求
本例程以Modbus RTU协议为例,ExpOS设备做主机,通讯串口使用com1连接4台modbus RTU从设备(地址01 ~ 04)进行通讯,查询和控制从机的状态。
■ 设计步骤
1.首先设置串口com1协议为ModbusRTU,速率为9600,如果需要处理通讯超时,需要勾选“使能超时”属性,默认接收超时为100mS,可以根据具体情况调整
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通讯”