西门子S7-1200PLC伺服电机运动控制FB功能块 1.该FB块是我集成的一个功能块,可以实现脉冲方式控制伺服电机位置控制。 2.一个块就可以实现伺服的上电,使能,相对定位,绝对定位,JOG运行,回原控制(包括碰到极限反找原位功能),以及故障清除和伺服状态显示等。 3.该块核心是将西门子库motion Control中的函数块集成,系统里有几个伺服就调用几个我这块就可以,使用控制简单,用我这FB块减少开发和调试时间,具体的块如下所示。
搞PLC的老司机都懂,伺服控制这玩意儿写起来是真费劲。去年在产线上被客户催工期逼得头皮发麻,硬是憋出来个万能伺服控制块。今天就跟大伙儿唠唠这个S7-1200的瑞士军刀式FB块,绝对比官方库那堆零散函数块好用十倍。
先看这个FB块的核弹级功能:
- 一键上电使能(省去每次手动置位ENA的麻烦)
- 绝对/相对定位自由切换
- 极限反转回原黑科技
- 故障自检带状态LED显示
- JOG微动模式(调试神器)
FUNCTION_BLOCK FB_ServoCtrl VAR_INPUT AxisNo : Int; //轴号 JogForward : Bool; //正转点动 JogBackward : Bool; //反转点动 SetPosition : Real; //目标位置 HomingCmd : Bool; //回原点命令 END_VAR VAR_OUTPUT CurrentPos : Real; //实时位置 StatusLight : Byte; //状态指示灯 ErrorCode : Word; //故障代码 END_VAR核心代码其实是把官方MCPower、MCMoveRelative这些函数块打包成了全家桶。比如回原功能里藏着个骚操作:
//极限反转逻辑 IF HomingSensor AND LimitSwitch_Neg THEN MC_MoveVelocity(Axis:=Axis_1, Velocity:=100.0, Direction:=Negative); ELSIF HomingSensor AND LimitSwitch_Pos THEN MC_MoveVelocity(Axis:=Axis_1, Velocity:=100.0, Direction:=Positive); END_IF;这招专门对付那些安装位置刁钻的伺服,碰到限位开关会自动反方向找原点,比传统回原方式靠谱多了。
状态显示部分直接打包了伺服驱动器的状态字:
StatusLight := SHL(MC_ReadStatus.Warning, 8) OR MC_ReadStatus.ActualPosition;用字节数据的每一位对应不同状态,上位机都不用写复杂解析,直接接个指示灯组就能显示伺服状态。
西门子S7-1200PLC伺服电机运动控制FB功能块 1.该FB块是我集成的一个功能块,可以实现脉冲方式控制伺服电机位置控制。 2.一个块就可以实现伺服的上电,使能,相对定位,绝对定位,JOG运行,回原控制(包括碰到极限反找原位功能),以及故障清除和伺服状态显示等。 3.该块核心是将西门子库motion Control中的函数块集成,系统里有几个伺服就调用几个我这块就可以,使用控制简单,用我这FB块减少开发和调试时间,具体的块如下所示。
实际使用时简直无脑:
//实例化三个伺服 FB_ServoCtrl[1](AxisNo:=1, SetPosition:=500.0); FB_ServoCtrl[2](AxisNo:=2, HomingCmd:=TRUE); FB_ServoCtrl[3](AxisNo:=3, JogForward:=%I0.5);每个电机独立控制互不干扰,现场调试时改个轴号就能直接复用。上次帮隔壁产线改设备,原本两周的调试量,用这个块两天就收工了。
这个FB最阴险的设计其实是错误处理机制——只要检测到驱动器报警,自动往控制柜的蜂鸣器发脉冲信号。有次凌晨设备趴窝,值班小哥就是被这蜂鸣器的死亡咆哮震醒的,现在全厂电工都记得这个"叫床服务"。
最后给个忠告:别在FB里写死脉冲当量,像这样加个转换系数参数才是王道:
RealPosition := RawPulse * UserCalibrationFactor; //脉冲转实际位移毕竟机械设计那帮兄弟改个减速比就跟吃饭似的,咱们程序狗得给自己留条后路啊。