4.3 Modbus 协议
Modbus 通信的底层为 RS485 信号,采用双绞线进行连接就可以了,因此传输距离较远,可达 1000 米,抗干扰性能比较好,且成本低,在工业控制设备的通信中被广泛使用,现在众多厂家的变频器、控制器都采用了该协议。
Modbus 最主流的传输格式为 Modbus-RTU,采用 HEX 码直接传送数据,无需额外的格式转换,因此通信效率较高,处理简单,是目前工业现场中使用最广泛的 Modbus 通信方式。
4.3.1 Modbus 功能码及数据编址
XT 3U 作为 Modbus 从站时,支持 Modbus 协议功能码 0x01,0x02,0x03,0x04,0x05,0x06,0x0F,0x10, 0x17;
通过这些功能码,可读写的线圈有 M,S,T,C,X(只读),Y 等变量;寄存器有 D,T,C。Modbus通信主机在访问(读取或改写)PLC 从机的内部变量时,必须遵循如下的通信命令帧定义,以及变量地址索引方法,才能进行正常的通信操作。
4.3.2 XT 3U MODBUS 通信地址
- 位软元件
| MODBUS软元件 | MODBUS软元件 | FX3U/FX3C软元件 |
|---|---|---|
| 输入(读出专用) | 线圈(读出/写入) | |
| 0x0000-0x1DFF | 0x0000-0x1DFF | M0-M7679 |
| 0x1E00-0x1FFF | 0x1E00-0x1FFF | M8000-M8511 |
| 0x2000-0x2FFF | 0x2000-0x2FFF | S0-S4095 |
| 0x3000-0x31FF | 0x3000-0x31FF | TS0-TS511 |
| 0x3200-0x32FF | 0x3200-0x32FF | CS0-CS255 |
| 0x3300-0x33FF | 0x3300-0x33FF | Y0-Y377 |
| 0x3400-0x34FF | - | X0-X377 |
- 字软元件
| MODBUS软元件 | MODBUS软元件 | FX3U/FX3C软元件 |
|---|---|---|
| 输入(读出专用) | 线圈(读出/写入) | |
| 0x0000-0x1F3F | 0x0000-0x1F3F | D0-D7999 |
| 0x1F40-0x213F | 0x1F40-0x213F | D8000-D8511 |
| 0x2140-0xA13F | 0x2140-0xA13F | R0-R32767 |
| 0xA140-0xA33F | 0xA140-0xA33F | TN0-TN511 |
| 0xA340-0xA407 | 0xA340-0xA407 | CN0-CN199 |
| 0xA408-0xA477 | 0xA408-0xA477 | CN200-CN255*1 |
| 0xA478-0xA657 | 0xA478-0xA657 | M0-M7679 |
| 0xA658-0xA677 | 0xA658-0xA677 | M8000-M8511 |
| 0xA678-0xA777 | 0xA678-0xA777 | S0-S4095 |
| 0xA778-0xA797 | 0xA778-0xA797 | TS0-TS511 |
| 0xA798-0xA7A7 | 0xA798-0xA7A7 | CS0-CS255 |
| 0xA7A8-0xA7B7 | 0xA7A8-0xA7B7 | Y0-Y377 |
| 0xA7B8-0xA7C7 | - | X0-X377 |
*1:CN200-255是32位计数器
4.3.3 XT 3U Modbus 的指令使用说明
注意:如果超过 2 个站通信的情况下,请自行在 A 端和 B 端并联一个终端匹配电阻(200 Ω ~1000Ω )
一、IVRD 指令
| IVRD | IVRD | Modbus H03 功能 | IVRD | 16 位 |
|---|---|---|---|---|
| S1 | 站号 | 要读取的 modbus 从站号 | 要读取的 modbus 从站号 | 要读取的 modbus 从站号 |
| S2 | 地址 | 要读取寄存器的首地址 | 要读取寄存器的首地址 | 要读取寄存器的首地址 |
| S3 | 存储地址 | S3 ·要读取的数量 S3 ·+1 保存读取数据的首地址 | S3 ·要读取的数量 S3 ·+1 保存读取数据的首地址 | S3 ·要读取的数量 S3 ·+1 保存读取数据的首地址 |
| n | COM 口选择 | K1 COM1, K2 COM2 | K1 COM1, K2 COM2 | K1 COM1, K2 COM2 |
| 操 作 数 | 位软元件 | 位软元件 | 位软元件 | 位软元件 | 位软元件 | 位软元件 | 位软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 位数指定 | 位数指定 | 位数指定 | 位数指定 | 位数指定 | 变址 | 变址 | 变址 | 常数 | 常数 | 实 数 | 实 数 | |
| S1 | X | Y | M | T | C | S | D.b | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | 修 | K | H | E |
| S2 | X | Y | M | T | C | S | D.b | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | 修 | K | H | E |
| S3 | X | Y | M | T | C | S | D.b | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | 修 | K | H | E |
| S1 | X | Y | M | T | C | S | D.b | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | 修 | K | H | E |
1.先配置成 MODBUS 主站模式如果没有配置主站模式接通了指令将报 3824 错误代码
2.直接由 M8000 驱动IVRD ,PLC 将自动读取
程序举例
只需将对应的配置数据传送到 D8400 即可完成配置
动作说明
1.先配置成 MODBUS 主站模式如果没有配置主站模式接通了指令将报 3824 错误代码
2.直接由 M8000 驱动IVRD ,PLC 将自动读取 1 号站的 K100 这个地址起的 D0 个数据,保存在 D0+1 开始的位置 D1.D2.D3… 根据 D0 的设置值而定
注意:
如果不需要一直接通读取的情况下请按照下面格式编写程序触发读取
M0 接通指令进行通信直到 M8029 指令执行完成再把 M0 复位
请求帧格式:从机地址+0x03+寄存器起始地址+寄存器数量+CRC检验
| 序号 | 数据(字节)意义 | 字节数量 | 说明 |
|---|---|---|---|
| 1 | 从机地址 | 1个字节 | 取值1~247,由D8121设定 |
| 2 | 0x03(功能码) | 1个字节 | 读寄存器 |
| 3 | 寄存器起始地址 | 2个字节 | 高位在前,低位在后,见寄存器编号 |
| 4 | 寄存器数量 | 2个字节 | 高位在前,低位在后(N) |
| 5 | CRC校验 | 2个字节 | 高位在前,低位在后 |
| 序号 | 数据(字节)意义 | 字节数量 | 说明 |
|---|---|---|---|
| 1 | 从机地址 | 1个字节 | 取值1~247,由D8121设定 |
| 2 | 0x03(功能码) | 1个字节 | 读寄存器 |
| 3 | 字节数 | 1个字节 | 值:N*2 |
| 4 | 寄存器值 | N*2个字节 | 每两字节表示一个寄存器值,高位在前低位在后。寄存器地址小的排在前面 |
| 5 | CRC校验 | 2个字节 | 高位在前,低位在后 |
| 相关寄存器位元件 | 相关寄存器位元件 | 说明 |
|---|---|---|
| COM1 | M8063 | 通信出错锁存标志位 |
| M8120 | 通信完成一次标志 | |
| M8121 | 忙碌标志 | |
| M8122 | 辅助错误位/第二错误位 | |
| M8123 | 通信出错标志位 | |
| M8128 | 发生重试标志 | |
| M8129 | 超时标志位 | |
| D8128 | 当前重试次数 | |
| D8129 | 超时时间,以10ms为单位 | |
| D8130 | 指令间隔时间 | |
| D8132 | 允许总重试次数 | |
| D8063 | 通信出错代码 | |
| COM2 | M8438 | 通信出错锁存标志位 |
| M8400 | 通讯完成一次标志 | |
| M8401 | 忙碌标志 | |
| M8402 | 辅助错误位 / 第二错误位 | |
| M8403 | 通信出错标志位 | |
| M8408 | 发生重试标志 | |
| M8409 | 超时标志位 | |
| D8402 | 错误代码 | |
| D8406 | 允许总重试次数 | |
| D8408 | 当前重试次数 | |
| D8409 | 超时时间,以10ms为单位 | |
| D8410 | 指令间隔时间 | |
| D8402 | 通信出错代码 |
错误码在代码里对应关系也很清楚:
205:校验错误
211:超时
212:不支持指令
213:站号不一致
217:未设成主机模式
218:数据格式错误
二、ADPRW 指令
ADPRW 是三菱 FX 系列 PLC(FX3U/FX5U)用于 Modbus 通信的专用读写指令,支持Modbus RTU 主站功能,可实现对从站设备的数据读取与写入操作。
| ADPRW | ADPRW | Modbus 读取写入 | ADPRW | 16 位 |
|---|---|---|---|---|
| S1 · | 通道号+站号 | 通道号+从站站号 | 通道号+从站站号 | 通道号+从站站号 |
| S2 · | 功能代码 | 选择对应的功能码 支持 01,02,03,04,05,06,0F,10,16,17 | 选择对应的功能码 支持 01,02,03,04,05,06,0F,10,16,17 | 选择对应的功能码 支持 01,02,03,04,05,06,0F,10,16,17 |
| S3 · | 参数 1 | 与功能代码对应的参数 | 与功能代码对应的参数 | 与功能代码对应的参数 |
| S4 · | 参数 2 | 与功能代码对应的参数 | 与功能代码对应的参数 | 与功能代码对应的参数 |
| S 5·/ D · | 参数 3 | 与功能代码对应的参数 | 与功能代码对应的参数 | 与功能代码对应的参数 |
| 操 作 数 | 位软元件 | 位软元件 | 位软元件 | 位软元件 | 位软元件 | 位软元件 | 位软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 | 字软元件 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 系统 ·用户 | 位数指定 | 位数指定 | 位数指定 | 位数指定 | 位数指定 | 变址 | 变址 | 变址 | 常数 | 常数 | 实 数 | |
| S1 | X | Y | M | T | C | S | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | K | H | E |
| S2 | X | Y | M | T | C | S | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | K | H | E |
| S3 | X | Y | M | T | C | S | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | K | H | E |
| S4 | X | Y | M | T | C | S | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | K | H | E |
| S5 | X | Y | M | T | C | S | D.b | D | R | T | C | SD | KnX | KnY | KnM | KnS | KnSM | V | Z | 修 | K | H | E |
(1)功能概述
在上升沿触发一次 Modbus 主站访问(读/写)。
- 支持三类通道:
- 串口1
- 串口2
- 以太网(7个SOCKS)
指令自动完成:发送 → 等待应答/重试 → 收尾,跨扫描维持一次“事务”。
(2)操作数格式
第1字: (高8位=通道选择, 低8位=从站号)
第2字: 功能码
第3字: 起始地址
第4字: 数量
第5字: 数据区首地址(读:存放区 / 写:发送数据首地址)
通道选择(第1字高8位):
H00 → 串口2(默认使用串口2)
H01 → 串口1
H04H0B → 对应以太网 socket18
(3) 通道与寄存器/位资源映射
1 串口1 (第1字: 高8位为H01时)如图:
| 编号 | 名称 | 说明 |
|---|---|---|
| M8121 | 执行中(忙) | 通信指令正在执行时为 ON |
| M8120 | 正常完成 | 通信指令正常执行完成时为 ON |
| M8122 | 通讯出错 | 通信指令执行出错时为 ON |
| M8128 | 发生重试 | 通信过程中发生重试时为 ON |
| M8129 | 应答超时 | 通信应答超时时为 ON |
| M8063 | 接通 / 链路类错误指示 | 代码里与 M8122 同时置位,通常用作 “醒目灯”类错误指示 |
| M8029 | 本步指令结束位(所有通道通用) | 指令执行完成(无论成功 / 失败)时为 ON |
| 编号 | 名称 | 说明 |
|---|---|---|
| D8063 | 错误码 | 通信错误代码,对应含义如下:211 = 超时、218 = 数据格式错误、205 = 校验错误、212 = 不支持指令、213 = 站号不一致、217 = 未处于主站模式 |
| D8128 | 本次累计重试次数 | 运行中重试发生时自动 + 1,通信事务结束后清零 |
| D8132 | 允许的最大重试次数 | 设置的重试次数上限 |
| D8130 | 指令间隔时间(毫秒) | 事务结束后的 “最小发送间隔”,即两条指令之间的等待时间 |
| D8129 | 超时标志显示用阈值 | 代码里做了 D8129>=9 的下限保护,用于超时判断 |
2 串口2 (第1字: 高8位为H00时)
| 编号 | 类型 | 名称 | 说明 |
|---|---|---|---|
| M8401 | 过程位 (M) | 执行中(忙) | 通信指令正在执行时为 ON |
| M8400 | 过程位 (M) | 正常完成 | 通信指令正常执行完成时为 ON |
| M8402 | 过程位 (M) | 通讯出错 | 通信指令执行出错时为 ON |
| M8408 | 过程位 (M) | 发生重试 | 通信过程中发生重试时为 ON |
| M8409 | 过程位 (M) | 应答超时 | 通信应答超时时为 ON |
| M8403 | 过程位 (M) | 接通 / 链路类错误指示(显示灯) | 用于链路错误的指示灯指示 |
| M8029 | 过程位 (M) | 指令结束 | 指令执行完成(无论成功 / 失败)时为 ON |
| D8402 | 数据寄存器 | 错误码(编码同上) | 通信错误代码,与之前的错误码含义一致(211 = 超时、218 = 数据格式错误等) |
| D8408 | 数据寄存器 | 本次累计重试次数 | 运行中重试发生时自动 + 1,通信事务结束后清零 |
| D8406 | 数据寄存器 | 允许的最大重试次数 | 设定的重试次数上限 |
| D8410 | 数据寄存器 | 指令间隔时间(毫秒) | 事务结束后的 “最小发送间隔”,即两条指令之间的等待时间 |
| D8409 | 数据寄存器 | 超时标志显示用阈值 | 代码中做了 D8409>=9 的下限保护,用于超时判断 |
3 以太网(第1字: 高8位为H04H0B 对于socket18)
| 编号 | 类型 | 名称 | 说明 |
|---|---|---|---|
| M8421 | 过程位 (M) | 执行中(忙) | 通信指令正在执行时为 ON |
| M8420 | 过程位 (M) | 正常完成 | 通信指令正常执行完成时为 ON |
| M8422 | 过程位 (M) | 通讯出错 | 通信指令执行出错时为 ON |
| M8428 | 过程位 (M) | 发生重试 | 通信过程中发生重试时为 ON |
| M8429 | 过程位 (M) | 应答超时 | 通信应答超时时为 ON |
| M8423 | 过程位 (M) | 接通 / 链路类错误指示 | 用于链路错误的指示灯指示 |
| M8029 | 过程位 (M) | 指令结束 | 指令执行完成(无论成功 / 失败)时为 ON |
| D8422 | 数据寄存器 | 错误码(编码同上) | 通信错误代码,含义与前面的错误码一致(211 = 超时、218 = 数据格式错误等) |
| D8428 | 数据寄存器 | 本次累计重试次数 | 运行中重试发生时自动 + 1,通信事务结束后清零 |
| D8426 | 数据寄存器 | 允许的最大重试次数 | 设定的重试次数上限 |
| D8430 | 数据寄存器 | 指令间隔时间(毫秒) | 事务结束后的 “最小发送间隔”,两条指令之间的等待时间,需大于响应超时时间 |
| D8425 | 数据寄存器 | 响应超时(毫秒) | 通信响应超时的设定时间(注意:指令间隔时间必须大于响应超时) |
4.3.4 MODBUS RTU 主从配置说明
一、主站配置
通过软件进行串口配置,根据通讯地址表进行配置主站,可以新增多条轮询,也可以轮询不同站号,具体情况根据自身需求配置,我这里配置的是写1号站的从机H0地址,主机M0映射从机H0地址开始10位,第二个为读寄存器,从从机H0地址读到主机D0地址开始10个寄存器,第三个为写寄存器,从主机地址D10开始10个寄存器写入从机地址H000F地址。
根据通讯地址表可以得出线圈H0地址为从机M0,寄存器H0地址为从机D0,写寄存器H000F地址为从机D10地址
打开GX Works2 新建工程,配置如下:
使用PLC串口连接电脑,端口为COM19
测试通讯
编写如下,写入常开M8000保存始终导通,在右上角点击ST
在ST表格中把刚刚在软件上配置好的程序复制到里面来,如图
进行程序编译,编译好即可
下载程序
主从站485接线如图
主站配置完成。
二、从站配置操作
从站配置,其他操作跟主站一样,新建一个程序并把生成好的程序复制到ST中,再写入到做从站的PLC中,这里就不繁琐的去做同一个操作了。
之前设置的配置:主站M0-M9写线圈到从站为M0-M9,主站D0-D9读从站寄存器为D0-D9,主站D10-D19写寄存器到从站为D10-D19。
先测试第一个写线圈
改变主站M0状态再看从站M0状态是否同步
打开从站程序也是一样的监视M0