博图程序块(TIA) 多台电机依据电机变频、工频运行状态、死区设定自动判断是否增减电机运行数量
博图程序块(TIA) 多台电机依据电机变频、工频运行状态、死区设定自动判断是否增减电机运行数量,集功能于一身的FB块导入即可使用,提高编程效率 #Schneider Electric/施耐德 #Mitsubishi/三菱
在工控项目里最头疼的就是多电机联调,尤其是变频/工频切换这种要命场景。去年做造纸产线时,8台浆泵要实时根据压力波动自动增减运行数量,还要考虑死区时间防止频繁启停,手写逻辑差点没累死。后来在TIA Portal里封装了个智能电机调度FB块,现在直接拖进项目就能用。
博图程序块(TIA) 多台电机依据电机变频、工频运行状态、死区设定自动判断是否增减电机运行数量,集功能于一身的FB块导入即可使用,提高编程效率 #Schneider Electric/施耐德 #Mitsubishi/三菱
这个FB的核心是状态机+动态优先级算法。先定义个结构体存电机参数:
TYPE Motor_Status : STRUCT CurrentSpeed : REAL; // 当前转速 RunningMode : INT; // 0=停止 1=工频 2=变频 StartTime : TIME; // 本次启动时间 FaultCode : WORD; // 故障代码 END_STRUCT END_TYPE死区判断用了个滑动窗口机制,防止压力传感器的小幅抖动触发误操作。比如设定±0.2MPa的死区,当实际压力连续5秒超出设定范围才触发调整:
IF ABS(ActualPressure - SetPressure) > DeadBand THEN DeadBandTimer := DeadBandTimer + T#1S; IF DeadBandTimer >= T#5S THEN NeedAdjust := TRUE; END_IF ELSE DeadBandTimer := T#0S; END_IF电机切换策略最烧脑。我的方案是优先切换运行时间最长的工频电机,变频电机作为缓冲层。举个实例代码片段:
// 查找可切换的工频电机 FOR #i := 0 TO MAX_MOTORS-1 DO IF Motor[#i].RunningMode = 1 AND Motor[#i].StartTime < OldestMotorTime THEN OldestMotorIndex := #i; OldestMotorTime := Motor[#i].StartTime; END_IF END_FOR // 执行切换 IF NeedReduce AND OldestMotorIndex <> -1 THEN Motor[OldestMotorIndex].RunningMode := 0; StartCooldownTimer(OldestMotorIndex); // 启动冷却计时 END_IF实际调试时发现个坑:施耐德ATV312变频器的就绪信号有300ms延迟,三菱FR-A800系列更长达500ms。在FB里加了硬件品牌判断分支:
CASE Brand OF 0: // 施耐德 DelayTime := T#300MS; 1: // 三菱 DelayTime := T#500MS; END_CASE TON_Instance(IN:=StartCommand, PT:=DelayTime); IF TON_Instance.Q THEN EnablePowerSection := TRUE; END_IF这个FB块现在已经成为我们团队的标配,最近在橡胶挤出机项目里成功控制12台主电机+6台辅机的协同运行。下次如果有人让你写电机调度逻辑,别急着从零开始——复制这个FB,改改参数就能跑,省下的时间够喝两壶咖啡了。
