西门子1200和1500通用博图编程普通电机控制程序块。 包括正转,反转,变频控制,模拟量,故障,故障复位,控制字来显示电机的6种状态等,底层使用SCl编程,直接可以导出库文件, 打开版本支持v15及以上版本
一、控制字设计先来搞个控制字,这玩意儿相当于电机的遥控器。咱们用Word类型变量拆成16个bit位,每个bit对应不同操作:
VAR_INPUT ControlWord : WORD; //控制字输入 END_VAR // 控制字位解析 #Start := ControlWord.0; //启停位 #Forward := ControlWord.1; //正转 #Reverse := ControlWord.2; //反转 #Reset := ControlWord.3; //故障复位比如上位机发个16#0007过来,相当于同时触发启动+正转+反转——当然这时候咱们程序得做个互锁,别让电机原地爆炸。
二、正反转互锁逻辑
IF #Forward AND NOT #Reverse THEN Motor_Direction := 1; //正转标记 ELSIF #Reverse AND NOT #Forward THEN Motor_Direction := 2; //反转标记 ELSE Motor_Direction := 0; //停机状态 END_IF;这里用了最简单的与或非门实现硬互锁,比PLC自带的互锁指令更灵活,后期改逻辑不用翻帮助文档。
三、模拟量处理变频器控制必须处理4-20mA信号,核心是量程转换:
#RawValue := NORM_X(IN := AnalogInput, MIN := 0, MAX := 27648); //归一化 #Frequency := SCALE_X(IN := #RawValue, MIN := 0.0, MAX := 50.0); //转实际频率注意这里用的新版SCALE_X函数,V15以下版本的老铁得用传统计算公式手动换算。
四、故障全家桶处理
IF ThermalOverload OR PhaseLoss THEN FaultLatched := TRUE; //故障锁存 END_IF; IF #Reset THEN FaultLatched := FALSE; //复位信号 END_IF;这里用了状态锁存机制,故障触发后就算信号消失也会保持报警状态,必须人工复位。实际项目遇到过有人接接近开关电源反接导致疯狂误报,这种设计能避免产线抽风。
五、状态字打包
StatusWord.0 := Motor_Direction <> 0; //运行状态 StatusWord.1 := Motor_Direction = 1; //正转状态 StatusWord.2 := Motor_Direction = 2; //反转状态 StatusWord.3 := #Frequency >= 45.0; //超频预警 StatusWord.4 := FaultLatched; //故障状态 StatusWord.5 := NOT EmergencyStop; //急停状态状态字每个bit都是独立信号,上位机可以直接位操作读取。曾经有个项目因为没做位拆分,导致DCS系统解析异常,血泪教训啊!
六、库文件导出姿势
- 右键FB块选"创建类型"
- 勾选"版本兼容性"
- 导出时记得勾选V15兼容模式
- 测试时用PLCSIM Advanced跑仿真
最后放个调用示例:
Motor_FB( ControlWord := "DB_Control".Motor1_Ctrl, AnalogInput := "%IW64", StatusWord => "DB_Status".Motor1_Status );这个块在多个现场实际跑过,最久的一台已经稳定运行2万小时。调试时建议先用输出强制功能模拟信号,别直接上真电机——别问我怎么知道的,说多了都是电机抱闸的焦糊味...