Skip to content

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

​ 如果 cutecomPLC/XCOM 能够相互发送数据,表示能正常通信,串口通信线路没有问题,反之,需要检查通信线路连接情况;

3.配置中使用Modbus信号

配置--一般--I/O设置

  • 输入动作

  • 输出信号

4. Modbus 从站

第一步:开启 Modbus TCP 或者 Modbus RTU;

第二步:开启从站之后,就可以使用其它的主站(列如: modscan)来连接该从站,从站地址请参考 Modbus 从站协议中的定义;

备注:Modbus 从站通信问题的解决方法,请参考上述主站的通信问题处理步骤;

5.modbusSendCustomCommand接口应用

5.1 接口功能说明&注意事项

  • 将用户指定的命令发送到指定IP地址上的Modbus单元。
  • 由于不会接收到响应,因此不能用于请求数据,读数据的功能码暂不可用。
  • 用户负责提供对所提供的功能码有意义的数据。
  • 内置函数负责构建Modbus帧,因此用户不需要关心命令的长度,不需要输入CRC格式的数据。

5.2 参数定义及格式

c++
// 接口定义
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、1920057600115200
     * (3)parity参数指定奇偶校验方式,N表示无校验,E表示偶校验,O表示奇校验 
     * (4)data_bit参数指定数据位数,允许的值为5、67和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 调用示例

c++
// 定义IP
#define MODBUS_IP          "172.16.3.111,502"    
// 建立对象
RpcClientPtr impl;
// 发送自定义数据
impl->getRegisterControl()->modbusSendCustomCommand(MODBUS_IP, 1, 0x06, { 0x00, 0x02, 0x00, 0x0F });