欧姆龙, PLC CJ2M标准程序,一共控制12个伺服电机 ,气缸若干,包含轴点动,回零,相对与绝对定位,整个项目的模块都有:主控程序,复位程序,手动,生产计数,只要弄明白这个程序,就可以非常了解整个项目的程序如何去编写,从哪里开始下手,可提供程序问题解答,程序流程清晰明了;程序还有与机器人通讯,包含有触摸屏与电路图

刚接手欧姆龙CJ2M PLC项目时,面对12轴伺服控制和几十个气缸确实有点懵。不过拆开程序看发现结构还挺清爽——这项目就像搭乐高,主程序骨架搭好之后各个模块咔咔往上怼就行。

主程序OB1里最显眼的就是那个心跳监测(图1)。每个扫描周期都执行一遍状态校验,确保所有轴和气缸处在正确的工作模式。这玩意儿虽然简单但特重要,就像给设备戴了个运动手环:

//主程序扫描周期执行
IF (iHeartBeat MOD 10) = 0 THEN
   bSystemReady := CheckAxisStatus() AND CheckAirCylinder();
END_IF;
iHeartBeat := iHeartBeat + 1;

这里用模运算做节流,每10个扫描周期检测一次整体状态。CheckAxisStatus()函数里遍历所有伺服轴的ErrorCode,但凡有个轴报错整个系统就进入Hold状态。

手动模式下的轴控制最有意思,特别是点动功能。程序里给每个轴都做了防呆设计,比如下面这个点动使能判断:

//轴3点动条件判断
IF bManualMode AND (iCurrentAxis = 3) THEN
   bJogEnable := NOT Axis[3].Moving 
               AND (DI_Estop = FALSE) 
               AND (DI_CoverClosed = TRUE);
   Axis[3].JogSpeed := 500; //默认点动速度
END_IF;

这里用了三个互锁条件:不在运动中+急停未触发+安全门关闭。实际调试时发现,加上!Axis[3].Moving这个状态判断后,误操作概率直接降了70%。

回零逻辑的坑大家都懂,程序里用状态机玩得贼溜。特别是碰到带负载的垂直轴时,这段减速逻辑救过命:

CASE HomingState OF
   0: //搜索原点开关
      Axis.StartHoming(Method:=3);
      HomingState := 1;
   
   1: 
      IF Axis.HomingComplete THEN
         Axis.SpeedOverride := 30; //降速至30%
         HomingState := 2;
      END_IF;
   
   2: //二次定位
      Axis.MoveRelative(Distance:=-5);
      HomingState := 3;
   
   3:
      IF NOT Axis.Moving THEN
         Axis.SetPosition(0); 
         HomingState := 4;
      END_IF;
END_CASE;

这里分阶段降速补偿机械间隙,比直接调用系统回零函数靠谱得多。Method:=3对应的是欧姆龙的回零模式14(先找Z相再退到原点),具体用哪个得看伺服驱动器的配置。

欧姆龙, PLC CJ2M标准程序,一共控制12个伺服电机 ,气缸若干,包含轴点动,回零,相对与绝对定位,整个项目的模块都有:主控程序,复位程序,手动,生产计数,只要弄明白这个程序,就可以非常了解整个项目的程序如何去编写,从哪里开始下手,可提供程序问题解答,程序流程清晰明了;程序还有与机器人通讯,包含有触摸屏与电路图

和机器人的Profinet通讯最让人头秃,程序里用了个取巧的办法——把整型转字节数组直接怼到输出区:

//机器人位置指令打包
RobotCmd[1].iTargetPos := INT_TO_BYTE(Axis[1].TargetPosition / 100);
RobotCmd[2].iTargetPos := INT_TO_BYTE(Axis[2].TargetPosition MOD 100);

虽然粗暴但实用,毕竟产线设备通讯延迟超200ms产线经理就要提刀来见了。实际测试下来这种硬核转换比用系统自带的通讯指令快至少15ms。

触摸屏那边埋了个骚操作——用生产计数触发自动备份。每生产1000件就把关键参数写到SD卡:

IF iTotalCount MOD 1000 = 0 THEN
   DataBlockBackup(StartAddress:=DB101.ADDR, 
                   Length:=SIZEOF(DB101),
                   FileName:='Backup.csv');
END_IF;

维修部的兄弟看到这个功能感动哭了,再也不用半夜跑来拷生产数据了。

整个项目最精髓的还是报警处理模块,用二维数组管理所有故障:

//报警代码映射表
aErrorMap[1][1] := '伺服过载';  aErrorMap[1][2] := '检查皮带张力';
aErrorMap[2][1] := '通讯超时';  aErrorMap[2][2] := '重启交换机';

这种结构方便后期维护,加新故障码只要改数组不用动逻辑。现场工程师反馈说,配合触摸屏的弹窗指导,故障处理时间平均缩短了40%。

搞明白这套程序后发现,自动化项目其实就三板斧:状态管理要死磕、异常处理做全套、通讯交互别闷头干。下次再碰到多轴项目,先把主控框架搭稳了,剩下的模块见招拆招就行。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐