1. 项目背景与硬件选型
在工业自动化控制领域,三菱FX3U系列PLC因其高性价比和稳定性能,成为中小型自动化项目的首选控制器。而变频器作为电机调速的核心设备,其与PLC的可靠通讯是实现复杂控制逻辑的基础。本项目中,我们需要实现FX3U与两台三菱变频器通过Modbus RTU协议进行数据交互,这在实际工程中具有典型代表性。
硬件配置方面,FX3U本体需要通过扩展485通信模块(如FX3U-485BD或FX3U-485ADP-MB)实现物理连接。这两种模块的主要区别在于:
- 485BD是基础型通信板,需要用户自行编写完整的Modbus协议栈
- 485ADP-MB是专用模块,内置Modbus协议处理功能
考虑到项目需要实现CRC校验等底层协议处理,本文选择使用485BD模块进行开发,这样可以更全面地展示Modbus RTU通讯的实现细节。变频器端以三菱FR-D700系列为例,其Modbus RTU通讯参数默认设置为:
- 波特率:19200bps
- 数据位:8位
- 停止位:1位
- 无奇偶校验
- 站号通过参数Pr.117-Pr.124设置
2. 通信硬件连接与配置
2.1 物理接线规范
RS485通信的可靠性很大程度上取决于硬件接线的正确性。FX3U-485BD模块的接线端子定义如下:
- SDA:信号线A(正极)
- SDB:信号线B(负极)
- RDA:接收端A
- RDB:接收端B
- SG:信号地
正确接线方式应为:
- 将PLC的SDA与所有变频器的SDA并联
- PLC的SDB与所有变频器的SDB并联
- SG端子必须与各变频器的接地端子可靠连接
- 总线两端需加装120Ω终端电阻
注意:实际布线时应使用双绞屏蔽线,屏蔽层单端接地。通信距离超过50米时,建议增加485中继器。
2.2 变频器参数设置
每台变频器需要设置以下关键参数:
- Pr.117:站号(1-247),两台变频器需设置不同站号
- Pr.118:通信速率(19200对应值"8")
- Pr.119:停止位/数据位(8N1对应值"10")
- Pr.120:通信校验设置(无校验对应值"2")
- Pr.121:通信超时(建议设置1000ms)
- Pr.122:通信等待时间(通常设0ms)
- Pr.123:通信重试次数(建议3次)
设置完成后需断电重启变频器使参数生效。可通过操作面板确认参数是否设置成功。
3. Modbus RTU协议帧结构解析
3.1 标准协议格式
Modbus RTU协议帧由以下部分组成:
- 站号地址:1字节(0x01-0xF7)
- 功能码:1字节(常用0x03读保持寄存器)
- 数据区:N字节(根据功能码变化)
- CRC校验:2字节(低字节在前)
以读取变频器输出频率(地址0x0002)为例,完整请求帧为:
code复制[站号][0x03][0x00][0x02][0x00][0x01][CRC低][CRC高]
3.2 三菱变频器专用地址映射
三菱变频器的Modbus寄存器地址与功能参数对应关系如下:
- 0x0000:输出频率(只读)
- 0x0001:输出电流(只读)
- 0x0002:输出电压(只读)
- 0x2000:运行频率指令(读写)
- 0x2001:运行指令(读写)
写入运行指令时,数据格式为:
- 0x0001:正转启动
- 0x0002:反转启动
- 0x0000:停止
4. CRC校验算法实现
4.1 CRC计算原理
Modbus RTU使用CRC-16校验,多项式为0xA001。计算步骤如下:
- 初始化CRC寄存器为0xFFFF
- 对每个数据字节进行异或操作
- 右移1位,若移出位为1则与多项式异或
- 重复步骤3共8次
- 处理完所有数据后,CRC寄存器值即为校验码
4.2 FX3U梯形图实现
在GX Works2中创建CRC计算功能块:
code复制// CRC计算子程序
LD M8000
MOV K65535 D100 // 初始化CRC寄存器
MOV K0 D101 // 字节计数器
FOR循环开始:
LD SM400
CMP D101 K8 // 检查是否处理完8位
JMP>= 结束处理
LD SM400
AND D100 K1 // 检查LSB
MPS
SHR D100 K1 // 右移1位
MPP
ANI M0
JMP 不进行异或
LD SM400
XOR H8000 D100 // 与多项式异或
不进行异或:
INC D101 // 计数器加1
JMP FOR循环开始
结束处理:
MOV D100 D102 // 保存CRC结果
4.3 实际应用示例
假设要发送的数据存储在D0-D5中,CRC结果存储在D6-D7:
code复制// 准备发送数据
MOV H1 D0 // 站号1
MOV H3 D1 // 功能码03
MOV H0 D2 // 地址高字节
MOV H2 D3 // 地址低字节
MOV H0 D4 // 数量高字节
MOV H1 D5 // 数量低字节
// 调用CRC计算
CALL P0 // CRC计算子程序
MOV D100 D6 // 存储CRC低字节
MOV D101 D7 // 存储CRC高字节
5. 完整通信程序实现
5.1 通信初始化
首先需要设置485BD模块的通信参数:
code复制MOV H0C96 D8120 // 通信格式设置
// 数据位8位,停止位1位,无校验
// 波特率19200(0C96H)
MOV K1 D8121 // 站号设置(PLC自身站号)
MOV K100 D8129 // 超时设置100ms
5.2 轮询通信逻辑
采用状态机方式实现两台变频器的轮询控制:
code复制// 主通信控制程序
LD M8000
MOV K0 D100 // 状态寄存器
// 状态0:准备读取变频器1数据
LD D100 K0
MOV K1 D0 // 站号1
MOV H3 D1 // 功能码03
MOV H0 D2 // 地址高字节
MOV H0 D3 // 地址低字节(频率地址)
MOV H0 D4 // 数量高字节
MOV H1 D5 // 数量低字节
CALL P0 // 计算CRC
MOV K1 D100 // 切换到发送状态
RS D0 K8 D200 K10 // 发送请求帧
// 状态1:等待变频器1响应
LD D100 K1
AND M8122 // 接收完成标志
MOV K2 D100 // 切换到处理状态
MOV D200 D300 // 存储响应数据
// 状态2:处理变频器1数据
LD D100 K2
MOV D303 D10 // 存储频率值
MOV K3 D100 // 准备下一台
// 状态3:准备读取变频器2数据
LD D100 K3
MOV K2 D0 // 站号2
...(类似变频器1的处理)
5.3 错误处理机制
完善的通信程序需要包含超时和错误处理:
code复制// 超时监控
LD M8129 // 超时标志
SET M100 // 置位错误标志
RST M8129 // 清除超时标志
// CRC校验
LD SM400
CALL P1 // 校验接收数据CRC
AND M100 // 校验失败标志
SET M101 // 置位CRC错误标志
// 重试机制
LD M100
OR M101
INC D110 // 错误计数器加1
CMP D110 K3 // 检查重试次数
JMP< 重试通信
SET M102 // 置位通信失败标志
6. 调试技巧与常见问题
6.1 调试工具推荐
- USB转485适配器:可用PC监控通信数据
- Modbus Poll/Modbus Slave:协议分析工具
- 三菱FR Configurator:变频器参数设置工具
6.2 典型故障排查
-
通信无响应:
- 检查终端电阻是否安装
- 确认站号设置是否正确
- 验证波特率等参数一致性
-
CRC校验失败:
- 检查CRC计算程序是否正确
- 确认接收数据是否完整
- 排查电磁干扰问题
-
数据异常:
- 检查寄存器地址映射
- 确认数据字节顺序
- 验证变频器实际状态
6.3 性能优化建议
- 合理设置通信超时(通常100-500ms)
- 采用分时轮询策略,避免同时访问
- 关键数据可设置双缓存机制
- 重要参数增加变化触发读取机制
在实际项目中,我们通常会遇到信号干扰导致通信不稳定的情况。我的经验是,在软件上增加重试机制的同时,硬件方面一定要做好接地处理。曾有一个项目因为变频器接地不良,导致通信成功率只有60%左右,后来重新处理接地后,通信稳定性立即提升到99.9%以上。
