У меня есть рецепт процесса с 8 шагами, каждый из которых я определил в ST. Пользователь должен иметь возможность, однако, выбрать порядок выполнения этих 8 шагов. Я пытаюсь придумать флаги или переменные, которые можно было бы использовать для этого, но нарисовать пробел до сих пор. У кого-нибудь есть мысли о том, как это можно реализовать?Как вы контролируете порядок выполнения различных блоков кода ST?
1
A
ответ
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
Я мог бы ответить на ваш вопрос, но вы не сказали мне, что случилось с моим последним ответом, или согласились с последним ответом, который я дал вам на вопрос раньше. Приветствие –
Я просто сделал. Спасибо, ваш предыдущий ответ будет отлично работать для моего другого вопроса – user2840240