1. 全自动N95口罩机控制系统概述
这套基于汇川AM401/AM403 PLC的控制系统,是我去年在东莞某医疗设备制造商实施的交钥匙项目。整套系统包含23个汇川总线伺服轴、8个步进电机模块和12组超声波焊接单元,程序规模达到惊人的20000步ST代码。核心难点在于实现口罩生产过程中多个工艺段的精密协同控制,包括:
- 材料放卷张力恒定控制(±1.5%波动范围)
- 耳带焊接凸轮同步(相位误差<0.5°)
- 超声波焊接压力PID调节(30ms响应周期)
- 生产速度无级切换(30-300片/分钟可调)

2. 核心控制模块深度解析
2.1 凸轮同步控制实现
口罩耳带焊接需要主从轴严格同步,我们采用CAM表控制方式。实际调试中发现,传统梯形曲线会导致耳带材料拉伸变形,最终选用修正正弦曲线算法:
st复制PROGRAM CamProfileConfig
VAR
stCamTable: ARRAY[0..359] OF LREAL; //1度一个数据点
i: INT;
// 修正系数
k1 := 1.3, k2 := 0.7: REAL;
END_VAR
// 生成修正正弦曲线
FOR i:=0 TO 179 BY 1 DO
stCamTable[i] := 50 * k1 * SIN(3.14159 * i / 180);
END_FOR;
FOR i:=180 TO 359 BY 1 DO
stCamTable[i] := 50 * k2 * SIN(3.14159 * (i-180) / 180);
END_FOR;
// 凸轮参数配置
CamSetMasterCycle(axisX, 360, 1); //1:1传动比
CamAttachTable(axisY, ADR(stCamTable), 0.5); //0.5mm电子齿轮比
关键调试经验:在150°位置设置0.1秒的保持区间,可有效解决耳带材料回弹问题。激光测距仪实测同步误差控制在±0.15mm内。
2.2 超声波焊接控制算法
焊接质量直接决定口罩气密性,我们开发了自适应PID算法:
st复制FUNCTION_BLOCK AdaptivePID
VAR_INPUT
actualPressure: REAL;
setPoint: REAL;
materialType: INT; //1=无纺布 2=熔喷布
END_VAR
VAR_OUTPUT
pwmDuty: REAL;
END_VAR
VAR
// 不同材料参数预设
kp: ARRAY[1..2] OF REAL := [0.78, 0.82];
ki: ARRAY[1..2] OF REAL := [0.05, 0.03];
kd: ARRAY[1..2] OF REAL := [0.1, 0.15];
integral, prevError: REAL;
cycleCounter: UINT;
END_VAR
// 每100周期自动微调参数
IF cycleCounter >= 100 THEN
IF ABS(error) > 0.5 THEN
kp[materialType] := kp[materialType] * 1.02;
END_IF;
cycleCounter := 0;
END_IF;
// 标准PID计算
error := setPoint - actualPressure;
integral := LIMIT(integral + error * dt, -100, 100);
derivative := (error - prevError) / dt;
pwmDuty := kp[materialType]*error + ki[materialType]*integral + kd[materialType]*derivative;
prevError := error;
cycleCounter := cycleCounter + 1;
实际应用中发现,熔喷布需要更高的微分增益来抑制压力振荡。通过HMI暴露参数调整接口,操作工可快速切换不同材料配方。
3. 张力控制系统实现细节
3.1 卷径自适应算法
放卷张力控制的核心是实时计算卷径变化。我们在导向辊加装编码器,通过线速度比计算当前卷径:
st复制FUNCTION CalcCurrentRadius: REAL
VAR_INPUT
unwindSpeed: REAL; // 放卷轴转速 rpm
lineSpeed: REAL; // 产线速度 m/min
END_VAR
VAR
lastRadius: REAL := 0.25; // 初始半径(m)
stableCounter: INT;
END_VAR
// 排除加速阶段干扰
IF ABS(unwindSpeed - lastSpeed) < 5 THEN
currentRadius := lineSpeed / (2 * 3.1416 * unwindSpeed/60);
// 低通滤波
IF lastRadius > 0 THEN
currentRadius := 0.2 * currentRadius + 0.8 * lastRadius;
END_IF;
// 稳定性判断
IF ABS(currentRadius - lastRadius) < 0.005 THEN
stableCounter := stableCounter + 1;
ELSE
stableCounter := 0;
END_IF;
IF stableCounter > 10 THEN
lastRadius := currentRadius;
END_IF;
END_IF;
RETURN lastRadius;
3.2 转矩前馈补偿
结合卷径变化做动态转矩补偿:
st复制METHOD UpdateTorqueCompensation
VAR
radiusRatio: REAL;
inertiaComp: REAL;
END_VAR
radiusRatio := (initialRadius / currentRadius)^2;
inertiaComp := 1 + 0.5 * (lineAccel / 10); // 加速度补偿系数
targetTorque := baseTorque * radiusRatio * inertiaComp;
targetTorque := LIMIT(targetTorque, minTorque, maxTorque);
ServoSetTorque(axisUnwind, targetTorque);
重要发现:在加速阶段额外增加15%的惯性补偿转矩,可有效抑制材料抖动。调试时用高速摄像机捕捉材料波动情况,反复优化补偿曲线。
4. 系统架构设计要点
4.1 模块化编程实践
所有运动控制功能封装为标准函数块:
st复制FUNCTION_BLOCK AxisControl EXTENDS FB_Base
VAR
// 轴状态机
state: (DISABLED, HOMING, JOGGING, POSITIONING);
// 配置参数
axisParams: ST_AxisParameters;
// 保护功能
overTravelPos, overTravelNeg: BOOL;
END_VAR
METHOD HomeAxis: BOOL
VAR
retryCount: INT;
END_VAR
CASE state OF
DISABLED:
IF ServoEnable(THIS^.axisRef, TRUE) THEN
state := HOMING;
END_IF;
HOMING:
IF NOT ServoMoveUntilLimit(THIS^.axisRef, 500) THEN
retryCount := retryCount + 1;
IF retryCount > 3 THEN
state := DISABLED;
RETURN FALSE;
END_IF;
ELSE
ServoSetPosition(THIS^.axisRef, 0);
state := POSITIONING;
RETURN TRUE;
END_IF;
END_CASE;
4.2 异常处理机制
设计三级故障处理策略:
- 瞬时故障:自动重试(如伺服使能失败)
- 持续故障:工艺调整(如材料卡滞降速处理)
- 硬件故障:紧急停机并触发声光报警
st复制FUNCTION_BLOCK SafetyMonitor
VAR
faultLog: ARRAY[1..100] OF ST_FaultRecord;
faultIndex: INT;
// 看门狗定时器
wdt: TON := (PT:=T#5S);
END_VAR
// 监控所有轴状态
FOR i:=1 TO AXIS_COUNT DO
IF NOT Axis[i].IsHealthy THEN
faultIndex := faultIndex MOD 100 + 1;
faultLog[faultIndex] := (axis:=i, code:=Axis[i].LastError, time:=NOW());
CASE Axis[i].LastError OF
0x1011: // 过载
Axis[i].ReduceSpeed(30);
wdt(IN:=TRUE);
0x1020: // 编码器故障
EmergencyStop();
END_CASE;
END_IF;
END_FOR;
// 看门狗处理
IF wdt.Q THEN
SystemReset();
END_IF;
5. HMI交互设计技巧
5.1 生产数据可视化
IT7070触摸屏上实现的关键功能:
st复制// 实时产量统计
FUNCTION UpdateProductionCount
VAR_INPUT
productDetected: BOOL;
END_VAR
VAR
shiftStartTime: DT;
lastCountSave: UDINT;
END_VAR
IF productDetected AND RISING_EDGE(photoSensor) THEN
totalCount := totalCount + 1;
// 班次统计
IF shiftStartTime = 0 THEN
shiftStartTime := NOW();
ELSIF TIME_TO_SEC(NOW() - shiftStartTime) > 28800 THEN // 8小时
SaveShiftData();
shiftStartTime := NOW();
END_IF;
// 每分钟保存一次
IF totalCount - lastCountSave > 100 THEN
SaveToDatabase();
lastCountSave := totalCount;
END_IF;
END_IF;
5.2 智能报警系统
报警信息分级显示策略:
- 一级报警(红色):设备停机故障
- 二级报警(黄色):工艺异常预警
- 三级报警(蓝色):维护提醒
st复制FUNCTION_BLOCK AlarmManager
VAR
activeAlarms: ARRAY[1..50] OF ST_Alarm;
historyAlarms: ARRAY[1..1000] OF ST_Alarm;
// 报警抑制逻辑
suppressMask: DWORD;
END_VAR
METHOD AddAlarm
VAR_INPUT
id: UINT;
msg: STRING;
level: INT;
autoAck: BOOL;
END_VAR
// 检查是否被抑制
IF (suppressMask AND (1 << id)) = 0 THEN
// 添加到活动报警列表
FOR i:=1 TO 50 DO
IF activeAlarms[i].id = 0 THEN
activeAlarms[i] := (id:=id, msg:=msg, level:=level,
time:=NOW(), acked:=autoAck);
EXIT;
END_IF;
END_FOR;
// 记录历史
historyAlarms[CIRCULAR_INDEX] := activeAlarms[i];
CIRCULAR_INDEX := CIRCULAR_INDEX MOD 1000 + 1;
END_IF;
6. 现场调试经验总结
6.1 伺服参数整定步骤
-
先设置基本参数:
- 电机型号:SV660N
- 编码器分辨率:20bit
- 额定转速:3000rpm
-
自动惯量辨识:
st复制ServoAutoTuning(axis1, TUNING_MODE_INERTIA); -
手动优化:
- 速度环比例增益:从50%开始逐步增加
- 位置环前馈增益:建议60-80%
- 抗振滤波器:开启2阶50Hz陷波
实测发现:当机械传动存在间隙时,适当降低速度环积分时间可避免振荡。
6.2 系统响应时间测试
使用PLC的硬件中断功能测试关键流程:
| 任务类型 | 触发条件 | 最大响应时间 |
|---|---|---|
| 急停处理 | 安全门开关 | 2ms |
| 焊接触发 | 光电传感器 | 0.5ms |
| 张力调节 | 1ms定时中断 | 0.8ms |
st复制PROGRAM HighSpeedIO_ISR
VAR
edgeTime: ARRAY[1..100] OF ULINT;
index: INT;
END_VAR
// 在硬件中断中记录时间戳
IF RISING_EDGE(emergencyStop) THEN
edgeTime[index] := GET_NANOTIME();
index := index MOD 100 + 1;
EmergencyStop_Routine();
END_IF;
7. 程序优化技巧
7.1 ST代码性能优化
-
避免在循环内部分配内存:
st复制// 错误写法 FOR i:=1 TO 100 DO pBuf := __NEW(SIZE=100); // ... __DELETE(pBuf); END_FOR; // 正确写法 pBuf := __NEW(SIZE=100); FOR i:=1 TO 100 DO // 复用内存 END_FOR; __DELETE(pBuf); -
使用常量传播优化:
st复制CONST MAX_SPEED: REAL := 300.0; ACCEL_TIME: TIME := T#500MS; END_VAR // 编译器会直接替换常量 targetSpeed := MAX_SPEED * 0.8;
7.2 通讯负载均衡
EtherCAT总线配置建议:
- 周期同步周期:1ms
- 过程数据分帧传输:
- 帧1:关键安全信号(急停、安全门)
- 帧2:运动控制指令
- 帧3:状态监控数据
st复制// 总线配置示例
EtherCAT_Config(
SyncUnit := 1,
CycleTime := 1000, // 1ms
Frame1 := (EmergencyStop, SafetyDoor),
Frame2 := (AxisCmd[1..8]),
Frame3 := (AxisStatus[1..8], AnalogIn[1..16])
);
这套系统最终实现单日产能45万片N95口罩,设备综合效率(OEE)达到92.3%。最让我自豪的是,通过完善的异常处理机制,平均故障修复时间(MTTR)控制在8分钟以内。