1. 项目背景与核心价值
三菱FX3G系列PLC与GS2110触摸屏的组合在中小型自动化项目中非常常见,而JE伺服则是三菱针对中国市场推出的高性价比伺服驱动系统。这套组合在包装机械、小型产线、检测设备等领域有着广泛应用。
传统梯形图编程方式在面对复杂控制逻辑时,往往会出现程序臃肿、维护困难的问题。而采用结构化编程(ST语言+FB功能块)配合标签化编程,能够显著提升以下方面:
- 程序可读性:通过有意义的标签名替代直接地址(如D100、M200等)
- 代码复用率:标准功能块(FB)可重复调用
- 调试效率:结构体可打包相关变量
- 系统扩展性:新增功能只需添加对应FB实例
这套方法尤其适合以下场景:
- 多轴同步控制(如XY平台)
- 需要频繁修改参数的工艺控制
- 设备功能模块化程度高的项目
- 需要与上位机(如MES系统)进行数据交互的场合
提示:虽然FX3G属于小型PLC,但其支持的结构化编程功能经常被低估。合理利用这些特性,可以让小型PLC发挥出接近中型PLC的开发效率。
2. 硬件配置与软件环境搭建
2.1 硬件连接拓扑
code复制FX3G-40MT/ES + GS2110-WTBD
│
├── JE-20A伺服驱动器 ── J4-JE伺服电机
└── 扩展模块(如FX3G-4AD)
2.2 软件准备清单
- GX Works2(建议Version 1.91以上)
- GT Designer3(用于HMI画面设计)
- MR Configurator2(伺服参数配置)
2.3 工程创建关键设置
-
在GX Works2中新建项目时:
- 选择"结构化工程"而非"简单工程"
- PLC系列选择"FXCPU"
- 机型选择"FX3G/FX3U"
- 编程语言勾选"梯形图"和"ST"
-
标签设置建议:
javascript复制// 全局标签示例 VAR_GLOBAL {attribute 'controller_tag'} stAxisX : STRUCT // X轴结构体 bHomeDone : BOOL; // 原点回归完成 rCurrentPos : REAL; // 当前位置 iErrorCode : INT; // 错误代码 END_STRUCT; {attribute 'hmi_link'} rSetSpeed : REAL; // HMI可访问的速度设定值 END_VAR -
伺服参数初始化:
- 通过MR Configurator2设置基本参数:
- PA01: 控制模式(位置/速度/转矩)
- PA05: 电子齿轮比
- PD01: 位置环增益
- 导出参数为.csv文件,可在程序中通过FB批量写入
- 通过MR Configurator2设置基本参数:
3. 结构化编程核心实现
3.1 FB功能块设计规范
以伺服控制FB为例:
pascal复制FUNCTION_BLOCK FB_ServoControl
VAR_INPUT
bEnable : BOOL; // 使能信号
rTargetPos : REAL; // 目标位置
rSpeed : REAL := 100.0; // 默认速度
END_VAR
VAR_OUTPUT
bReady : BOOL; // 准备就绪
bBusy : BOOL; // 运行中
rActualPos : REAL; // 实际位置
END_VAR
VAR
iState : INT := 0; // 状态机变量
tTimer : TON; // 定时器
END_VAR
// 状态机实现
CASE iState OF
0: // 待机状态
IF bEnable THEN
iState := 10;
END_IF
10: // 启动运动
PLSV rSpeed; // 脉冲输出指令
iState := 20;
20: // 运动监控
IF 实际位置到达 THEN
iState := 0;
ELSIF tTimer.Q THEN
// 超时处理
iState := 99;
END_IF
99: // 错误处理
// 报警处理逻辑
END_CASE
3.2 ST语言高级应用技巧
- 数组批量处理:
pascal复制// 批量初始化伺服参数
FOR i := 1 TO 4 BY 1 DO
arrServoParams[i].rGearRatio := 10.0;
arrServoParams[i].rMaxSpeed := 2000.0;
END_FOR;
- 结构体嵌套:
pascal复制// 设备状态监控结构体
TYPE ST_MachineStatus :
STRUCT
stAxis : ARRAY[1..4] OF ST_AxisStatus; // 4个轴状态
stAlarm : ST_AlarmInfo; // 报警信息
rCycleTime : REAL; // 循环时间
END_STRUCT
END_TYPE
- 指针应用(FX3U/FX5U支持):
pascal复制// 通过指针访问不同轴数据
pAxis := ADR(stMachine.stAxis[iAxisNo]);
pAxis^.rTargetPos := rNewPos;
3.3 HMI标签关联技巧
在GT Designer3中:
- 创建与PLC对应的全局标签数据库
- 重要参数设置读写权限:
- 速度设定:可读写
- 当前位置:只读
- 报警代码:只读
- 结构体元素访问格式:
code复制{PLC名}.stAxisX.bHomeDone {PLC名}.stAxisY.rCurrentPos
4. 伺服控制实战案例
4.1 原点回归功能实现
pascal复制// 在FB中实现的原点回归逻辑
IF bHomeStart THEN
// 1. 高速回原点
DSZR 高速速度, 爬行速度, 近点信号, 脉冲输出端口;
// 2. 到达原点后执行
IF M8029 THEN
rCurrentPos := 0.0; // 位置清零
bHomeDone := TRUE;
END_IF
END_IF
4.2 多轴插补运动
虽然FX3G不支持硬件插补,但可通过软件实现简单两轴直线插补:
pascal复制// 插补计算
rStep := 0.01; // 插补步长
rDist := SQRT(rTargetX*rTargetX + rTargetY*rTargetY);
iSteps := INT_TO_DINT(rDist / rStep);
FOR i := 1 TO iSteps DO
rRatio := REAL_TO_DINT(i) / REAL_TO_DINT(iSteps);
rOutX := rTargetX * rRatio;
rOutY := rTargetY * rRatio;
// 输出到各自轴
FB_X.AbsMove(rOutX);
FB_Y.AbsMove(rOutY);
// 等待两轴都到位
WAIT(FB_X.bInPosition AND FB_Y.bInPosition);
END_FOR;
4.3 扭矩限制应用
通过JE伺服的转矩限制功能实现防撞:
pascal复制// 在伺服FB中设置
IF bTorqueLimit THEN
// 写入转矩限制值(%)
MOV K500 D8140; // 50%限制
ELSE
MOV K1000 D8140; // 100%恢复
END_IF
5. 调试与优化技巧
5.1 结构化调试方法
-
分模块测试:
- 先单独测试每个FB功能块
- 使用强制变量功能验证逻辑
pascal复制// 测试代码片段 IF bTestMode THEN rSetSpeed := 500.0; // 测试速度 bStart := TRUE; END_IF -
在线修改技巧:
- 使用"在线变更"功能时:
- 优先修改ST程序部分
- 避免频繁修改FB接口定义
- 修改后执行"变换+写入"
- 使用"在线变更"功能时:
5.2 性能优化建议
-
扫描周期控制:
- 将运动控制FB放在优先执行的POU中
- 使用定时中断(如EI指令)处理关键任务
-
内存优化:
pascal复制// 使用局部变量替代全局变量 VAR_TEMP rTempPos : REAL; END_VAR -
通信优化:
- HMI刷新周期设置为100-200ms
- 重要参数单独设置更快的刷新率
5.3 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| HMI显示"通信超时" | 1. 标签地址冲突 2. 波特率不匹配 |
1. 检查标签定义 2. 确认HMI与PLC波特率一致 |
| 伺服电机不动作 | 1. 使能信号未接通 2. 驱动器报警 |
1. 检查CN1接线 2. 查看驱动器ALM代码 |
| 位置控制偏差大 | 1. 电子齿轮比错误 2. 机械背隙 |
1. 重新计算齿轮比 2. 添加背隙补偿 |
6. 工程管理进阶技巧
6.1 版本控制实践
虽然GX Works2不支持Git直接集成,但可通过:
- 定期导出源文件(.gxw格式)
- 使用"工程比较"工具核对差异
- 关键版本添加注释:
pascal复制// Version 1.2 - 2024/03/15 // 修改内容: // 1. 优化X轴回零逻辑 // 2. 增加扭矩限制功能
6.2 标准化开发流程
-
命名规范示例:
- 全局变量:g_前缀(如g_stMachineStatus)
- 局部变量:l_前缀(如l_iTemp)
- 功能块实例:FB_前缀(如FB_Servo1)
-
文档自动化:
- 利用GX Works2的"列表打印"功能生成IO表
- 通过"交叉参考"生成变量使用报告
6.3 扩展应用思路
-
与上位机通信:
- 通过FX3G的RS485接口实现Modbus RTU通信
- 使用D区映射重要参数
-
数据记录:
pascal复制// 简单数据记录实现 IF bRecord THEN arrPosition[iRecordIndex] := rCurrentPos; iRecordIndex := iRecordIndex + 1; IF iRecordIndex > 100 THEN iRecordIndex := 0; END_IF; END_IF; -
配方功能扩展:
- 使用文件寄存器(D1000以后)
- 通过GS2110的配方功能实现参数组切换
这套开发方法在实际项目中已经验证过,最明显的改进是当需要增加一个新轴时,开发时间可以从原来的2天缩短到2小时——只需要实例化一个新的伺服控制FB,调整参数即可。对于需要频繁修改的非标设备项目,这种结构化编程方式能显著降低后期维护成本。