汇川codesys程序,轴控制标准功能块框架程序 1、更新FB轴错误ID内容 (错误显示字符A~F)。 2、增加龙门移动回零FB。 仿真19、23模式,需要设置轴回零参数为35。 3、添加HMC_MoveVelocit 时时修改速度 4、添加FB写飞拍参数。 直接写入伺服参数,不需要配置PDO 1.1版本2、轴掉线,重启从站FB块 3、探针功能FB块 4、可视错误代码,字符形式SV660N作为参考
最近给厂里龙门架设备做功能升级,轴控制这块折腾出不少实战经验。今天重点聊聊几个关键功能块的实现细节,直接上干货。
错误码转字符显示这个需求看起来简单,实际要考虑伺服驱动器的特殊协议。SV660N的错误码映射表里A-F对应着不同的故障类型,直接上代码:
FUNCTION_BLOCK FB_ErrorCodeTranslator VAR_INPUT iErrorID : WORD; END_VAR VAR_OUTPUT sErrorChar : STRING(1); END_VAR CASE iErrorID OF 16#A000: sErrorChar := 'A'; //过流保护 16#B001: sErrorChar := 'B'; //编码器异常 16#C002: sErrorChar := 'C'; //超温报警 //...其他错误码映射 ELSE sErrorChar := '?'; END_CASE;这里用16进制直接匹配错误ID更直观,现场维护人员看到字符就能秒懂故障类型,比查代码手册效率高多了。
龙门回零功能最坑的是仿真模式参数设置。测试时发现19/23模式的回零动作总卡在减速阶段,后来发现缺了这行关键配置:
AxisParam.stHoming.uHomingMode := 35; //强制指定模式参数回零流程的状态机设计值得细说:
CASE stHomingState OF 0: //启动搜索 MC_Home(Axis:=AxisRef); stHomingState := 10; 10: //等待到位 IF NOT AxisRef.Status.HomingActive THEN IF AxisRef.Status.Error THEN //触发报警处理 ELSE stHomingState := 20; END_IF END_IF //...后续状态处理 END_CASE这个状态迁移逻辑比直接用功能块完成度更高,方便后期扩展异常处理分支。
汇川codesys程序,轴控制标准功能块框架程序 1、更新FB轴错误ID内容 (错误显示字符A~F)。 2、增加龙门移动回零FB。 仿真19、23模式,需要设置轴回零参数为35。 3、添加HMC_MoveVelocit 时时修改速度 4、添加FB写飞拍参数。 直接写入伺服参数,不需要配置PDO 1.1版本2、轴掉线,重启从站FB块 3、探针功能FB块 4、可视错误代码,字符形式SV660N作为参考
实时改速度功能看似基础,但要做到无冲击变速得注意参数衔接。核心是HMC_MoveVelocity功能块的调用方式:
HMC_MoveVelocity( Axis := AxisRef, Velocity := rRealTimeSpeed, //外部实时传入 Acceleration := 1000.0, Deceleration := 1000.0, Direction := iDirection, Execute := TRUE );重点在于外部变量rRealTimeSpeed要通过HMI实时修改,配合10ms任务周期,实测速度切换响应能控制在30ms以内。
飞拍参数直写功能跳过了PDO配置环节,用底层寄存器操作更直接。比如修改电子齿轮比参数:
MC_BR_WriteParameter( Axis := AxisRef, Index := 16#607C, //目标位置寄存器 SubIndex := 0, Value := rNewValue, Execute := TRUE );这种硬核操作需要提前确认伺服驱动器的寄存器映射表,不同型号的索引值可能差异很大。实测比走PDO通讯快0.5ms左右,对高速飞拍场景很关键。
新加的轴重启功能里有几个魔鬼细节:
- 检测到EtherCAT从站掉线时,先发MC_Power(FALSE)停用轴
- 延时200ms后重新初始化ECAT从站
- 轴使能前必须重置所有运动参数
特别是第三步,很多新手会漏掉导致二次故障。建议在FB里加状态清理函数:
PROCEDURE ResetAxisState AxisRef.ErrorReset := TRUE; AxisRef.Power := FALSE; AxisRef.MoveAbsolute.Active := FALSE; //...其他状态位重置探针功能实现时遇到个坑:普通DI信号采集有3ms延迟,后来换成硬件中断触发才达到微秒级精度。触发后的坐标捕获代码要放在高速任务中执行:
IF HardwareTrigger THEN rCapturePos := AxisRef.ActualPosition; //立即锁存到全局变量 GV_ProbeData[iProbeIndex] := rCapturePos; END_IF这次升级踩的坑比想象中多,但实测效果不错。设备现在跑满120米/分钟的速度,飞拍定位精度还能保持在±0.1mm。下次准备把HMI报警界面改成动态错误码显示,配合声光报警应该能再缩短30%的故障处理时间。