Я пишу программу для ПЛК Schneider с использованием структурированного текста, и я пытаюсь сделать это, используя объектно-ориентированное программирование.ПЛК объектно-ориентированное программирование - использование методов
Будучи новичком в программировании PLC, я написал простую тестовую программу таким образом:
okFlag:=myObject.aMethod();
IF okFlag THEN
// it's ok, go on
ELSE
// error handling
END_IF
aMethod
должны выполнять некоторые операции, ждать результата (есть «Тайм-аут» проверить, чтобы избежать тупики) и возвращает ИСТИНА, либо ЛОЖЬ
Это то, что я ожидал, во время выполнения программы
1), когда okFlag:=myObject.aMethod();
достигнуто, код внутри aMethod
выполняется до тех пор, результат не возвращается. Когда я говорю «выполнено», я имею в виду, что в следующем цикле сканирования выполнение aMethod
продолжается с той точки, в которой оно было достигнуто раньше.
2) результат метода вызова проверяется и основной поток программы выполняется
и это то, что происходит:
1) aMethod
выполняется, но поток программы продолжается. То есть, когда он достигает конца aMethod
значения, которое возвращается, даже если события, которые aMethod
должны ждать, все еще выполняются.
2) на следующем цикле, aMethod
вызывается снова и перезапускается с самого начала
Это первое решение, которое я нашел:
VAR_STATIC
imBusy: BOOL
END_VAR
METHOD aMethod: INT;
IF NOT(imBusy) THEN
imBusy:=FALSE;
aMethod:=-1; // result of method while in progress
ELSE
aMethod:=-1;
<rest of code. If everything is ok, the result is 0, otherwise is 1>
END_IF
imBusy:=aMethod<0;
и основная программа:
CASE (myObject.aMethod()) OF
0: // it's ok, go on
1: // error handling
ELSE
// still executing...
END_CASE
, и это, похоже, работает, но я не знаю, правильно ли он подходит.
Есть несколько библиотек от Schneider, которые используют методы, которые возвращают логическое значение и, похоже, работают так, как я ожидал в своей программе. То есть: когда цикл достигает вызова метода в первый раз, поток программы «отклоняется» каким-то образом, так что в следующем цикле он снова вводит метод до его завершения. Это способ иметь такое поведение?
Вы используете Somachine или Unity? – mrsargent
SoMachine, версия 4.1 – Marconi