Modbus主机
本例程使用ExpOS设备做主机,使用modbus控件,通讯接口使用串口com1(modbus-rtu)或者网口(modbus-tcp)。
【注意】modbus-rtu可以通过Windows模拟器来模拟 (在工程配置对话框中Windows选项页绑定物理串口,模拟器选择Windows)。
■ 设计步骤
1、如果使用modbus-rtu方式,首先需要设置串口com1协议为PassThrough(透传),这样串口com1将串口的读写转交给modbus控件,波特率115200
2、在主页面上拖入modbus控件(注意:modbus控件所属的页面需要把页面的“隐藏时缓存”属性勾选上),设置相应的属性,类型选择RTU或者TCP,角色选择Master, 串口选择COM1
3、从站的设置,如果是RTU通讯,可以设置slaveId属性;如果是TCP通讯,需要使用modbus.connect(ip, port)方法来连接从站
4、modbus的读和写 (注意:不管是RTU还是TCP, 读写方法都是一样的)
modbus控件中提供了下面的4种读写方法,一般推荐使用前3种方法即可,不建议使用sendRaw(data)方法
- read(code, addr, nb) 读线圈或者保持寄存器:code-功能码,addr-寄存器地址,nb-读取个数
- write(code, addr, values) 写线圈或者保持寄存器:code-功能码,addr-寄存器地址,values-设置值数组
- writeread(code, write_addr, write_values, read_addr, read-nb) 写和读:code-功能码 ,write_addr-写寄存器地址,write_values-写操作数组,read_addr-读寄存器地址,read-nb读取的个数
- sendRaw(data) 发送原始数据帧,data为字节数组,首字节以功能码开头,中间是寄存器地址以及个数和数据,帧尾不需要添加CRC校验,如果是RTU协议控件内部会自动追加CRC(TCP协议不需要CRC)
Modbus的读和写都是异步方法,返回结果都是在modbus控件的事件方法onReceive()或者onError(),如果通讯正常,调用onReceive();如果通讯出错,则调用onError()
函数定义:onReceive(data, flags, addr)
data为从站回复的结果数组(如果请求是通过sendRaw(data)发起的,返回的结果是原始的字节数组),flags为标识(包含isRaw, slaveId, functionCode标识), addr为寄存器地址
函数定义:onError(errno, reason, flags)
errno为错误号,reason为错误原因字符串,flags为标识(包含isRaw, slaveId, functionCode标识),addr为寄存器地址
完整工程,请在最新版本的WeStudio中打开例程“Modbus 主机演示”