ARCS Modbus 使用指南
1.Modbus TCP和Modbus RTU介绍
Modbus是一种串行通信协议,最初由Modicon公司(现在的施耐德电气)在1979年为使用可编程逻辑控制器(PLC)的自动化设备设计。Modbus已经成为工业领域通信协议的事实标准。Modbus协议包括Modbus RTU和Modbus TCP两种形式。
Modbus RTU(Remote Terminal Unit):这是一种基于串行线(例如RS-485、RS-422、RS-232)的二进制通信协议。在Modbus RTU中,数据以二进制形式传输,每个字节由两个十六进制字符表示。Modbus RTU主要用于工业和系统自动化应用,其中设备之间的通信距离较长。
Modbus TCP(Transmission Control Protocol):这是一种基于以太网的通信协议。Modbus TCP使用TCP/IP协议进行通信,因此可以利用现有的以太网基础设施。与Modbus RTU相比,Modbus TCP可以支持更多的设备连接,并且通信速度更快。
两者的主要区别在于物理层和传输层的协议:Modbus RTU使用串行通信,而Modbus TCP使用TCP/IP协议。
2.快速入门
打开ARCS软件,Modbus位于 配置--现场总线--Modbus
2.1 Modbus TCP
PS: 确保设备与机器人之间可正常通信,可使用ping
命令检查,同时关闭设备的防火墙.
- 单元页面,依次点击添加Modbus单元--TCP模式
- 输入IP 地址和端口
- 信号页面,选择添加Modbus信号
01:COIL STATUS(线圈状态):用于读取和控制远程设备的开关状态,通常用于控制继电器等开关设备。
02:INPUT STATUS(输入状态):用于读取远程设备的输入状态,通常用于读取传感器等输入设备的状态。
03:HOLDING REGISTER(保持寄存器):用于存储和读取远程设备的数据,通常用于存储控制参数、设备状态等信息。
04:INPUT REGISTER(输入寄存器):用于存储远程设备的输入数据,通常用于存储传感器等输入设备的数据。
2.2 Modbus RTU
PS: 确保设备与机器人之间可正常通信,可先使用串口调试助手测试线路通信是否正常,
- 单元页面,依次点击添加Modbus单元--RTU模式
选择串口号,波特率,奇偶校验,数据位,停止位
注意:若通信不稳定,信号状态闪烁,可将波特率值调小(9600、4800等);
信号页面,选择添加Modbus信号
01:COIL STATUS(线圈状态):用于读取和控制远程设备的开关状态,通常用于控制继电器等开关设备。
02:INPUT STATUS(输入状态):用于读取远程设备的输入状态,通常用于读取传感器等输入设备的状态。
03:HOLDING REGISTER(保持寄存器):用于存储和读取远程设备的数据,通常用于存储控制参数、设备状态等信息。
04:INPUT REGISTER(输入寄存器):用于存储远程设备的输入数据,通常用于存储传感器等输入设备的数据。如果节点中使用
等待节点中使用
2.3. 问题处理
Modbus TCP信号通信失败
- 排查设备与机器人之间网络是否能正常通信,首先查看是否关闭设备的防火墙,然后使用
ping
命令检查网络是否能正常通信; - 排查主站建立的信号地址在从站中是否存在,主站新建的信号对应地址在从站中必须存在,信号才能正常通信;
Modbus RTU信号通信失败
- 排查设备与机器人之间串口通信是否正常, 可以使用设备与机器人中的串口调试助手来测试串口通信状态;
- 排查主站建立的信号地址在从站中是否存在,主站新建的信号对应地址在从站中必须存在,信号才能正常通信;
操作步骤:
在机器人控制柜中使用命令安装 cutecom
打开cutecom,并设置串口号,波特率,奇偶校验,数据位,停止位
若设备端是PLC,则用 cutecom
直接连接PLC测试,若设备是本机电脑,可在电脑中安装串口调试助手,例如:XCOM
如果 cutecom
和 PLC/XCOM
能够相互发送数据,表示能正常通信,串口通信线路没有问题,反之,需要检查通信线路连接情况;
3.配置中使用Modbus信号
在配置--一般--I/O设置
- 输入动作
- 输出信号
4. Modbus 从站
第一步:开启 Modbus TCP 或者 Modbus RTU;
第二步:开启从站之后,就可以使用其它的主站(列如: modscan)来连接该从站,从站地址请参考 Modbus 从站协议中的定义;
备注:Modbus 从站通信问题的解决方法,请参考上述主站的通信问题处理步骤;
5.modbusSendCustomCommand接口应用
5.1 接口功能说明&注意事项
- 将用户指定的命令发送到指定IP地址上的Modbus单元。
- 由于不会接收到响应,因此不能用于请求数据,读数据的功能码暂不可用。
- 用户负责提供对所提供的功能码有意义的数据。
- 内置函数负责构建Modbus帧,因此用户不需要关心命令的长度,不需要输入CRC格式的数据。
5.2 参数定义及格式
// 接口定义
int modbusSendCustomCommand(const std::string &device_info,int slave_number, int function_code, const std::vector<uint8_t> &data);
// device_info: 设备信息
* 设备信息是RTU格式,
* 例如:"serial_port,baud,parity,data_bit,stop_bit"
* (1)serial_port参数指定串口的名称,
* 例如,在Linux上为"/dev/ttyS0"或"/dev/ttyUSB0",在Windows上为"\.\COM10"
* (2)baud参数指定通信的波特率,例如9600、19200、57600、115200等
* (3)parity参数指定奇偶校验方式,N表示无校验,E表示偶校验,O表示奇校验
* (4)data_bit参数指定数据位数,允许的值为5、6、7和8
* (5)stop_bit参数指定停止位数,允许的值为1和2
*
* 设备信息是TCP格式,例如:"ip address,port"
* (1)ip address参数指定服务器的IP地址
* (2)port参数指定服务器监听的端口号
// slave_number: 指定用于自定义命令的从站号
// function_code: 指定自定义命令的功能码
* MODBUS_FC_READ_COILS 0x01 // 读线圈寄存器
* MODBUS_FC_READ_DISCRETE_INPUTS 0x02 // 读离散输入状态
* MODBUS_FC_READ_HOLDING_REGISTERS 0x03 // 读保持寄存器
* MODBUS_FC_READ_INPUT_REGISTERS 0x04 // 读输入寄存器
* MODBUS_FC_WRITE_SINGLE_COIL 0x05 // 写单线圈
* MODBUS_FC_WRITE_SINGLE_REGISTER 0x06 // 写单寄存器
* MODBUS_FC_READ_EXCEPTION_STATUS 0x07 // 读异常状态(限串行线)
* MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F // 写多线圈
* MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10 // 写多个寄存器
* MODBUS_FC_REPORT_SLAVE_ID 0x11 // 报告丛机ID(限串行线)
* MODBUS_FC_MASK_WRITE_REGISTER 0x16 // 带屏蔽字写入寄存器
* MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17 // 读&写寄存器
// data: 必须是有效的字节值(0-255)
* { 0x00, 0x02, 0x00, 0x0F }
* { 0x06, 0x0A, 0x0F, 0x08, 0x00, 0x0F }
5.3 调用示例
// 定义IP
#define MODBUS_IP "172.16.3.111,502"
// 建立对象
RpcClientPtr impl;
// 发送自定义数据
impl->getRegisterControl()->modbusSendCustomCommand(MODBUS_IP, 1, 0x06, { 0x00, 0x02, 0x00, 0x0F });