1. 三菱Q系列PLC伺服FB功能块设计概述
在工业自动化领域,伺服控制系统的稳定性和可靠性直接决定了生产设备的运行效率。这套基于三菱Q系列PLC开发的伺服定位FB(功能块)程序,经过三年实际产线验证,累计处理上百万次定位动作,其设计理念和实现方式值得深入剖析。
这套FB程序的核心价值在于其模块化架构和完备的异常处理机制。不同于市面上常见的简单示例代码,它采用了结构化文本(ST)编写,将轴参数配置、运动控制逻辑和状态管理进行了清晰分离。这种设计使得程序维护和功能扩展变得异常简单——新增一个伺服轴只需复制配置结构体并修改参数,无需重写控制逻辑。
重要提示:工业现场的程序设计必须考虑长期维护成本。这套FB程序中的所有变量均采用英文命名并附带详细注释,避免了常见的"拼音缩写+无注释"导致的维护困难问题。
2. 核心架构设计解析
2.1 参数配置结构体设计
程序使用STRUCT结构体封装所有轴参数,这种设计带来了三个显著优势:
- 参数集中管理,调试时无需在多个FB块中查找变量
- 支持参数组批量导入/导出,便于设备参数备份
- 新轴配置只需复制结构体实例并修改参数值
structuredtext复制TYPE ST_ConfigAxis :
STRUCT
uAxisNo : UINT; (* 轴号 1-32 *)
uPlsMode : UINT; (* 脉冲模式
0:CW/CCW 1:AB相 *)
rAccTime : REAL; (* 加速时间 ms 范围50-5000 *)
rDecTime : REAL; (* 减速时间 ms 需≥加速时间 *)
uORGSpeed : UINT; (* 原点回归速度
单位:脉冲/秒 *)
END_STRUCT;
END_TYPE
实际应用中发现,将机械参数(如减速比、导程)与运动参数(速度、加速度)分开存储更利于维护。因此后续版本新增了ST_MechanicalParam结构体:
structuredtext复制TYPE ST_MechanicalParam :
STRUCT
rGearRatio : REAL; (* 减速比 实际值 *)
rLead : REAL; (* 丝杠导程 mm *)
uPlsPerRev : UINT; (* 每转脉冲数 *)
END_STRUCT;
END_TYPE
2.2 运动控制状态机实现
FB内部采用状态机模式管理运动流程,这是确保可靠性的关键设计。以原点回归功能为例,其状态转换逻辑如下:
- 初始化状态:检查伺服使能状态和报警状态
- 加速阶段:按设定加速度提升至搜索速度
- 近点信号等待:检测DOG信号下降沿
- 零点信号捕获:检测Z相脉冲上升沿
- 减速停止:触发急减速至停止
- 位置补偿:微调至机械零点位置
structuredtext复制CASE iHomeState OF
0: // 状态检查
IF NOT bServoReady THEN
iErrorCode := E_ServoOffline;
iHomeState := 100; // 错误状态
ELSE
iHomeState := 1;
END_IF;
1: // 启动运动
StartMove(ORGMODE, rSearchSpeed);
iHomeState := 2;
2: // 等待近点信号
IF bDOG_On THEN
iHomeState := 3;
END_IF;
...
END_CASE;
3. 关键功能实现细节
3.1 绝对定位控制实现
绝对定位是伺服系统最常用的功能,其核心在于位置-脉冲量的精确换算。程序中采用了三级换算机制:
-
工程单位换算(mm→脉冲)
structuredtext复制// 示例:将100mm转换为脉冲数 rPositionMM := 100.0; // 目标位置(mm) rPulseCount := (rPositionMM / stMechParam.rLead) * stMechParam.uPlsPerRev * stMechParam.rGearRatio; -
脉冲输出模式处理
- CW/CCW模式:分别控制两个输出点
- AB相模式:需要生成相位差90°的脉冲
-
位置闭环校验
structuredtext复制IF ABS(rActualPos - rCommandPos) > rPosTolerance THEN iErrorCode := E_PositionError; TriggerAlarm(); END_IF;
3.2 异常处理机制
产线环境中的突发状况(如断电、机械卡阻)必须得到妥善处理。本程序实现了分级异常处理:
-
轻级异常(如到位超时):
- 自动重试3次
- 记录异常日志
- 维持伺服使能状态
-
中级异常(如位置偏差过大):
- 立即停止脉冲输出
- 保持伺服使能
- 等待操作员确认
-
严重异常(如驱动器报警):
- 切断伺服使能
- 触发急停输出
- 锁定所有运动指令
structuredtext复制// 急停处理示例(错误示范)
// 直接切断使能会导致机械冲击
// bServoEnable := FALSE;
// 正确做法
IF bEmergencyStop THEN
SendDecStopCommand(); // 发送减速停止
WAIT UNTIL rActualSpeed < 0.1*rCommandSpeed;
bServoEnable := FALSE;
END_IF;
4. 工程应用经验分享
4.1 调试技巧与参数整定
伺服系统调试需要遵循特定步骤才能获得最佳性能:
-
刚性调整顺序:
- 先调位置环比例增益(P)
- 再调速度环积分时间(I)
- 最后微调速度环比例增益(P)
-
典型参数设置范围:
参数类型 普通传送带 高精度定位 备注 位置P 30-50 80-120 单位:1/s 速度P 100-150 200-300 单位:% 速度I 20-30 40-60 单位:ms -
现场调试口诀:
- "先慢后快":初始测试用低速
- "先空载后负载":不带载调基本参数
- "先单轴后多轴":多轴系统逐个调试
4.2 常见问题解决方案
根据30台设备运行数据统计,最常见问题及解决方法如下:
-
问题:定位完成后有轻微抖动
- 检查项:
- 机械背隙是否过大
- 伺服刚性是否不足
- 负载惯量比是否合理
- 解决方案:
- 增加位置环滤波参数
- 调整伺服陷波滤波器
- 检查项:
-
问题:原点回归位置不一致
- 检查项:
- DOG信号抖动(建议改用硬件滤波)
- Z相信号干扰(检查屏蔽接地)
- 机械结构松动
- 解决方案:
- 在FB中增加软件去抖逻辑
structuredtext复制// DOG信号去抖处理 IF xDOG_In THEN iDogCounter := iDogCounter + 1; IF iDogCounter > 5 THEN // 5ms滤波 bDOG_Valid := TRUE; END_IF; ELSE iDogCounter := 0; END_IF;
- 检查项:
-
问题:高速运行时丢脉冲
- 检查项:
- 脉冲电缆是否使用双绞屏蔽线
- 驱动器输入阻抗是否匹配
- PLC输出频率是否超限
- 解决方案:
- 改用差分脉冲输出(Q系列支持差动输出)
- 降低最高运行频率20%测试
- 检查项:
5. 功能扩展与高级应用
5.1 电子齿轮与凸轮同步
在后续版本中,FB增加了电子齿轮同步功能,实现主从轴联动:
structuredtext复制// 电子齿轮比设置
rGearRatio := rMasterPos / rSlavePos;
IF bSyncEnabled THEN
rCmdPos := rMasterPos * rGearRatio;
MoveAbsolute(rCmdPos);
END_IF;
对于需要相位同步的应用(如旋转刀库),可启用电子凸轮模式:
- 预先定义凸轮曲线(位置-位置关系表)
- 运行时实时查表计算目标位置
- 采用二阶插值提高曲线平滑度
5.2 多轴插补控制
通过扩展FB接口,实现了简单的直线插补功能:
-
在调用FB前计算各轴分配位移
structuredtext复制// X-Y平面直线插补位移分配 rTotalDist := SQRT(rDeltaX**2 + rDeltaY**2); rX_Ratio := rDeltaX / rTotalDist; rY_Ratio := rDeltaY / rTotalDist; -
同步启动多轴运动
structuredtext复制// 同步启动两个轴 fbAxisX.MoveRelative(rDistance * rX_Ratio); fbAxisY.MoveRelative(rDistance * rY_Ratio); // 等待所有轴完成 WAIT UNTIL fbAxisX.bMotionDone AND fbAxisY.bMotionDone;
这套FB程序从最初的单轴控制发展到如今支持多轴协同作业,其核心优势在于清晰的架构设计。所有运动控制逻辑集中在FB内部处理,外部只需调用简单接口。这种设计使得程序在保持功能强大的同时,使用门槛大大降低——新手工程师经过简单培训即可完成基本操作,而高级功能又为复杂应用留出了扩展空间。