1. 项目概述
在工业自动化控制系统中,PLC与变频器的通讯是实现电机精准控制的关键环节。今天我要分享的是一个基于三菱FX3U PLC通过FB(功能块)方式与四台三菱E700变频器进行RS485通讯的完整解决方案。这个方案不仅实现了基本的启停控制和频率设定,还能实时读取变频器的运行参数,为设备监控和故障诊断提供了数据基础。
这个项目的核心价值在于采用了模块化的FB编程方式,使得程序结构清晰、易于维护和扩展。相比传统的梯形图编程,FB方式可以显著提高代码复用率,特别是在控制多台同类型设备时,优势更加明显。我在实际项目中多次采用这种架构,发现它能将开发效率提升40%以上,同时降低后期维护难度。
2. 硬件配置与接线
2.1 硬件选型要点
选择硬件时需要考虑以下几个关键因素:
-
PLC选型:必须使用FX3U/FX3S/FX3G系列PLC,且固件版本需在1.1以上。这是因为早期版本可能不支持某些通讯指令或功能块特性。我在一个项目中曾因忽略版本问题导致通讯异常,后来通过升级固件才解决。
-
通讯扩展板:必须使用原装485BD通讯扩展板。市面上有些兼容板虽然价格便宜,但在稳定性方面往往不尽如人意。根据我的经验,原装板在工业现场的抗干扰能力明显优于第三方产品。
-
变频器兼容性:支持三菱专用协议的变频器系列包括E500、E700、D700、S500等。需要注意的是,不同系列的参数地址可能略有差异,在编写程序时要参考对应型号的技术手册。
2.2 接线规范与注意事项
正确的接线是保证通讯稳定的基础,以下是详细的接线步骤和注意事项:
-
PLC端接线:
- 将485BD扩展板牢固安装在FX3U的扩展槽上
- 接线端子定义:
- SDA+:发送数据正极
- SDB-:发送数据负极
- SG:信号地
-
变频器端接线:
- 每台E700变频器的通讯接口定义:
- RDA+:接收数据正极
- RDB-:接收数据负极
- SG:信号地
- 每台E700变频器的通讯接口定义:
-
网络拓扑连接:
- 采用总线型拓扑结构,将所有设备并联
- 具体接法:
- 将PLC的SDA+与所有变频器的RDA+并联
- 将PLC的SDB-与所有变频器的RDB-并联
- 将所有设备的SG端子连接在一起
重要提示:RS485网络必须在两端加装120Ω终端电阻,否则在长距离通讯时可能出现信号反射导致通讯失败。我在一个30米长的现场就遇到过这个问题,添加终端电阻后通讯立即恢复正常。
3. 参数配置详解
3.1 变频器参数设置
变频器的参数设置是项目成功的关键,以下是必须设置的参数及其作用:
| 参数编号 | 参数名称 | 设定值 | 说明 |
|---|---|---|---|
| Pr.79 | 运行模式选择 | 2 | 设置为外部运行模式,接受来自PLC的控制信号 |
| Pr.117 | 站号设置 | 0-3 | 为四台变频器分别设置不同的站号(0,1,2,3) |
| Pr.118 | 通讯速率 | 96 | 对应9600bps波特率 |
| Pr.119 | 停止位长 | 0 | 1位停止位 |
| Pr.120 | 奇偶校验 | 0 | 无校验 |
| Pr.121 | 通讯重试次数 | 3 | 通讯失败时的重试次数 |
| Pr.122 | 通讯校验时间 | 9999 | 通讯超时时间设置 |
| Pr.338 | 通讯速率选择 | 0 | 9600bps |
| Pr.1 | 上限频率 | 50.0 | 根据电机额定频率设置 |
| Pr.2 | 下限频率 | 0.5 | 防止电机在过低频率下运行 |
在实际调试中,我发现Pr.122(通讯校验时间)的设置尤为重要。在干扰较大的环境中,建议将此值适当增大,否则可能会出现偶发的通讯超时故障。
3.2 PLC参数设置
在GX Works2中配置PLC的通讯参数:
- 打开工程参数设置对话框
- 选择"PLC参数"→"通讯设置"
- 设置以下参数:
- 通讯协议:专用通讯协议
- 通讯速率:9600bps
- 数据位:7位
- 停止位:1位
- 校验方式:无校验
- 站号:0(PLC作为主站)
需要注意的是,PLC的通讯参数必须与变频器完全一致,否则无法建立通讯连接。我建议在完成设置后,先通过GX Works2的通讯测试功能验证参数是否正确。
4. FB功能块设计与实现
4.1 功能块接口定义
采用FB方式编程的核心是设计合理的功能块接口。经过多次项目实践,我总结出以下最优接口设计方案:
st复制FUNCTION_BLOCK Freq_Control
VAR_INPUT
Station_No : BYTE; (* 变频器站号 *)
Run_Stop : BOOL; (* 运行/停止控制 *)
Forward_Reverse : BOOL;(* 正转/反转控制 *)
Set_Freq : REAL; (* 设定频率 Hz *)
Param_Read_Req : BOOL; (* 参数读取请求 *)
Param_Write_Req : BOOL;(* 参数写入请求 *)
Param_No : WORD; (* 参数编号 *)
Param_Value : REAL; (* 参数值 *)
END_VAR
VAR_OUTPUT
Running_Ind : BOOL; (* 运行指示 *)
Freq_Reached_Ind : BOOL;(* 频率到达指示 *)
Real_Freq : REAL; (* 实际频率 Hz *)
Real_Current : REAL; (* 实际电流 A *)
Real_Voltage : REAL; (* 实际电压 V *)
Param_Read_Value : REAL;(* 读取的参数值 *)
Comm_Error : BOOL; (* 通讯错误标志 *)
END_VAR
VAR
// 内部变量声明
Send_Buffer : ARRAY[0..7] OF BYTE;
Recv_Buffer : ARRAY[0..15] OF BYTE;
Comm_Timeout : TON;
// 其他内部变量...
END_VAR
这个接口设计考虑了控制、监测和参数读写三大功能,可以满足大多数应用场景的需求。在实际项目中,可以根据具体需求进一步扩展。
4.2 核心逻辑实现
功能块的核心逻辑主要包括频率设定、运行控制和数据读取三部分:
- 频率设定逻辑:
st复制// 频率设定值处理
IF Set_Freq <> Last_Set_Freq THEN
// 将实数频率值转换为变频器接受的整数格式
Temp_Freq := INT(Set_Freq * 100);
// 构造频率设定指令帧
Send_Buffer[0] := 16#06; // 写入指令
Send_Buffer[1] := Station_No;
Send_Buffer[2] := 16#ED; // 频率设定命令
Send_Buffer[3] := INT_TO_BYTE(Temp_Freq SHR 8);
Send_Buffer[4] := INT_TO_BYTE(Temp_Freq AND 16#FF);
// 计算校验和
Send_Buffer[5] := Calc_Checksum(Send_Buffer, 5);
// 发送指令
RS(Send_Buffer, 6, Recv_Buffer, 2);
Last_Set_Freq := Set_Freq;
END_IF
- 运行控制逻辑:
st复制// 运行/停止控制
IF Run_Stop THEN
IF Forward_Reverse THEN
// 正转指令
Send_Buffer[0] := 16#05;
Send_Buffer[1] := Station_No;
Send_Buffer[2] := 16#FA;
Send_Buffer[3] := 16#02;
ELSE
// 反转指令
Send_Buffer[0] := 16#05;
Send_Buffer[1] := Station_No;
Send_Buffer[2] := 16#FA;
Send_Buffer[3] := 16#04;
END_IF
ELSE
// 停止指令
Send_Buffer[0] := 16#05;
Send_Buffer[1] := Station_No;
Send_Buffer[2] := 16#FA;
Send_Buffer[3] := 16#00;
END_IF
// 计算校验和并发送
Send_Buffer[4] := Calc_Checksum(Send_Buffer, 4);
RS(Send_Buffer, 5, Recv_Buffer, 2);
- 数据读取逻辑:
st复制// 定时读取运行数据
IF Data_Read_Timer.Q THEN
// 读取输出频率
Send_Buffer[0] := 16#03;
Send_Buffer[1] := Station_No;
Send_Buffer[2] := 16#6F;
Send_Buffer[3] := 16#00;
Send_Buffer[4] := Calc_Checksum(Send_Buffer, 4);
RS(Send_Buffer, 5, Recv_Buffer, 7);
IF Recv_Buffer[0] = Station_No THEN
// 解析频率值
Temp := (BYTE_TO_INT(Recv_Buffer[3]) SHL 8) OR BYTE_TO_INT(Recv_Buffer[4]);
Real_Freq := INT_TO_REAL(Temp) / 100.0;
END_IF
// 类似方式读取电流、电压等参数
...
END_IF
在实际应用中,我建议将不同功能的指令发送间隔错开,避免同时发送多个指令导致通讯拥堵。通常可以设置一个状态机,轮流发送不同类型的指令。
5. 主程序设计与多变频器控制
5.1 功能块实例化与调用
在主程序中,我们需要为每台变频器创建一个功能块实例,并分别调用:
st复制// 变频器1控制
Freq_Control_1(
Station_No := 0,
Run_Stop := M10,
Forward_Reverse := M11,
Set_Freq := D10,
Running_Ind => M20,
Freq_Reached_Ind => M21,
Real_Freq => D20,
Real_Current => D21,
Real_Voltage => D22
);
// 变频器2控制
Freq_Control_2(
Station_No := 1,
Run_Stop := M12,
Forward_Reverse := M13,
Set_Freq := D11,
Running_Ind => M22,
Freq_Reached_Ind => M23,
Real_Freq => D23,
Real_Current => D24,
Real_Voltage => D25
);
// 变频器3和4类似...
这种架构的最大优势是扩展性强。如果需要增加第五台变频器,只需再实例化一个功能块并设置正确的站号即可,无需修改其他代码。
5.2 通讯时序优化
在多台变频器通讯时,合理的时序安排可以显著提高通讯效率:
-
分时通讯策略:不要同时向所有变频器发送指令,而是采用轮询方式,每个扫描周期只与一台变频器通讯。
-
优先级设置:将控制指令(如启停、频率设定)设置为高优先级,数据读取设置为低优先级。这样可以确保控制指令得到及时响应。
-
超时处理机制:为每个通讯操作设置合理的超时时间,超时后自动重试或报错。我在功能块中通常使用TON定时器实现这一功能。
st复制// 超时处理示例
Comm_Timeout(IN:=Comm_Busy, PT:=T#500ms);
IF Comm_Timeout.Q THEN
Comm_Error := TRUE;
Comm_Busy := FALSE;
END_IF
6. 触摸屏界面设计
6.1 界面布局建议
基于多年的HMI设计经验,我推荐采用以下界面布局方案:
-
主监控界面:
- 顶部:系统状态栏(显示时间、报警信息等)
- 中部:四台变频器的运行状态区域(平铺显示)
- 底部:导航按钮和系统控制按钮
-
单台变频器控制面板:
- 运行/停止按钮(带状态指示灯)
- 正转/反转选择开关
- 频率设定输入框(带数字键盘弹出)
- 实时数据显示区域(频率、电流、电压的数值显示和趋势图)
- 参数读写区域(高级功能,可折叠)
6.2 关键元件关联示例
以GT Designer3为例,说明如何关联PLC变量:
-
频率设定输入框:
- 元件类型:数值输入
- 设备类型:D(数据寄存器)
- 设备号:10(对应变频器1的设定频率)
- 格式:浮点数,小数点后1位
- 范围限制:0.5-50.0Hz
-
运行指示灯:
- 元件类型:指示灯
- 设备类型:M(辅助继电器)
- 设备号:20(对应变频器1的运行状态)
- 颜色设置:绿色=ON,灰色=OFF
-
实时频率显示:
- 元件类型:数值显示
- 设备类型:D
- 设备号:20
- 格式:浮点数,单位"Hz"
在实际项目中,我习惯为每台变频器创建一个画面模板,然后通过复制和修改设备地址快速创建其他变频器的控制界面,这可以大大提高开发效率。
7. 调试技巧与故障排除
7.1 常见问题及解决方案
根据我的现场经验,以下是几个最常见的问题及其解决方法:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通讯完全无响应 | 接线错误 | 检查SDA/SDB是否接反,SG是否共地 |
| 部分变频器无响应 | 站号设置错误 | 确认每台变频器的Pr.117设置唯一 |
| 通讯时断时续 | 终端电阻未接 | 在总线两端接入120Ω终端电阻 |
| 数据错误 | 波特率不一致 | 检查PLC和变频器的通讯速率设置 |
| 偶发通讯失败 | 环境干扰 | 使用屏蔽双绞线,确保屏蔽层单端接地 |
7.2 调试步骤建议
我通常按照以下步骤进行系统调试:
- 单机测试:先只连接一台变频器,验证基本通讯功能
- 参数读写测试:尝试读取和写入几个简单参数,确认数据格式正确
- 控制功能测试:测试启停、正反转和频率设定功能
- 多机测试:逐步增加变频器数量,观察系统稳定性
- 长时间运行测试:连续运行24小时,监测通讯错误率
专业建议:在调试阶段,可以在程序中添加通讯错误计数器,记录各种错误发生的次数和类型,这对分析偶发性问题非常有帮助。
8. 项目优化与扩展
8.1 性能优化建议
对于要求更高的应用场景,可以考虑以下优化措施:
-
通讯协议优化:
- 将多个读取请求合并为一个复合指令
- 采用异步通讯方式,避免等待响应造成的延迟
-
程序结构优化:
- 将功能块进一步拆分为更小的功能单元
- 使用面向对象的思想设计变频器控制类
-
硬件优化:
- 使用FX3U-485ADP模块代替485BD,支持更高的通讯速率
- 考虑使用光纤转换器提高长距离通讯的抗干扰能力
8.2 功能扩展思路
基于这个框架,可以轻松扩展更多实用功能:
-
报警处理功能:
- 增加变频器故障状态读取
- 实现故障历史记录和报警推送
-
能耗监测:
- 增加功率和电能计算功能
- 实现能耗统计和报表生成
-
高级控制功能:
- 实现PID闭环控制
- 增加速度同步控制功能
在实际项目中,我曾基于这个框架开发了一个包含12台变频控制的系统,通过合理的程序架构和优化,系统运行稳定,完全满足了客户的自动化生产需求。