1. H5U PLC程序框架概述
在工业自动化领域,汇川H5U系列PLC以其出色的性价比和强大的EtherCAT总线控制能力,正成为越来越多工程师的选择。这套完整的程序框架是我在实际项目中反复打磨出来的成果,特别适合需要同时控制伺服系统和气缸的自动化设备。
这个框架最大的特点是采用了模块化设计思想,将气缸控制、伺服轴控制、报警处理等核心功能封装成独立的功能块,不仅便于维护,还能快速移植到其他品牌的PLC平台。
框架的核心优势体现在三个方面:
- 对EtherCAT总线的深度优化,伺服控制响应时间<1ms
- 采用状态机设计模式,程序执行流程清晰可见
- 完善的异常处理机制,包括单轴报警和全局急停联动
2. 硬件配置与网络拓扑
2.1 基本硬件组成
典型的H5U控制系统包含以下组件:
- 汇川H5U-1616MT-XP PLC主机(16点输入/16点晶体管输出)
- AM600-4E1P扩展模块(4轴EtherCAT运动控制)
- IS620N系列伺服驱动器(支持EtherCAT通讯)
- 分布式IO模块(用于气缸控制信号采集)
2.2 EtherCAT网络配置要点
EtherCAT总线配置需要特别注意以下几点:
- 网络拓扑必须采用线型结构,不支持星型连接
- 每个网段最多支持32个从站设备
- 终端电阻必须正确设置(最后一个从站的ECAT接口需启用终端电阻)
配置示例:
iec复制// EtherCAT主站初始化
EcatMaster_Config(
iDwOutputOffset := 16#1000, // 过程数据输出区偏移地址
iDwInputOffset := 16#2000, // 过程数据输入区偏移地址
iDwOutputSize := 256, // 输出数据区大小
iDwInputSize := 256 // 输入数据区大小
);
3. 气缸控制模块详解
3.1 气缸状态结构体设计
框架中使用结构体封装气缸的所有状态信息:
iec复制TYPE Cylinder_Struct :
STRUCT
// 输入信号
Sensor_Extend : BOOL; // 伸出到位传感器
Sensor_Retract : BOOL; // 缩回到位传感器
// 输出控制
Output_Extend : BOOL; // 伸出电磁阀控制
Output_Retract : BOOL; // 缩回电磁阀控制
// 状态监控
Timer_Action : TON; // 动作超时计时器
Alarm_Code : WORD; // 报警代码
Alarm_History : ARRAY[1..5] OF WORD; // 报警历史记录
END_STRUCT
END_TYPE
3.2 气缸动作控制逻辑
气缸的基本动作控制采用互锁设计:
iec复制// 气缸伸出控制
IF NOT Cylinder[x].Alarm_Code AND bExtendCmd THEN
Cylinder[x].Output_Extend := TRUE;
Cylinder[x].Output_Retract := FALSE;
// 启动动作超时监控
Cylinder[x].Timer_Action(IN:=TRUE, PT:=T#2S);
// 检查是否超时未到位
IF Cylinder[x].Timer_Action.Q THEN
Cylinder[x].Alarm_Code := 16#1001; // 伸出超时报警
END_IF
END_IF
实际项目中,建议为每个气缸添加手动调试模式,方便设备调试时单独测试气缸动作。
4. 伺服轴控制架构
4.1 轴状态机设计
伺服控制采用分层状态机设计,分为以下几个主要状态:
| 状态代码 | 状态名称 | 功能描述 |
|---|---|---|
| 0 | 初始化 | 系统上电初始状态 |
| 10 | 通讯检测 | 检查EtherCAT通讯状态 |
| 20 | 伺服READY | 伺服驱动器准备就绪 |
| 30 | 使能状态 | 伺服使能完成 |
| 40 | 运行状态 | 可执行各种运动指令 |
状态机实现代码片段:
iec复制CASE nAxisState OF
0: // 初始化
nAxisState := 10;
10: // EtherCAT通讯检测
IF EcatMaster_Status = 16#08 THEN // 0x08表示通讯正常
nAxisState := 20;
END_IF
20: // 伺服READY
IF AXIS_READY THEN
nAxisState := 30;
END_IF
30: // 伺服使能
IF bServoEnable THEN
AXIS_POWER(TRUE);
nAxisState := 40;
END_IF
40: // 运行状态
// 根据指令执行相应动作
END_CASE
4.2 运动控制功能实现
4.2.1 JOG运行模式
JOG控制需要考虑加减速平滑处理:
iec复制FUNCTION_BLOCK JOG_Control
VAR_INPUT
bJogForward : BOOL; // 正向点动信号
bJogBackward : BOOL; // 反向点动信号
rJogSpeed : REAL; // 点动速度(mm/s)
END_VAR
VAR
rAccelTime : REAL := 0.2; // 加速时间(s)
rDecelTime : REAL := 0.2; // 减速时间(s)
rCurrentSpeed : REAL; // 当前速度
END_VAR
// 速度斜坡处理
IF bJogForward OR bJogBackward THEN
rCurrentSpeed := rCurrentSpeed + (rJogSpeed - rCurrentSpeed) * (0.02/rAccelTime);
ELSE
rCurrentSpeed := rCurrentSpeed * (1 - (0.02/rDecelTime));
END_IF
// 设置轴速度
AXIS_VELOCITY := rCurrentSpeed;
4.2.2 绝对定位控制
绝对定位需要考虑软限位保护:
iec复制FUNCTION Absolute_Move : BOOL
VAR_INPUT
rTargetPos : REAL; // 目标位置
rVelocity : REAL; // 运行速度
END_VAR
// 检查目标位置是否在软限位范围内
IF (rTargetPos >= rPosLowerLimit) AND (rTargetPos <= rPosUpperLimit) THEN
AXIS_MOVE_ABSOLUTE(
Position := rTargetPos,
Velocity := rVelocity,
Acceleration := 1000.0,
Deceleration := 1000.0
);
RETURN TRUE;
ELSE
// 触发限位报警
nAlarmCode := 16#2001;
RETURN FALSE;
END_IF
5. 高级功能实现
5.1 点位示教系统
示教系统设计要点:
- 支持多组点位数据存储
- 可记录位置和附加参数(如压力值)
- 具备数据校验功能
示教点数据结构:
iec复制TYPE TeachPoint_Struct :
STRUCT
rPosition : REAL; // 轴位置
rAnalogValue : REAL; // 模拟量值
nIOState : WORD; // IO状态快照
tTimeStamp : TIME; // 时间戳
END_STRUCT
END_TYPE
示教操作逻辑:
iec复制// 示教点保存
IF bTeachSave THEN
// 检查存储空间
IF nTeachPointCount < MAX_TEACH_POINTS THEN
// 记录当前状态
TeachPoints[nTeachPointCount].rPosition := AXIS_ACT_POS;
TeachPoints[nTeachPointCount].rAnalogValue := Analog_Input1;
TeachPoints[nTeachPointCount].nIOState := GET_IO_SNAPSHOT();
TeachPoints[nTeachPointCount].tTimeStamp := CURRENT_TIME;
nTeachPointCount := nTeachPointCount + 1;
END_IF
END_IF
5.2 压合控制算法
压合过程控制采用速度-位置混合控制模式:
iec复制FUNCTION Press_Control
VAR_INPUT
rTargetPos : REAL; // 目标位置
rApproachSpeed : REAL; // 接近速度
rPressSpeed : REAL; // 压合速度
rPressForce : REAL; // 目标压力
END_VAR
VAR
rCurrentPos : REAL;
rCurrentForce : REAL;
END_VAR
rCurrentPos := AXIS_ACT_POS;
rCurrentForce := Analog_Input1;
// 三段式压合控制
IF rCurrentPos > (rTargetPos + 5.0) THEN
// 快速接近阶段
AXIS_VELOCITY := rApproachSpeed;
ELSIF rCurrentPos > rTargetPos THEN
// 减速过渡阶段
AXIS_VELOCITY := rPressSpeed * 0.5;
ELSE
// 压力控制阶段
IF rCurrentForce < rPressForce THEN
AXIS_VELOCITY := rPressSpeed * 0.1;
ELSE
AXIS_STOP();
END_IF
END_IF
6. 报警与安全系统
6.1 多级报警管理
报警系统采用分级设计:
- 轴级报警:单个伺服轴的异常状态
- 模块级报警:如IO模块故障
- 系统级报警:如急停、安全门等
报警处理流程:
iec复制// 报警检测与处理
FOR i := 1 TO AXIS_COUNT DO
// 检查驱动器报警
IF Axis[i].DriveAlarm <> 0 THEN
Axis[i].AlarmCode := Axis[i].DriveAlarm;
Axis[i].bAlarm := TRUE;
END_IF
// 检查运动超时
IF Axis[i].bMoving AND (Axis[i].MoveTimer.Q) THEN
Axis[i].AlarmCode := 16#3001;
Axis[i].bAlarm := TRUE;
END_IF
END_FOR
// 全局报警汇总
bSystemAlarm := FALSE;
FOR i := 1 TO AXIS_COUNT DO
IF Axis[i].bAlarm THEN
bSystemAlarm := TRUE;
EXIT;
END_IF
END_FOR
6.2 急停与安全处理
急停安全回路设计要点:
- 硬件急停回路必须独立于PLC系统
- 软件急停应切断所有运动轴使能
- 需要保存故障现场状态
急停处理代码:
iec复制// 急停响应
IF bEmergencyStop THEN
// 立即停止所有轴
FOR i := 1 TO AXIS_COUNT DO
AXIS_EMG_STOP(i);
END_FOR
// 关闭所有输出
Reset_All_Outputs();
// 记录急停状态
tEmergencyTime := CURRENT_TIME;
nEmergencyCount := nEmergencyCount + 1;
END_IF
7. 框架移植与适配
7.1 移植到三菱PLC的要点
-
通讯协议替换:
- 将EtherCAT通讯替换为CC-Link IE Field Basic
- 修改PDO映射关系
-
运动指令适配:
iec复制// 汇川H5U的绝对定位指令
AXIS_MOVE_ABSOLUTE(Position:=100.0, Velocity:=50.0);
// 对应三菱FX5U的指令
MC_MoveAbsolute(Axis:=1, Position:=100.0, Velocity:=50.0);
7.2 移植到台达PLC的注意事项
-
数据类型差异:
- 台达AS系列REAL类型为32位浮点
- 需要检查数据范围是否匹配
-
功能块调用方式不同:
iec复制// 汇川H5U的功能块调用
Axis_Control(IN:=TRUE);
// 台达AS系列需要使用EN输入
Axis_Control(EN:=TRUE, IN:=TRUE);
在实际移植过程中,我发现状态机逻辑和算法部分通常可以保持90%以上的代码相似度,主要修改集中在通讯接口和特定的PLC指令上。这种模块化设计使得框架的复用率大大提高,新项目开发时间可以缩短40%以上。