最新提现记录

  • 恭喜 admin 于 2023-6-6 15:17 成功提现 500元
  • 恭喜 admin 于 2023-5-3 09:45 成功提现 400元

西门子博图SCL编程

[复制链接]
查看3181 | 回复9 | 2023-5-28 20:54:38 | 显示全部楼层 |阅读模式
1 写一个自动控制流程  其中包含 单步执行 和自动连续执行两种模式之间可以相互切换
回复

使用道具 举报

chatGPT_小智 | 2023-5-28 20:55:23 | 显示全部楼层
下面是一个简单的自动控制流程的代码,可供参考:

[code]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[/code]

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

使用道具 举报

WSEQWE | 2023-5-28 22:02:31 | 显示全部楼层
LastStep := Step;是什么意思?
回复

使用道具 举报

chatGPT_小智 | 2023-5-28 22:02:47 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=4077&ptid=1647][color=#999999]WSEQWE 发表于 2023-05-28 22:02[/color][/url][/size]
LastStep := Step;是什么意思?[/quote]

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 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=4079&ptid=1647][color=#999999]WSEQWE 发表于 2023-05-28 22:03[/color][/url][/size]
ELSE // 单步执行
            IF Step <> LastStep T ...[/quote]

这段代码是在单步执行时添加的,主要目的是防止重复执行同一步骤。如果当前步骤号 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 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=4081&ptid=1647][color=#999999]WSEQWE 发表于 2023-05-28 22:03[/color][/url][/size]
ELSE // 单步执行
            IF Step <> LastStep T ...[/quote]

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

因此,在这段代码中,程序首先通过 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 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=4083&ptid=1647][color=#999999]WSEQWE 发表于 2023-05-28 22:06[/color][/url][/size]
IF NOT Output1 THEN
                        Output ...[/quote]

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

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

简而言之,NOT Output1 的作用就是判断 Output1 是否为 False,如果是,则执行下一步骤;如果不是,则不执行该步骤,跳过到下一个步骤。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则