WSEQWE 发表于 2023-5-28 20:54:38

西门子博图SCL编程

1 写一个自动控制流程其中包含 单步执行 和自动连续执行两种模式之间可以相互切换

chatGPT_小智 发表于 2023-5-28 20:55:23

下面是一个简单的自动控制流程的代码,可供参考:

FUNCTION_BLOCK AutoControlFlow
VAR_INPUT
    RunMode: BOOL; // 运行模式,True表示自动连续执行,False表示单步执行
    StartButton: BOOL; // 启动按钮
    StopButton: BOOL; // 停止按钮
    ResetButton: BOOL; // 复位按钮
END_VAR
VAR_OUTPUT
    Output1: BOOL; // 输出1
    Output2: BOOL; // 输出2
    Output3: BOOL; // 输出3
END_VAR
VAR
    Step: INT := 0; // 当前步骤
    LastStep: INT := 0; // 上一步骤
END_VAR
BEGIN
    IF ResetButton THEN // 复位
      Step := 0;
      LastStep := 0;
      Output1 := FALSE;
      Output2 := FALSE;
      Output3 := FALSE;
    ELSIF StartButton THEN // 启动
      IF RunMode THEN // 自动连续执行
            CASE Step OF
                0:
                  Output1 := TRUE;
                  LastStep := Step;
                  Step := 1;
                1:
                  IF NOT Output1 THEN
                        Output2 := TRUE;
                        LastStep := Step;
                        Step := 2;
                  END_IF;
                2:
                  IF NOT Output2 THEN
                        Output3 := TRUE;
                        LastStep := Step;
                        Step := 3;
                  END_IF;
                3:
                  IF NOT Output3 THEN
                        Output1 := TRUE;
                        LastStep := Step;
                        Step := 1;
                  END_IF;
            END_CASE
      ELSE // 单步执行
            IF Step <> LastStep THEN // 防止重复执行同一步骤
                CASE Step OF
                  0:
                        Output1 := TRUE;
                        LastStep := Step;
                  1:
                        Output2 := TRUE;
                        LastStep := Step;
                  2:
                        Output3 := TRUE;
                        LastStep := Step;
                END_CASE
            END_IF
      END_IF
    ELSIF StopButton THEN // 停止
      Output1 := FALSE;
      Output2 := FALSE;
      Output3 := FALSE;
    END_IF
END_FUNCTION_BLOCK

该代码实现了一个自动控制流程,可以根据RunMode选择不同的运行模式。若为True,则为自动连续执行模式,按照设定的步骤自动执行;若为False,则为单步执行模式,每次按下StartButton只会执行当前步骤一次。当用户按下ResetButton时,所有输出都将被复位,回到初始状态。

WSEQWE 发表于 2023-5-28 22:02:31

LastStep := Step;是什么意思?

chatGPT_小智 发表于 2023-5-28 22:02:47

WSEQWE 发表于 2023-05-28 22:02
LastStep := Step;是什么意思?

LastStep := Step; 是将当前步骤号 Step 赋值给上一步骤号 LastStep 的操作。这个操作的主要目的是避免重复执行相同的步骤。

在代码中,LastStep 存储了上一次执行的步骤号,用于与当前步骤号进行比较。如果当前步骤号和上一步骤号相同,说明当前步骤已经执行过了,应该跳过不再执行。因此,每次执行新的步骤时,都要将当前步骤号赋值给 LastStep,确保下一次比较时能够使用正确的值。

WSEQWE 发表于 2023-5-28 22:03:19

ELSE // 单步执行
            IF Step <> LastStep THEN // 防止重复执行同一步骤

chatGPT_小智 发表于 2023-5-28 22:03:36

WSEQWE 发表于 2023-05-28 22:03
ELSE // 单步执行
            IF Step <> LastStep T ...

这段代码是在单步执行时添加的,主要目的是防止重复执行同一步骤。如果当前步骤号 Step 与上一步骤号 LastStep 不相同,说明可以继续执行下一个步骤,否则就跳过。这个操作的目的是避免用户多次按下 StartButton 时重复执行同一步骤,从而保证程序运行正确性。例如,假设当前步骤为 2,当用户按下 StartButton 时,程序将会执行第 3 步骤。如果用户再次按下 StartButton,由于程序没有复位,Step 还是等于 2,但是 LastStep 已经等于 2 了,因此这一步骤将被跳过。这样就可以避免程序出现意外的情况。

WSEQWE 发表于 2023-5-28 22:03:37

ELSE // 单步执行
            IF Step <> LastStep THEN // 防止重复执行同一步骤
是什么意思?

chatGPT_小智 发表于 2023-5-28 22:03:58

WSEQWE 发表于 2023-05-28 22:03
ELSE // 单步执行
            IF Step <> LastStep T ...

这段代码的主要作用是在单步执行模式下,避免重复执行同一步骤。具体来说,当用户按下单步执行模式下的启动按钮时,程序会执行当前步骤,经过一定的时间后,用户再次按下启动按钮。此时,如果不加判断直接执行当前步骤,就会导致程序出错。

因此,在这段代码中,程序首先通过 IF 判断语句判断当前步骤是否和上一步骤相同,如果不相同,则执行当前步骤,否则跳过当前步骤。

例如,假设当前的步骤为第2步,LastStep 也是第二步,当用户再次按下启动按钮时,如果没有这个判断,程序将继续执行第二步,从而导致程序的错误。而加上这个判断后,程序会跳过第二步,直接执行第三步,保证程序的运行正确性。

WSEQWE 发表于 2023-5-28 22:06:45

IF NOT Output1 THEN
                        Output2 := TRUE;
                        LastStep := Step;
                        Step := 2;
                  END_IF;
为什么是 NOT Output1 呢?

chatGPT_小智 发表于 2023-5-28 22:07:02

WSEQWE 发表于 2023-05-28 22:06
IF NOT Output1 THEN
                        Output ...

这里的 NOT Output1 是表示当 Output1 为 False 时,执行下一步骤(即第2步)。这样做的目的是确保程序的正确性,防止重复执行同一步骤。

在这段代码中,Output1 的初始值为 False,而在第1步骤中被设置为 True,如果没有 NOT Output1 的判断语句,那么在第2,3步骤中也会继续执行执行 Output2 和 Output3,导致程序出错。但是添加了 NOT Output1 判断后,只有 Output1 为 False 时才会执行第2步骤,确保了程序的正确性。

简而言之,NOT Output1 的作用就是判断 Output1 是否为 False,如果是,则执行下一步骤;如果不是,则不执行该步骤,跳过到下一个步骤。
页: [1]
查看完整版本: 西门子博图SCL编程