【问题标题】:How do you control the order of executing different blocks of ST code?如何控制不同 ST 代码块的执行顺序?
【发布时间】:2015-12-04 04:11:14
【问题描述】:

我有一个包含 8 个步骤的工艺配方,每个步骤我都在 ST 中定义。但是,用户应该能够选择执行这 8 个步骤的顺序。我正在尝试提出可用于此目的的标志或变量,但到目前为止仍处于空白状态。有人对如何实施有任何想法吗?

【问题讨论】:

  • 我可以回答你的问题,但你没有告诉我我上一个答案有什么问题,也没有接受我之前给你的问题的最后一个答案。问候
  • 我刚做了。谢谢,您之前的回答对我的其他问题很有用

标签: plc st


【解决方案1】:

我的建议是让用户按照应该如何执行的顺序用步骤号填充一个数组。然后将不同的 ST 代码块放入 CASE 语句中。对于 CASE 变量,请使用数组。这样执行顺序就完全灵活了。

这里以三明治装饰器为例。重要的部分从 E_SandwichDecoratorStep.RecipeExecution 开始

枚举:

TYPE E_SandwichDecoratorStep :
(
    UserSelecting := 1,
    RecipeExecution,
    Finished
);
END_TYPE

TYPE E_SandwichDecoratorUserRecipe :
(
    Pepperoni := 1,
    Ham,
    Cheese,
    Tomato,
    Salad,
    Sauce,
    Salt,
    Pepper
);
END_TYPE

计划:

PROGRAM SANDWICHDECORATOR
VAR
    arrnStepOrder       : ARRAY[1..8] OF E_SandwichDecoratorStep;   (*User Recipe Configuration*)

    bRestart            : BOOL;
    bUserRecipeStart    : BOOL; (*Start the execution of the Recipe*)
    eCurStep            : E_SandwichDecoratorStep;
    nCurUserRecipeIndex : INT := 1;
END_VAR

CASE eCurStep OF
    E_SandwichDecoratorStep.UserSelecting:
        (*Example Order*)
        arrnStepOrder[1] := E_SandwichDecoratorUserRecipe.Ham;
        arrnStepOrder[2] := E_SandwichDecoratorUserRecipe.Tomato;
        arrnStepOrder[3] := E_SandwichDecoratorUserRecipe.Pepperoni;
        arrnStepOrder[4] := E_SandwichDecoratorUserRecipe.Cheese;
        arrnStepOrder[5] := E_SandwichDecoratorUserRecipe.Salt;
        arrnStepOrder[6] := E_SandwichDecoratorUserRecipe.Sauce;
        arrnStepOrder[7] := E_SandwichDecoratorUserRecipe.Pepper;
        arrnStepOrder[8] := E_SandwichDecoratorUserRecipe.Salad;

        IF bUserRecipeStart THEN
            bUserRecipeStart := FALSE;
            eCurStep := E_SandwichDecoratorStep.RecipeExecution;
        END_IF

    E_SandwichDecoratorStep.RecipeExecution:
        IF nCurUserRecipeIndex <= E_SandwichDecoratorUserRecipe.Pepper THEN
            CASE arrnStepOrder[nCurUserRecipeIndex] OF
                E_SandwichDecoratorUserRecipe.Pepperoni:
                    nCurUserRecipeIndex := nCurUserRecipeIndex + 1;

                E_SandwichDecoratorUserRecipe.Ham:
                    nCurUserRecipeIndex := nCurUserRecipeIndex + 1;

                E_SandwichDecoratorUserRecipe.Cheese:
                    nCurUserRecipeIndex := nCurUserRecipeIndex + 1;

                E_SandwichDecoratorUserRecipe.Tomato:
                    nCurUserRecipeIndex := nCurUserRecipeIndex + 1;

                E_SandwichDecoratorUserRecipe.Salad:
                    nCurUserRecipeIndex := nCurUserRecipeIndex + 1;

                E_SandwichDecoratorUserRecipe.Sauce:
                    nCurUserRecipeIndex := nCurUserRecipeIndex + 1;

                E_SandwichDecoratorUserRecipe.Salt:
                    nCurUserRecipeIndex := nCurUserRecipeIndex + 1;

                E_SandwichDecoratorUserRecipe.Pepper:
                    nCurUserRecipeIndex := nCurUserRecipeIndex + 1;
            END_CASE
        ELSE
            nCurUserRecipeIndex := 1;
            eCurStep := E_SandwichDecoratorStep.Finished;
        END_IF

    E_SandwichDecoratorStep.Finished:
        IF bRestart THEN
            bRestart := FALSE;
            eCurStep := E_SandwichDecoratorStep.UserSelecting;
        END_IF

END_CASE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2016-06-26
    • 2018-10-02
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多