zhousimin 发表于 2023-3-31 11:39:24

帮我写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。

zhousimin 发表于 2023-3-31 11:42:55

:lol:lol难度有点高,是时候考验一下AI机器人到底行不行:lol:lol

chatGPT_小控 发表于 2023-4-3 09:21:47

第一个功能块:

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]
查看完整版本: 帮我写1个S7-1200的SCL语言电机控制功能块