西门子博图SCL编程
1 写一个自动控制流程其中包含 单步执行 和自动连续执行两种模式之间可以相互切换下面是一个简单的自动控制流程的代码,可供参考:
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时,所有输出都将被复位,回到初始状态。 LastStep := Step;是什么意思?
WSEQWE 发表于 2023-05-28 22:02
LastStep := Step;是什么意思?
LastStep := Step; 是将当前步骤号 Step 赋值给上一步骤号 LastStep 的操作。这个操作的主要目的是避免重复执行相同的步骤。
在代码中,LastStep 存储了上一次执行的步骤号,用于与当前步骤号进行比较。如果当前步骤号和上一步骤号相同,说明当前步骤已经执行过了,应该跳过不再执行。因此,每次执行新的步骤时,都要将当前步骤号赋值给 LastStep,确保下一次比较时能够使用正确的值。 ELSE // 单步执行
IF Step <> LastStep THEN // 防止重复执行同一步骤 WSEQWE 发表于 2023-05-28 22:03
ELSE // 单步执行
IF Step <> LastStep T ...
这段代码是在单步执行时添加的,主要目的是防止重复执行同一步骤。如果当前步骤号 Step 与上一步骤号 LastStep 不相同,说明可以继续执行下一个步骤,否则就跳过。这个操作的目的是避免用户多次按下 StartButton 时重复执行同一步骤,从而保证程序运行正确性。例如,假设当前步骤为 2,当用户按下 StartButton 时,程序将会执行第 3 步骤。如果用户再次按下 StartButton,由于程序没有复位,Step 还是等于 2,但是 LastStep 已经等于 2 了,因此这一步骤将被跳过。这样就可以避免程序出现意外的情况。 ELSE // 单步执行
IF Step <> LastStep THEN // 防止重复执行同一步骤
是什么意思? WSEQWE 发表于 2023-05-28 22:03
ELSE // 单步执行
IF Step <> LastStep T ...
这段代码的主要作用是在单步执行模式下,避免重复执行同一步骤。具体来说,当用户按下单步执行模式下的启动按钮时,程序会执行当前步骤,经过一定的时间后,用户再次按下启动按钮。此时,如果不加判断直接执行当前步骤,就会导致程序出错。
因此,在这段代码中,程序首先通过 IF 判断语句判断当前步骤是否和上一步骤相同,如果不相同,则执行当前步骤,否则跳过当前步骤。
例如,假设当前的步骤为第2步,LastStep 也是第二步,当用户再次按下启动按钮时,如果没有这个判断,程序将继续执行第二步,从而导致程序的错误。而加上这个判断后,程序会跳过第二步,直接执行第三步,保证程序的运行正确性。 IF NOT Output1 THEN
Output2 := TRUE;
LastStep := Step;
Step := 2;
END_IF;
为什么是 NOT Output1 呢?
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]