平顶山市网站建设_网站建设公司_阿里云_seo优化
2026/1/9 20:25:58 网站建设 项目流程

欧姆龙程序,Sysmac Studio伺服程序打包块,直接调用,并实现以下功能: 硬件:NJ101-1000 R88D-KN01H系列伺服 输入信号如下: 1:使能输入和故障复位。 2:点动正转和反转(速度可调) 3:回原点模式,参考图五传感器安装位置, 前极限?原点?后极限。 开始(高速)后退-原点感应或后极限感应-(慢速)前进-离开原点瞬间停止并清零当前位置(原点确认)。 4:绝对运行,必须回原点完成才能执行此模式(速度可调)。 5:上述三种模式有4种速度可设定。 点动速度?原点快速?原点慢速?绝对速度。 6:极限开关信号输入。 信号输出如下: 1:使能状态和故障错误信息。 2:当前速度和当前位置 3:连锁信号输出如下: 1: 点动前进中,不可执行其他模式。 2:点动后退中,不可执行其他模式。 3:原点定位中,不可执行其他模式。 4:绝对定位中,不可执行其他模式。 4:原点完成信号输出。 通过此封装块,直接驱动EherCat伺服

最近在NJ控制器上折腾伺服控制,总结了一套Sysmac Studio的伺服程序封装块。以R88D-KN01H伺服驱动为例,咱们直接上干货看看怎么通过EtherCAT实现多模式控制。

先整伺服使能的基础操作:

// 伺服使能块 IF bEnable THEN MC_Power( Axis:=Axis1, Enable:=TRUE, Status=>stPowerStatus, Error=>errPower, ErrorID=>errPowerID); bEnabled := stPowerStatus.Enable; ELSE MC_Power(Axis:=Axis1, Enable:=FALSE); END_IF // 故障复位 IF bReset AND errPower THEN MC_Reset(Axis:=Axis1, Execute:=TRUE); END_IF

这里用了MC_Power指令控制伺服上电,注意Enable信号要持续保持。故障复位需要先断开使能再执行,复位成功后重新上电。

点动正反转带速度斜坡:

// 点动前进 IF NOT bBusy AND bJogFwd THEN MC_MoveVelocity( Axis:=Axis1, Execute:=TRUE, Velocity:=nJogSpeed, // 可调参数 Acceleration:=1000, Deceleration:=1000); bBusy := TRUE; END_IF // 点动停止逻辑 IF bJogFwd OR bJogRev THEN IF NOT (bJogFwd OR bJogRev) THEN MC_Stop(Axis:=Axis1, Execute:=TRUE); bBusy := FALSE; END_IF END_IF

这里用了互锁标记bBusy防止重复触发。速度参数nJogSpeed通过全局变量暴露,方便上位机调整。

回原点模式有个坑要注意传感器响应顺序:

// 原点搜索状态机 CASE nHomeState OF 0: // 启动高速后退 IF bHomeStart THEN MC_Home( Axis:=Axis1, Execute:=TRUE, Position:=0, Mode:=3); // 极限开关优先模式 nHomeState := 1; END_IF 1: // 检测到后极限或原点 IF bRearLimit OR bOrigin THEN MC_Stop(Axis:=Axis1, Execute:=TRUE); MC_MoveVelocity( Axis:=Axis1, Execute:=TRUE, Velocity:=nHomeSlowSpeed, // 低速参数 Direction:=MC_Positive); nHomeState := 2; END_IF 2: // 原点信号消失时停止 IF NOT bOrigin THEN MC_Stop(Axis:=Axis1, Execute:=FALSE); Axis1.ActPos := 0; // 硬核清零位置 bHomeOK := TRUE; nHomeState := 0; END_IF END_CASE

这里用状态机实现两段式搜索,注意Mode参数选择直接影响搜索方向。清零位置时直接操作Axis变量比较暴力但有效。

绝对定位必须加互锁:

// 绝对运动执行条件 IF bAbsEnable AND bHomeOK AND NOT bBusy THEN MC_MoveAbsolute( Axis:=Axis1, Execute:=TRUE, Position:=nTargetPos, Velocity:=nAbsSpeed, // 可调速度 Acceleration:=2000, Deceleration:=2000); END_IF

这里通过bHomeOK标志确保必须先回零,用bBusy防止模式冲突。

连锁信号处理有个小技巧:

// 互锁输出生成 bInterlock := MC_MoveVelocity.Busy OR MC_Home.Busy OR MC_MoveAbsolute.Busy; // 模式互斥判断 IF (bJogFwd OR bJogRev) AND (bHomeStart OR bAbsEnable) THEN AlarmCode := 16#1001; // 自定义错误码 END_IF

直接读取功能块的Busy状态比自己做标记更可靠。遇到冲突时抛出错误码而不是直接停止,避免急停冲击。

速度参数建议做成结构体:

TYPE SpeedProfile : STRUCT JogSpeed : LREAL; // 点动速度 HomeFast : LREAL; // 原点高速 HomeSlow : LREAL; // 原点低速 AbsSpeed : LREAL; // 定位速度 END_STRUCT END_TYPE

这样在HMI修改参数时能整组导入,避免单个修改导致速度曲线不匹配。

实测中发现原点搜索时偶尔会冲过传感器,后来在轴配置里把硬限位触发动作设为立即停止(Immediate Stop)才解决。另外建议在MC_Home指令后加500ms延时再执行下一步动作,给伺服足够时间稳定。

封装成功能块后调用贼方便:

// 主程序调用 ServoBlock( Axis:=Axis1, bEnable:=TRUE, bReset:=FALSE, nJogSpeed:=200.0, bHomeOK=>bOriginDone);

记得在轴配置里设置正确的软限位范围和EtherCAT PDO映射。这套逻辑跑了两个月没出过飞车事故,算是经受住了产线老哥的暴力测试。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询