1. 项目概述:三菱FX3U ST语言实战案例解析
这个基于三菱FX3U PLC的工业控制项目,是我去年为某包装生产线做的自动化改造方案。整套系统包含传送带速度控制、急停安全联锁、Modbus RTU设备组网三大核心模块,特别适合作为ST结构化文本语言的进阶学习案例。项目最大的亮点是完整保留了所有工程文件:从PLC的ST源码到威纶通触摸屏程序,从电气接线图到工艺流程图,甚至包含了485通信调试的抓包数据。
与市面上常见的教学demo不同,这个项目真实经历了现场调试的考验。系统采用了FX3U-485ADP-MB模块实现与4台变频器的Modbus通信,在解决通信干扰、数据转换、协议兼容等实际问题上积累了大量实战经验。对于习惯了梯形图的工程师来说,这个项目能让你直观感受到ST语言在处理复杂逻辑、数学运算和数据结构方面的优势。
2. 硬件架构与通信配置
2.1 硬件组成清单
整套系统的硬件核心是FX3U-32MT/ES-A PLC,搭配了以下关键模块:
- FX3U-485ADP-MB:Modbus RTU主站模块,波特率19200bps
- WT07F-1SV威纶通7寸触摸屏
- 4台安川GA700变频器(从站地址1~4)
- 急停按钮回路(双回路硬线连接)
- 增量型编码器(2000PPR)用于速度反馈
特别要注意的是485通信线的选型。我们最终选用的是Belden 9842双绞屏蔽电缆,屏蔽层采用PLC端单点接地方式。这个细节在项目图纸的右下角有特别标注,很多工程师容易忽略这一点导致通信干扰。
2.2 Modbus RTU通信配置详解
485ADP-MB模块的初始化代码看似简单,实则暗藏玄机:
st复制MBMaster_Config(
CH:=1, // 必须设为1(固定通道)
Baud:=19200, // 需与变频器严格一致
DataBit:=8, // 安川变频器固定为8位
Parity:=2, // 0-无 1-奇 2-偶
StopBit:=0, // 0-1位 1-2位
ResponseTimeout:=500 // 超时建议300-1000ms
);
调试时发现三个关键点:
- 参数修改后必须断电重启才能生效,这个在官方手册里用小字标注
- 三菱的Modbus实现会在功能码前自动添加从站地址,与标准协议有差异
- CRC校验在某些特定数据长度下存在固件bug(可通过升级解决)
3. ST语言核心逻辑实现
3.1 传送带速度斜坡控制
项目中的核心控制算法是传送带加速曲线控制,ST实现比梯形图简洁得多:
st复制VAR
CurrentSpeed : REAL := 0.0; // 当前速度(m/min)
TargetSpeed : REAL := 60.0; // 目标速度
RampTime : TIME := T#5S; // 加速时间
Acceleration : REAL; // 计算加速度
END_VAR
// 斜坡生成(关键算法)
IF StartSignal THEN
CurrentSpeed := REAL_TO_TIME(RAMP(
REAL_TO_LREAL(CurrentSpeed),
REAL_TO_LREAL(TargetSpeed),
TIME_TO_LREAL(RampTime)
));
// 计算实时加速度(用于监控)
Acceleration := (TargetSpeed - CurrentSpeed) / TIME_TO_REAL(RampTime);
END_IF;
注意:RAMP函数的输入输出需要LREAL类型,因此必须进行类型转换。这是ST编程中常见的精度陷阱。
3.2 急停安全联锁设计
安全回路采用ST的CASE语句实现多条件判断,比梯形图的支路更清晰:
st复制CASE EmergencyStop OF
0: // 正常状态
Motor_Run := AutoMode OR ManualMode;
FaultCode := 16#00;
1: // 急停触发
Motor_Run := FALSE;
FaultCode := 16#FF; // 三菱习惯用十六进制
EmergencyStopTimer(IN:=TRUE);
ELSE
Motor_Run := FALSE;
FaultCode := 16#80; // 状态异常
END_CASE;
// 急停后延时复位逻辑
IF EmergencyStopTimer.Q THEN
EmergencyStop := 0;
EmergencyStopTimer(IN:=FALSE);
END_IF;
4. 触摸屏与PLC数据交互
4.1 变量绑定与数据转换
触摸屏显示速度时需要进行特殊处理:
st复制// HMI显示处理(10倍放大转整数)
HMI_Speed_Display := REAL_TO_INT(CurrentSpeed * 10.0);
// HMI速度设定(需限制范围)
IF HMI_Speed_Set <> LastSpeedSet THEN
TargetSpeed := LIMIT(10.0, INT_TO_REAL(HMI_Speed_Set)/10.0, 100.0);
LastSpeedSet := HMI_Speed_Set;
END_IF;
调试发现两个重要经验:
- 威纶通触摸屏的数值输入控件默认只支持整数
- 刷新周期建议设为200ms以上,避免485总线过载
4.2 报警历史记录实现
通过ST的结构体数组实现报警日志功能:
st复制TYPE AlarmRecord :
STRUCT
Code : WORD;
Time : DT;
Message : STRING[30];
END_STRUCT
END_TYPE
VAR
AlarmHistory : ARRAY[1..50] OF AlarmRecord;
AlarmIndex : INT := 0;
END_VAR
// 报警记录函数
METHOD LogAlarm : BOOL
VAR_INPUT
code : WORD;
msg : STRING[30];
END_VAR
VAR
tempDT : DT;
END_VAR
IF AlarmIndex < 50 THEN
AlarmIndex := AlarmIndex + 1;
tempDT := TOD#DT#();
AlarmHistory[AlarmIndex].Code := code;
AlarmHistory[AlarmIndex].Time := tempDT;
AlarmHistory[AlarmIndex].Message := msg;
RETURN TRUE;
END_IF;
RETURN FALSE;
END_METHOD
5. 工程调试经验实录
5.1 485通信干扰排查
现场遇到的典型通信问题及解决方案:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 随机误码 | 屏蔽层两端接地形成地环路 | 改为PLC端单点接地 |
| 周期性丢包 | 波特率偏差超过2% | 使用信号发生器校准时钟 |
| 从站无响应 | 终端电阻未配置 | 在末端从站加120Ω电阻 |
5.2 ST编程性能优化
发现FX3U对ST程序的特殊限制:
- 函数块递归调用深度不超过8层
- 数组索引越界不会报错但会导致异常
- 结构体嵌套超过3级可能编译失败
优化后的电机控制实现:
st复制// 电机控制函数块
FUNCTION_BLOCK MotorControl
VAR_INPUT
SetSpeed : REAL;
Enable : BOOL;
END_VAR
VAR_OUTPUT
ActualSpeed : REAL;
Status : WORD;
END_VAR
VAR
InternalTimer : TON;
END_VAR
// 核心控制逻辑
IF Enable THEN
ActualSpeed := RAMP(ActualSpeed, SetSpeed, T#2S);
InternalTimer(IN:=TRUE);
ELSE
ActualSpeed := 0.0;
InternalTimer(IN:=FALSE);
END_IF;
// 状态监测
Status := 16#0001; // 运行状态位
IF InternalTimer.Q THEN
Status.1 := TRUE; // 超时标志
END_IF;
END_FUNCTION_BLOCK
6. 项目文件使用指南
工程包包含以下关键文件:
/PLC:GX Works2工程(含ST源码)MainProgram.st:主逻辑程序Modbus_Comm.fbd:通信配置
/HMI:威纶通触摸屏工程MainScreen.eph:主界面AlarmLog.eph:报警记录
/Documents:WiringDiagram.pdf:接线图(含接地说明)ProcessFlow.pdf:工艺流程图
重要提示:
- 使用前需检查GX Works2版本(建议2.0以上)
- 触摸屏程序需根据实际型号重新编译
- 所有注释中的"WARNING"标记必须仔细阅读
这套工程最值得研究的其实是那些调试过程中添加的注释。比如在Modbus初始化程序上方就有这样的警告:
st复制// WARNING! 以下参数修改后必须:
// 1. 关闭PLC电源
// 2. 等待5秒以上
// 3. 重新上电
// 热修改无效!会导致通信异常!
这些用实际故障换来的经验,才是这个项目最大的价值所在。
