在SCL(Structured Control Language)中编写一个掌握电机FB,使其速率可调、可正反转,并在FB被首次调用时初始化,我们须要定义相应的输入、输出和内部变量,并编写逻辑来处理这些功能。以下是一个简化的示例:FUNCTION_BLOCK FB_MotorControlVAR_INPUT StartCommand : BOOL; // 启动命令 StopCommand : BOOL; // 停滞命令 SpeedSetpoint : INT; // 速率设定点(正值表示正转,负值表示反转,绝对值表示速率大小)END_VARVAR_OUTPUT MotorRunning : BOOL; // 电机运行状态 MotorSpeed : INT; // 电机当前速率(带符号,表示方向)END_VARVAR IsInitialized : BOOL; // 标记FB是否已初始化 LastCommand : BOOL; // 上次吸收到的有效命令(启动或停滞) LastSpeedSetpoint : INT; // 上次的速率设定点 MotorDirection : BOOL; // 电机方向(TRUE为正转,FALSE为反转) CurrentSpeed : INT; // 电机当前速率的内部表示(带符号)END_VARBEGIN // 初始化逻辑 IF NOT IsInitialized THEN // 设置初始状态或参数 CurrentSpeed := 0; // 初始速率为0 MotorRunning := FALSE; // 电机初始状态为停滞 LastCommand := FALSE; // 假设初始时没有命令 LastSpeedSetpoint := 0; // 初始速率设定点为0 IsInitialized := TRUE; // 标记FB已初始化 END_IF; // 速率和方向处理逻辑 IF StartCommand AND NOT LastCommand THEN // 如果吸收到启动命令且上次不是启动命令 MotorRunning := TRUE; // 根据SpeedSetpoint设置方向和速率 IF SpeedSetpoint >= 0 THEN MotorDirection := TRUE; // 正转 ELSE MotorDirection := FALSE; // 反转 END_IF; CurrentSpeed := ABS(SpeedSetpoint); // 取绝对值作为速率大小 ELSIF StopCommand AND MotorRunning THEN // 如果吸收到停滞命令且电机正在运行 MotorRunning := FALSE; CurrentSpeed := 0; // 停滞电机 ELSIF SpeedSetpoint <> LastSpeedSetpoint THEN // 如果速率设定点变革且电机正在运行 // 这里直接更新速率大小和方向,但常日会有更繁芜的逻辑来处理加速/减速 IF SpeedSetpoint >= 0 THEN MotorDirection := TRUE; // 正转 ELSE MotorDirection := FALSE; // 反转 END_IF; CurrentSpeed := ABS(SpeedSetpoint); // 更新速率大小 END_IF; // 更新末了命令状态和速率设定点 LastCommand := StartCommand OR StopCommand; LastSpeedSetpoint := SpeedSetpoint; // 输出电机状态 MotorSpeed := CurrentSpeed SIGN(SpeedSetpoint); // 根据方向调度速率的符号END_FUNCTION_BLOCK上面的代码有几个简化和假设:MotorSpeed 输出是根据 CurrentSpeed 和 SpeedSetpoint 的符号来打算的,以表示电机的实际速率(包括方向)。这里利用了 SIGN 函数来获取 SpeedSetpoint 的符号(+1 或 -1),然后将其与 CurrentSpeed 相乘。然而,在实际运用中,CurrentSpeed 可能须要根据电机的实际反馈来更新,而不是仅仅基于 SpeedSetpoint。加速和减速过程在这个示例中没有详细处理。在实际运用中,你可能须要实现一个PID掌握器或其他类型的速率掌握算法来平滑地调度电机的速率。LastCommand 变量用于检测启动或停滞命令的变革,但在这个特定的示例中,它可能不是严格必要的,由于 StartCommand 和 StopCommand 的组合已经足够用来掌握电机的状态。然而,保留它可以帮助你在更繁芜的情形下更随意马虎地扩展逻辑。LastSpeedSetpoint 用于检测速率设定点的变革,并据此更新电机的速率和方向。然而,如果速率掌握逻辑更繁芜(例如,包含加速/减速逻辑),则可能须要更风雅的跟踪和比较。请把稳,SCL的详细语法和功能可能因所利用的PLC和编程环境而异。上面的代码是基于一样平常性的SCL语法编写的,但你可能须要根据你的详细环境进行调度。
用西门子SCL措辞编写一个掌握电机FB速率可调,可正反转,...

http://bbs.plcjs.com/forum.php?mod=viewthread&tid=498705&fromuid=17
(出处: PLC论坛-全力打造可编程掌握器专业技能论坛)
#plc#