欧姆龙 PLC 程序NJ ST语言EtherCat总线控制24个伺服轴大型程序电池生产线 包括PLC NJ-1400和威纶通触摸屏程序 PLC通过EtherCat总线连接IS620N伺服 伺服轴已经写好FB块,可以直接复制粘贴 通过EtherCat连接6个扫描枪 扫描枪通讯已经写好FB块 通过EtherCat连接将近100个远程IO终端 详细IO表,中文详细注释,工艺,位置变量等详细说明
最近手头刚搞完一个电池生产线的自动化项目,用欧姆龙NJ-1400控制器搞定了24个伺服轴联调。这活挺有意思的,特别是EtherCat总线的性能确实能打,咱们今天就来唠点实战干货。
先说硬件架构,NJ-1400本体带着EtherCat主站,底下挂了24台IS620N伺服,6个扫码枪,还有近百个远程IO站。这规模在产线上不算小,关键得把拓扑结构理清楚。我们在Sysmac Studio里做的网络配置,给每个从站设PDO映射时得特别注意数据对齐问题。
伺服轴这块我们做了标准FB块,直接上代码:
FUNCTION_BLOCK AxisControl VAR_INPUT bEnable: BOOL; // 使能信号 fTargetPos: LREAL; // 目标位置 END_VAR VAR_OUTPUT bReady: BOOL; // 就绪状态 fActualPos: LREAL; // 实际位置 END_VAR VAR // 内部状态机 iState: INT := 0; // 轴实例 stAxis: MC_Power; END_VAR CASE iState OF 0: // 初始化 IF NOT stAxis.Status.Enabled THEN stAxis(Enable:=TRUE); END_IF iState := 10; 10: // 运动准备 IF stAxis.Status.Enabled THEN bReady := TRUE; // 触发定位动作... END_IF END_CASE这FB的核心逻辑在于状态机切换和伺服使能顺序。特别注意MC_Power功能块的使能时机,过早触发会导致EtherCat同步报错。我们实测每个伺服轴的配置参数需要单独保存,直接复制轴参数时记得改节点地址和轴编号。
扫码枪的通讯处理更刺激,6个RS232转EtherCat模块同时工作。数据接收用了环形缓冲区策略:
// 扫码数据缓存结构 TYPE ScanDataBuffer : STRUCT sData : ARRAY[0..63] OF STRING(32); // 64条数据缓存 wWriteIndex : UINT := 0; wReadIndex : UINT := 0; END_STRUCT END_TYPE // 数据接收中断处理 IF bNewData THEN stScannerBuffer.sData[stScannerBuffer.wWriteIndex] := sRawData; stScannerBuffer.wWriteIndex := (stScannerBuffer.wWriteIndex +1) MOD 64; // 触发数据处理任务 bDataPending := TRUE; END_IF这里用了模运算实现环形队列,避免内存越界。实际调试发现扫码枪的结束符设置必须和PLC的接收超时匹配,否则容易丢包。
远程IO这块最坑的是信号干扰问题。我们给每个IO站做了心跳检测:
// IO站状态监控 FOR i:=1 TO 100 DO IF NOT astIOStatus[i].bActive THEN tWatchdog[i](IN:=NOT tWatchdog[i].Q); IF tWatchdog[i].Q THEN // 触发报警处理 HandleIOFault(i); END_IF END_IF END_FOR每个远程站用2秒周期的心跳信号,超时三次直接切到安全状态。变量命名我们按 <工位><设备><功能> 的格式,比如"注液机Pump23Alarm"这种,后期维护真能省不少事。
最后说下威纶通触摸屏的交互,重点是把PLC里的结构体变量直接映射到HMI。我们在画面上做了三级操作权限,不同岗位的工人只能操作对应层级的按钮。调试时发现个坑——触摸屏的刷新周期和PLC的扫描周期不同步,后来改成事件触发方式读取关键数据才解决。
整个项目调下来最大的体会是:EtherCat的拓扑结构一定要在前期规划清楚,特别是对于这种多从站的系统,后期改一个节点的位置可能牵一发动全身。还有就是ST编程时多写注释,三个月后自己看代码绝对会感谢现在的自己。