在工业自动化领域,PLC程序框架的设计质量直接影响设备的稳定性和开发效率。汇川H5U系列PLC凭借其出色的性价比和强大的EtherCAT总线支持能力,成为中小型自动化项目的热门选择。这套经过多个项目验证的程序框架,不仅适用于汇川PLC,其设计理念也可轻松移植到三菱、台达等其他品牌PLC平台。
框架的核心优势在于将复杂的运动控制逻辑模块化,通过状态机管理设备运行流程。EtherCAT总线伺服控制部分采用硬件抽象层设计,使工艺逻辑与硬件操作分离。气缸控制模块则内置完善的故障检测机制,包括传感器反馈验证和动作超时报警。
提示:这套框架特别适合需要同时控制多个伺服轴和气缸的场合,如自动化装配线、包装机械、冲压设备等场景。
EtherCAT总线配置是框架的基础环节。在H5U PLC中,我们需要先完成以下准备工作:
典型的伺服轴参数映射包括:
st复制// 输入PDO(从站→主站)
Axis[1].Actual_Position := %IW100
Axis[1].Actual_Velocity := %IW102
Axis[1].Status_Word := %IW104
// 输出PDO(主站→从站)
%QW100 := Axis[1].Target_Position
%QW102 := Axis[1].Control_Word
%QW104 := Axis[1].Profile_Velocity
通讯状态监测采用心跳包机制,当连续3个周期未收到从站响应时触发报警:
st复制IF NOT Axis[1].EtherCAT_Connected THEN
TON_Comm_Loss(IN:=TRUE, PT:=T#300ms);
IF TON_Comm_Loss.Q THEN
Axis[1].Error_Status := TRUE;
Alarm_Log := CONCAT('轴', INT_TO_STRING(1), '通讯中断');
END_IF
END_IF
框架采用分层状态机管理轴控制流程,主要状态包括:
状态转换条件通过结构化文本清晰定义:
st复制// 状态转换逻辑示例
CASE Axis[1].State OF
0: // 初始化
IF Axis[1].EtherCAT_Connected THEN
Axis[1].State := 1;
END_IF
1: // 伺服准备
IF NOT Axis[1].Error_Status THEN
Axis[1].Servo_Ready := TRUE;
Axis[1].State := 2;
END_IF
2: // 使能状态
IF Axis[1].Enable_Cmd THEN
Axis[1].Enable := TRUE;
Axis[1].State := 3;
END_IF
END_CASE
JOG控制采用速度模式,通过全局变量统一管理各轴基准速度:
st复制// JOG正向运动
IF Axis[1].JOG_Forward AND NOT Axis[1].Error_Status THEN
Axis[1].Control_Word := 16#003F;
Axis[1].Profile_Velocity := JOG_Base_Speed * Axis[1].Speed_Ratio;
END_IF
定位运动采用S曲线加减速,关键参数包括:
st复制// 绝对定位触发
IF Axis[1].Move_Abs_Cmd AND NOT Axis[1].Moving THEN
Axis[1].Target_Position := Axis[1].Set_Position;
Axis[1].Profile_Velocity := Axis[1].Move_Speed;
MC_MoveAbsolute(Axis[1].Axis_No,
Position := Axis[1].Target_Position,
Velocity := Axis[1].Profile_Velocity,
Acceleration := 1000,
Deceleration := 1000);
END_IF
框架提供多种回零模式选择,典型配置如下:
st复制// 原点回归参数设置
Axis[1].Homing_Mode := 35; // 模式35:正向限位开关触发后找Z脉冲
Axis[1].Homing_Speed := 500;
Axis[1].Homing_Accel := 1000;
// 启动回零
IF Axis[1].Home_Cmd THEN
MC_Home(Axis[1].Axis_No,
Execute := TRUE,
Position := 0,
Mode := Axis[1].Homing_Mode,
Velocity := Axis[1].Homing_Speed,
Acceleration := Axis[1].Homing_Accel);
END_IF
气缸控制采用典型的双控电磁阀驱动方式,框架为每个气缸定义标准控制接口:
st复制// 气缸数据结构
TYPE Cylinder_Struct :
STRUCT
Extend_Cmd : BOOL; // 伸出命令
Retract_Cmd : BOOL; // 缩回命令
Extend_Sensor : BOOL; // 伸出到位传感器
Retract_Sensor : BOOL; // 缩回到位传感器
Alarm : BOOL; // 报警状态
Timeout_Time : TIME := T#3S; // 默认超时时间
END_STRUCT
END_TYPE
框架包含多重安全保护措施:
st复制// 带互锁的伸出控制
IF Cylinder[1].Extend_Cmd AND NOT Cylinder[1].Retract_Cmd THEN
// 检查当前状态是否允许动作
IF NOT Cylinder[1].Extend_Sensor AND NOT Cylinder[1].Alarm THEN
Extend_Valve := TRUE;
TON_Extend(IN:=TRUE, PT:=Cylinder[1].Timeout_Time);
// 超时检测
IF TON_Extend.Q THEN
Cylinder[1].Alarm := TRUE;
Alarm_Log := CONCAT('气缸', INT_TO_STRING(1), '伸出超时');
END_IF
END_IF
END_IF
气缸报警采用分级处理机制:
报警复位需要满足以下条件:
st复制// 报警复位逻辑
IF Cylinder[1].Reset_Cmd THEN
// 确认传感器状态正常
IF (Cylinder[1].Extend_Sensor XOR Cylinder[1].Retract_Sensor) THEN
Cylinder[1].Alarm := FALSE;
TON_Extend(IN:=FALSE); // 复位定时器
END_IF
END_IF
示教模式允许操作人员在手动状态下设置工艺位置,框架采用三级保护设计:
st复制// 示教位置保存
IF Teach_Mode_Active AND Axis[1].Teach_Save THEN
// 检查位置变化量小于安全阈值
IF ABS(Axis[1].Actual_Position - Teach_Position_Buffer) < Teach_Max_Deviation THEN
Axis[1].Teach_Position := Teach_Position_Buffer;
Recipe[Current_Recipe].Position[Teach_Index] := Teach_Position_Buffer;
ELSE
Alarm_Log := '示教位置变化过大';
END_IF
END_IF
对于需要压力控制的场合,框架提供两种实现方式:
st复制// 位置-压力切换控制流程
IF Axis[1].Press_Start THEN
// 第一阶段:快速接近
MC_MoveAbsolute(Axis[1].Axis_No, Position := Press_Approach_Pos, Velocity := 1000);
// 第二阶段:压力控制
IF Axis[1].Actual_Position >= Press_Switch_Pos THEN
PID_Pressure.Setpoint := Target_Pressure;
Axis[1].Torque_Limit := PID_Pressure.Output;
END_IF
// 到达目标压力保持
IF ABS(Axis[1].Actual_Torque - Target_Pressure) < Tolerance THEN
TON_Press_Hold(IN:=TRUE, PT:=Press_Hold_Time);
END_IF
END_IF
框架通过硬件抽象层实现跨平台兼容,关键接口包括:
st复制// 品牌无关的运动控制接口
FUNC MC_MoveAbsolute : BOOL
VAR_INPUT
Axis : INT;
Position : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
END_VAR
// 汇川实现
IF PLC_Brand = 1 THEN
H5U_MoveAbsolute(Axis, Position, Velocity, Acceleration, Deceleration);
// 三菱实现
ELSIF PLC_Brand = 2 THEN
MELSEC_MC_MoveAbsolute(Axis, Position, Velocity, Acceleration, Deceleration);
END_IF
分布式时钟同步:确保所有从站时钟偏差<1μs
st复制EtherCAT_Master.DC_Sync_Mode := TRUE;
EtherCAT_Master.DC_Cycle_Time := 1000000; // 1ms
PDO映射优化:只映射必要的参数,减少通讯负载
看门狗设置:从站看门狗时间建议设为通讯周期的3倍
伺服调试推荐步骤:
典型参数范围:
| 参数类型 | 比例增益 | 积分时间(ms) | 微分时间(ms) |
|---|---|---|---|
| 位置环 | 30-50 | - | - |
| 速度环 | 100-150 | 20-50 | - |
| 前馈 | 80-90% | - | 5-10 |
EtherCAT通讯中断:
伺服使能失败:
气缸动作异常:
经验分享:在复杂系统中,建议为每个轴和气缸分配独立的报警代码,便于快速定位故障源。框架中的报警处理模块支持按设备类型和位置进行分级过滤,大大缩短故障诊断时间。
采用本框架实现的典型应用:
关键逻辑片段:
st复制// 自动运行流程
IF Auto_Running THEN
CASE Step OF
0: // 回原点
IF ALL_AXES_HOMED THEN
Step := 1;
END_IF
1: // 取料位置
MC_MoveAbsolute(X_Axis, Pick_Pos.X, 1000);
MC_MoveAbsolute(Y_Axis, Pick_Pos.Y, 1000);
IF IN_POSITION THEN
Step := 2;
END_IF
2: // 气爪夹取
Gripper.Extend_Cmd := TRUE;
TON_Grip_Delay(IN:=TRUE, PT:=T#500ms);
IF TON_Grip_Delay.Q THEN
Step := 3;
END_IF
END_CASE
END_IF
实现主从轴电子齿轮同步:
st复制// 主从轴比例设置
Gear_Ratio := Master_Axis.Actual_Position / Slave_Axis.Actual_Position;
// 同步启动
IF Sync_Start THEN
MC_GearIn(Slave_Axis.Axis_No,
Master := Master_Axis.Axis_No,
RatioNumerator := Gear_Numerator,
RatioDenominator := Gear_Denominator,
Acceleration := 1000);
END_IF
实际项目中的参数优化经验:
st复制// 报警记录结构
TYPE Alarm_Record :
STRUCT
Time : DT;
Code : WORD;
Message : STRING(50);
Axis_No : INT;
END_STRUCT
END_TYPE
// 环形缓冲区实现
IF New_Alarm THEN
Alarm_Log[Write_Ptr] := Current_Alarm;
Write_Ptr := (Write_Ptr + 1) MOD MAX_RECORDS;
END_IF
在最近的一个冲压设备项目中,我们基于这套框架仅用两周就完成了从基础运动控制到MES系统对接的全套开发。特别是将气缸控制模块与安全光栅联锁后,设备一次性通过安全评估。这充分验证了框架在实际工程中的可靠性和高效性。