我是靠谱客的博主 野性音响,最近开发中收集的这篇文章主要介绍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

最后

以上就是野性音响为你收集整理的Express Pi 开发实例-Modbus RTU的全部内容,希望文章能够帮你解决Express Pi 开发实例-Modbus RTU所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部