2015-12-01 4 views
1

У меня есть рецепт процесса с 8 шагами, каждый из которых я определил в ST. Пользователь должен иметь возможность, однако, выбрать порядок выполнения этих 8 шагов. Я пытаюсь придумать флаги или переменные, которые можно было бы использовать для этого, но нарисовать пробел до сих пор. У кого-нибудь есть мысли о том, как это можно реализовать?Как вы контролируете порядок выполнения различных блоков кода ST?

+0

Я мог бы ответить на ваш вопрос, но вы не сказали мне, что случилось с моим последним ответом, или согласились с последним ответом, который я дал вам на вопрос раньше. Приветствие –

+0

Я просто сделал. Спасибо, ваш предыдущий ответ будет отлично работать для моего другого вопроса – user2840240

ответ

2

Мое предложение состоит в том, чтобы позволить пользователю заполнить массив номерами шагов в порядке их выполнения. Затем поместите ваши разные блоки кода ST в оператор CASE. Для CASE-переменной используйте массив. Таким образом, порядок выполнения полностью гибкий.

В качестве примера можно привести декоратор сэндвич. Важная часть начинается E_SandwichDecoratorStep.RecipeExecution

Enumerations:

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