CoDeSys: BOOL становится «*** недействительным: 16 # 02 ***» вне случая (связь между двумя переменными) - PullRequest
0 голосов
/ 02 декабря 2011

Когда я отслеживаю свою программу (онлайн с точкой останова и одиночным шагом), я вижу, что значение VAR SOpen становится «* недействительным: 16 # 02 *» при достижении строки Step:=Step+1;.

Наблюдая за следом более внимательно, я увидел, что шаг изменяется с 0 на 1 при первом вызове «0:». Два VAR являются инициализированными и, кажется, связаны друг с другом. Дополнительное увеличение устанавливает для шага 2 (в 1-й серии!) И SOpen недействительным.

PROGRAM PLC_PRG
VAR
    SerIO: SERCOMM;
    Step: BYTE := 0;
    Input: ARRAY [0..50] OF DWORD;
    SOpen: BOOL := FALSE;
END_VAR

IF Eingang1 THEN
    CASE Step OF
    0:
        IF NOT SOpen THEN
            SerIO.FB_ACTION := Open;
            SerIO.RECEIVE_BUFFER:=Input[0];
            SerIO.COMPORT:=1;
            SerIO.EN:=TRUE;
            Ausgang1 := NOT SerIO.ERROR;
            SOpen :=TRUE;
            SerIO.EN:=FALSE;
        END_IF;
    1:
        IF SOpen THEN
            SerIO.FB_ACTION:=Read;
            SerIO.EN:=TRUE;
            Ausgang1 := NOT SerIO.ERROR;
            Ausgang2 := (SerIO.BYTES_DONE>3);
            SerIO.EN:=FALSE;
        END_IF;
    2:
        IF SOpen THEN
            SerIO.FB_ACTION:=Close;
            SerIO.EN:=TRUE;
            Ausgang1 := NOT SerIO.ERROR;
            SOpen :=FALSE;
            SerIO.EN:=FALSE;
        END_IF;
    END_CASE
    Step:=Step+1;
    IF Step>2 THEN Step :=0; END_IF;
ELSIF SOpen THEN
    SerIO.FB_ACTION:=Close;
    SerIO.EN:=TRUE;
    SerIO.EN:=FALSE;
    SOpen :=FALSE;
    Step:=0;
END_IF;

Ответы [ 2 ]

0 голосов
/ 14 ноября 2015

Вопрос, почему вы бы поместили оператор CASE в оператор IF? Оператор IF должен вызывать ваши шаги?

If something then
  step = 10; (* start processing *)
else
  step = 0;
end_if

case step of

  0:
    Kill your enable or an idle state here stop state.
  10: (* Start *)
    step = step +1;
  20:
       Call FB
  40: (*continue *)
   step = 10;

  30: (* End *)
   step = 0;
   else (* catch something here *)

  end_case

здесь вызывается FB, который получает входные данные из кода выше.

Трудно сказать INVALID иногда, если вы не выполняете очистку all и список переменных выходит из строя, что может произойти. Извините, что не очень помог, я увидел недействительный, и он пришел из чистого проекта и смотрит на недействительный указатель, который еще не был вызван.

0 голосов
/ 02 декабря 2011

Я перенес VAR сейчас в VAR_GLOBAL. Это не совсем то, что я хочу, но теперь это работает. Лучшие решения приветствуются и будут приняты:)

...