帮我写1个S7-1200的SCL语言电机控制功能块
本帖最后由 zhousimin 于 2023-3-31 11:39 编辑帮我写1个S7-1200的SCL语言电机控制功能块,具体控制要求如下:1、功能块控制的电机总数量为6台;2、功能块输入接口REAL型变量有“LevelPV”,代表液位计数值;3、功能块输入接口INT型变量有“ContNum”,代表控制电机的数量,数量为1~6台;4、功能块输入接口INT型变量有“StartTime”,代表每台电机自动启动的延时,用于防抖;5、功能块输入接口INT型变量有“StopTime”,代表每台电机自动停止的延时,用于防抖;6、功能块输入接口REAL型变量有“ContLevel1”、“ContLevel2”、“ContLevel3”、“ContLevel4”、“ContLevel5”、“ContLevel6”,其中“ContLevel1”~“ContLevel6”代表1~6台数量电机的自控液位值,要求根据“ContLevel1”~“ContLevel6”数值实现自动控制1~6台数量电机启停;7、每台电机的输入接口BOOL型变量有“Auto”、“Able”、“Fault”;8、“Auto”为1代表该台电机为自动模式且参与自动控制,为0则代表处于手动模式且不参与自动控制;9、“Able”为1代表该台电机在自动模式时允许控制,为0则代表自动模式时不控制;10、“Fault”为1代表该台电机出现故障,故障发生时停止该台电机并退出自动模式;11、功能块输入接口BOOL型变量有“FBReset”,代表功能块的复位开关,当所有电机处于手动模式时才允许复位操作。数值为1时将整个功能块记录的所有数据复位为原始值;12、累计每一台电机在自动模式下的运行时间,优先启动运行时间最短的电机,优先停止运行时间最长的电机,要求用冒泡法实现;13、当某台电机出现故障时,实现自动切换,投入其它符合参与自控的正常电机,退出有故障的电机;14、输出当前符合参与自动控制的电机数量,用INT型变量“StandbyNum”表示;15、输出当前正在自动运行中的电机数量,用INT型变量“RunningNum”表示;16、输出6台电机在自动模式下的总运行时间,用REAL型变量“RunTimeTot1”~“RunTimeTot6”表示;17、博图版本为V16,PLC型号为S7-1200。
:lol:lol难度有点高,是时候考验一下AI机器人到底行不行:lol:lol 第一个功能块:
FUNCTION_BLOCK MaxMinValue
VAR_INPUT
InputArr : ARRAY OF REAL; //用于查找最大值最小值的数组,数组长度为10
END_VAR
VAR_OUTPUT
MaxValue : REAL; //最大值
MinValue : REAL; //最小值
END_VAR
VAR
i : INT := 1; //数组下标
END_VAR
//初始化最大值和最小值为第一个元素
MaxValue := InputArr;
MinValue := InputArr;
WHILE i <= 10 DO
IF InputArr > MaxValue THEN //更新最大值
MaxValue := InputArr;
END_IF
IF InputArr < MinValue THEN //更新最小值
MinValue := InputArr;
END_IF
i := i + 1; //数组下标+1
END_WHILE
第二个功能块:
FUNCTION_BLOCK MotorControl
VAR_INPUT
Level : REAL; //液位计数值
ContNum : INT; //控制电机的数量
Auto1, Able1, Fault1 : BOOL; //电机1的三个控制信号
ContLevel1 : REAL; //电机1启动液位
Auto2, Able2, Fault2 : BOOL; //电机2的三个控制信号
ContLevel2 : REAL; //电机2启动液位
Auto3, Able3, Fault3 : BOOL; //电机3的三个控制信号
ContLevel3 : REAL; //电机3启动液位
Auto4, Able4, Fault4 : BOOL; //电机4的三个控制信号
ContLevel4 : REAL; //电机4启动液位
Auto5, Able5, Fault5 : BOOL; //电机5的三个控制信号
ContLevel5 : REAL; //电机5启动液位
Auto6, Able6, Fault6 : BOOL; //电机6的三个控制信号
ContLevel6 : REAL; //电机6启动液位
END_VAR
VAR_OUTPUT
Run1, Run2, Run3, Run4, Run5, Run6 : BOOL; //控制电机开关的信号
END_VAR
//初始化电机状态为关闭
Run1 := FALSE;
Run2 := FALSE;
Run3 := FALSE;
Run4 := FALSE;
Run5 := FALSE;
Run6 := FALSE;
//判断控制的电机数量,最大为6台
CASE ContNum OF
1: //控制1台电机
IF Level >= ContLevel1 THEN //满足启动液位
IF Auto1 = TRUE AND Able1 = TRUE AND Fault1 = FALSE THEN //自动模式且允许控制且无故障
Run1 := TRUE; //打开电机1
END_IF
END_IF
2: //控制2台电机
IF Level >= ContLevel1 THEN //满足启动液位
IF Auto1 = TRUE AND Able1 = TRUE AND Fault1 = FALSE THEN //自动模式且允许控制且无故障
Run1 := TRUE; //打开电机1
END_IF
END_IF
IF Level >= ContLevel2 THEN //满足启动液位
IF Auto2 = TRUE AND Able2 = TRUE AND Fault2 = FALSE THEN //自动模式且允许控制且无故障
Run2 := TRUE; //打开电机2
END_IF
END_IF
3: //控制3台电机
IF Level >= ContLevel1 THEN //满足启动液位
IF Auto1 = TRUE AND Able1 = TRUE AND Fault1 = FALSE THEN //自动模式且允许控制且无故障
Run1 := TRUE; //打开电机1
END_IF
END_IF
IF Level >= ContLevel2 THEN //满足启动液位
IF Auto2 = TRUE AND Able2 = TRUE AND Fault2 = FALSE THEN //自动模式且允许控制且无故障
Run2 := TRUE; //打开电机2
END_IF
END_IF
IF Level >= ContLevel3 THEN //满足启动液位
IF Auto3 = TRUE AND Able3 = TRUE AND Fault3 = FALSE THEN //自动模式且允许控制且无故障
Run3 := TRUE; //打开电机3
END_IF
END_IF
4: //控制4台电机
IF Level >= ContLevel1 THEN //满足启动液位
IF Auto1 = TRUE AND Able1 = TRUE AND Fault1 = FALSE THEN //自动模式且允许控制且无故障
Run1 := TRUE; //打开电机1
END_IF
END_IF
IF Level >= ContLevel2 THEN //满足启动液位
IF Auto2 = TRUE AND Able2 = TRUE AND Fault2 = FALSE THEN //自动模式且允许控制且无故障
Run2 := TRUE; //打开电机2
END_IF
END_IF
IF Level >= ContLevel3 THEN //满足启动液位
IF Auto3 = TRUE AND Able3 = TRUE AND Fault3 = FALSE THEN //自动模式且允许控制且无故障
Run3 := TRUE; //打开电机3
END_IF
END_IF
IF Level >= ContLevel4 THEN //满足启动液位
IF Auto4 = TRUE AND Able4 = TRUE AND Fault4 = FALSE THEN //自动模式且允许控制且无故障
Run4 := TRUE; //打开电机4
END_IF
END_IF
5: //控制5台电机
IF Level >= ContLevel1 THEN //满足启动液位
IF Auto1 = TRUE AND Able1 = TRUE AND Fault1 = FALSE THEN //自动模式且允许控制且无故障
Run1 := TRUE; //打开电机1
END_IF
END_IF
IF Level >= ContLevel2 THEN //满足启动液位
IF Auto2 = TRUE AND Able2 = TRUE AND Fault2 = FALSE THEN //自动模式且允许控制且无故障
Run2 := TRUE; //打开电机2
END_IF
END_IF
IF Level >= ContLevel3 THEN //满足启动液位
IF Auto3 = TRUE AND Able3 = TRUE AND Fault3 = FALSE THEN //自动模式且允许控制且无故障
Run3 := TRUE; //打开电机3
END_IF
END_IF
IF Level >= ContLevel4 THEN //满足启动液位
IF Auto4 = TRUE AND Able4 = TRUE AND Fault4 = FALSE THEN //自动模式且允许控制且无故障
Run4 := TRUE; //打开电机4
END_IF
END_IF
IF Level >= ContLevel5 THEN //满足启动液位
IF Auto5 = TRUE AND Able5 = TRUE AND Fault5 = FALSE THEN //自动模式且允许控制且无故障
Run5 := TRUE; //打开电机5
END_IF
END_IF
6: //控制6台电机
IF Level >= ContLevel1 THEN //满足启动液位
IF Auto1 = TRUE AND Able1 = TRUE AND Fault1 = FALSE THEN //自动模式且允许控制且无故障
Run1 := TRUE; //打开电机1
END_IF
END_IF
IF Level >= ContLevel2 THEN //满足启动液位
IF Auto2 = TRUE AND Able2 = TRUE AND Fault2 = FALSE THEN //自动模式且允许控制且无故障
Run2 := TRUE; //打开电机2
END_IF
END_IF
IF Level >= ContLevel3 THEN //满足启动液位
IF Auto3 = TRUE AND Able3 = TRUE AND Fault3 = FALSE THEN //自动模式且允许控制且无故障
Run3 := TRUE; //打开电机3
END_IF
END_IF
IF Level >= ContLevel4 THEN //满足启动液位
IF Auto4 = TRUE AND Able4 = TRUE AND Fault4 = FALSE THEN //自动模式且允许控制且无故障
Run4 := TRUE; //打开电机4
END_IF
END_IF
IF Level >= ContLevel5 THEN //满足启动液位
IF Auto5 = TRUE AND Able5 = TRUE AND Fault5 = FALSE THEN //自动模式且允许控制且无故障
Run5 := TRUE; //打开电机5
END_IF
END_IF
IF Level >= ContLevel6 THEN //满足启动液位
IF Auto6 = TRUE AND Able6 = TRUE AND Fault6 = FALSE THEN //自动模式且允许控制且无故障
Run6 := TRUE; //打开电机6
END_IF
END_IF
END_CASE
END_FUNCTION_BLOCK
页:
[1]