1. 项目概述:当ST语言遇上双轴同步控制
第一次接触汇川中型PLC的双轴同步项目时,我盯着那堆运动控制指令发了半小时呆。作为从梯形图转战结构化文本(ST)的"半路出家"工程师,我完全理解新手面对这个组合时的忐忑——既要掌握ST语言的严谨语法,又要理解运动控制的底层逻辑,还得处理两个轴之间的微妙配合。但经过三个实际项目的锤炼后,我发现这套组合其实比想象中友好得多。
汇川AM400系列PLC搭配伺服驱动的解决方案,在包装机械、纺织设备和3C自动化领域已经相当成熟。其优势在于用ST语言可以直接调用现成的运动控制功能块,像搭积木一样构建复杂运动逻辑。比如在贴标机项目中,主传送带(X轴)和贴标头(Y轴)的同步精度要求±0.1mm,通过ST编写的电子齿轮程序,两天就实现了基本功能框架。
2. 开发环境搭建与基础配置
2.1 硬件选型要点
我的第一个双轴项目就栽在硬件匹配上。当时用AM403-CPU配了第三方伺服,结果发现电子齿轮比设置受限。现在我的硬件清单一定会包含:
- 主控:AM401/AM403系列CPU(建议AM403-1600T,带4轴脉冲输出)
- 伺服驱动:汇川IS620P系列(与PLC原生适配)
- HMI:汇川IT7070系列触摸屏
- 必备配件:24V开关电源、紧急停止按钮、增量型编码器(2000线)
关键提示:务必确认伺服驱动器的固件版本,旧版可能不支持某些高级同步指令。我习惯在设备上电前先用AutoShop软件的驱动检测功能扫描整个网络。
2.2 软件环境配置
AutoShop V2.3以后的版本对ST语言的支持更完善,安装时注意勾选"运动控制库"和"结构化文本编程组件"。新建工程时有个容易忽略的设置:
- 在"PLC配置"→"运动控制"中启用轴0和轴1
- 设置脉冲当量(例如:10000 pulses/mm)
- 勾选"同步组"选项框
st复制// 基础轴参数配置示例
AXIS_CFG(
Axis:=0, // 轴号
Unit:=UNIT_PULSE, // 脉冲单位
PulsePerRev:=10000, // 每转脉冲数
GearRatio:=1, // 减速比
MaxSpeed:=200000, // 最大速度(pulse/s)
AccTime:=1000, // 加速时间(ms)
DecTime:=1000 // 减速时间(ms)
);
3. ST语言编程核心模式
3.1 运动控制指令封装
汇川的ST环境已经封装了常用运动指令,但直接调用会显得代码臃肿。我的做法是二次封装:
st复制// 自定义相对运动功能块
FUNCTION_BLOCK FB_MoveRelative
VAR_INPUT
Axis: INT;
Distance: REAL;
Velocity: REAL;
END_VAR
VAR
cmd: MC_MoveRelative;
END_VAR
cmd(
Axis:=Axis,
Distance:=Distance,
Velocity:=Velocity,
Execute:=TRUE
);
// 使用示例
IF start_button THEN
myMove(Axis:=0, Distance:=100.5, Velocity:=50.0);
END_IF;
3.2 双轴同步的三种实现方式
根据项目需求,我总结出三种同步策略:
- 电子齿轮模式 - 适合恒定速比场景
st复制// 设置轴1跟随轴0运动
MC_GearIn(
Master:=0, // 主轴
Slave:=1, // 从轴
RatioNumerator:=1, // 分子
RatioDenominator:=2,// 分母
Execute:=TRUE
);
- 位置耦合模式 - 适合动态调整场景
st复制// 创建耦合关系
MC_CamTableSelect(Axis:=1, TableNo:=0);
MC_CamIn(Axis:=1);
// 动态修改耦合表
IF condition THEN
MC_CamTableBuild(
TableNo:=0,
Points:=[(0,0),(100,50),(200,110)],
Mode:=ABSOLUTE
);
END_IF;
- 虚拟主轴模式 - 适合多轴协调运动
st复制// 创建虚拟主轴
MC_VirtualAxisCreate(Axis:=3);
// 从轴跟随虚拟轴
MC_GearIn(Master:=3, Slave:=0, RatioNumerator:=1);
MC_GearIn(Master:=3, Slave:=1, RatioNumerator:=1);
4. 调试技巧与异常处理
4.1 必看的监控技巧
在调试双轴同步时,我必开这三个监控窗口:
- 运动轨迹示波器:叠加显示两轴位置曲线
- 跟随误差监控:从轴与主轴的实时位置差
- 指令队列状态:查看未执行的缓冲指令
血泪教训:曾经因为没看跟随误差,导致累积误差引发机械碰撞。现在我的安全标准是:跟随误差超过5个脉冲立即触发急停。
4.2 常见故障排查表
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 从轴抖动明显 | 电子齿轮比设置不合理 | 调整Ratio值为简单整数比 |
| 同步过程中出现位置偏差 | 主轴加速度设置过大 | 降低AccTime至500ms以上 |
| 偶尔出现指令不执行 | ST程序扫描周期过长 | 优化程序结构或缩短PLC周期 |
| 回原点后同步偏移 | 机械零点与电气零点不一致 | 重新校准并设置偏移量 |
5. 项目实战:贴标机同步控制
去年完成的化妆品贴标机项目,完美诠释了ST语言在同步控制中的优势。核心需求是:
- X轴(传送带)速度0.2-1.5m/s可调
- Y轴(贴标头)需在±0.05mm精度内同步
- 支持标签长度动态调整
最终实现的程序架构:
st复制// 主程序结构
PROGRAM MAIN
VAR
fbGear: MC_GearIn;
fbMove: FB_MoveRelative;
fbCam: MC_CamTableSelect;
END_VAR
// 初始化
IF first_scan THEN
Axis_Configuration();
CamTable_Generation();
END_IF;
// 运行逻辑
CASE machine_state OF
0: // 待机
1: // 同步运行
fbGear(Master:=0, Slave:=1, Ratio:=Get_LabelRatio());
2: // 手动调整
fbMove(Axis:=1, Distance:=HMI_Value);
END_CASE;
这个项目的关键收获是:在ST中把运动参数做成结构体数组,通过HMI可以动态加载不同产品的参数预设,切换时间从原来的30秒缩短到1秒以内。
6. 给初学者的特别建议
-
从单轴调试开始:务必先确保单轴运动完全正常,再尝试同步控制。我曾经因为轴0的脉冲输出配置错误,浪费一整天排查所谓的"同步问题"。
-
善用仿真功能:AutoShop的离线仿真可以验证大部分ST逻辑,在接实际设备前,先用仿真测试各种边界条件。
-
注释的艺术:在ST中我坚持这样的注释规范:
- 每个功能块开头用/=====/分隔
- 关键参数注明单位和取值范围
- 复杂算法添加流程图截图(用图片注释)
-
安全防护三件套:
st复制// 急停处理
IF emergency_stop OR (ABS(following_error) > 5) THEN
MC_Halt(Axis:=0);
MC_Halt(Axis:=1);
Reset_All_Commands();
END_IF;
最后分享一个调试小技巧:在测试阶段,我会在关键位置添加临时变量输出,像这样:
st复制// 临时调试代码
IF debug_mode THEN
HMI_DebugValue1 := MC_ReadActualPosition(0);
HMI_DebugValue2 := MC_ReadActualPosition(1);
HMI_DebugValue3 := HMI_DebugValue2 - HMI_DebugValue1;
END_IF;
这些值可以在HMI上实时监控,问题排查效率提升至少50%。等项目稳定后,只需将debug_mode设为FALSE即可禁用这些输出,无需删除代码。