PDA

Просмотр полной версии : странная синтаксическая ошибка



alhoresm
22.06.2011, 11:04
IF di0 THEN
do0:=FALSE;
do1:=FALSE;
do2:=FALSE;
do3:=FALSE;
TPup(in:=FALSE);
TPup(PT:=T#20S);
TPdown(in:=FALSE);
TPdown(PT:=T#20S);

mode:=1;
ELSE (*IF di0*)

IF mode=1 THEN

TPup(q=>b);
IF NOT b THEN
TPup(in:=TRUE);
ELSE(* IF NOT b *)
CAL tpUp(pt=>apt; et=>aet); (*здесь не выдаёт ошибку*)
IF aet=apt THEN
mode:=2;
tpUp(in:=FALSE);
END_IF (* IF aet=apt *)

END_IF (* IF NOT b *)

END_IF (* IF mode=1*)

IF mode=2 THEN

TPdown(q=>b);
IF NOT b THEN
TPdown(in:=TRUE);
ELSE (* IF NOT b*)
CAL tpDown(pt=>apt;et=>aet); (*здесь выдаёт ошибку: "Expecting END_IF before 'CAL'"*)
IF aet=apt THEN
mode:=1;
tpDown(in:=FALSE);
END_IF(* IF aet=apt*)
END_IF(* IF NOT b*)

END_IF(* IF mode=2*)

END_IF (*IF di0*)

Александр Приходько
22.06.2011, 12:07
Не мешало бы и область объявления переменных описать или проект выложить. Будем гадать на кофейной гуще :confused: .

Из справки:


CAL
Вызывает функциональный блок или программу.

Применяется в IL для вызова экземпляра функционального блока, входные переменные помещаются в скобках вслед за его именем.

Для языка ST надобности в данном операторе нет. Если tpDown - это некий ФБ или программа, то в области описания переменных вы задаете:


tpDown1:tpDown; (*Объявляем экземпляр функционального блока или программы*)

а в коде пишем:


. . .
ELSE (* IF NOT b*)
tpDown1(pt=>apt;et=>aet);
IF aet=apt THEN
. . .

Если tpDown-это функция, то в коде пишем:


. . .
ELSE (* IF NOT b*)
переменная:=tpDown(pt=>apt;et=>aet);
IF aet=apt THEN
. . .

Попробуйте, думаю поможет.

capzap
22.06.2011, 12:08
Вроде как настоятельно рекомендует перед вызовом CAL ставить END_IF, чего тут странного, :) может Вы пишите программу несколько странно

alhoresm
22.06.2011, 15:38
с ошибками разобрался, оказалось не все ошибки видел в окне ошибок
а требовалось ставить символ ";" после всех END_IF, как ни странно, это влияет на появление этой ошибки

capzap
22.06.2011, 16:21
Очень интересно, я буквально не больше месяца, как избавился от привычки после ифов и кейсов ставить ; а теперь что же получается надо опять переучиваться :)

capzap
22.06.2011, 16:32
Если Вы исходник скопировали из программы, то приглядевшись можно заметить, что там где Вы пишите возникает ошибка между END_IF и ( отсутствует пробел, может в этом была причина

alhoresm
22.06.2011, 18:23
завтра попробую без точек с запятыми и отпишусь

Serge_UA
22.06.2011, 18:50
Если внимательно почитать документацию, то станет ясно, что оператор CAL принадлежит языку IL, а не ST. Поэтому использовать его в языке ST некорректно, и компилятор должен выдавать ошибку.

Точка_с_запятой после END_IF не нужна и бесполезна.

Компилятор в CodeSys слегка странный. При наличии нескольких ошибок в коде некоторые из них может пропускать, а также сообщать о несуществующих.

alhoresm
22.06.2011, 19:02
Регистр в именах не имеет значения.

..TPup(PT:=T#20S);..
...tpUp(pt=>apt; et=>aet);..

Это одно и тоже.
Предположительно (????) это - таймер.
Тогда один из траблов здесь :

tpUp(pt=>apt; et=>aet);..

PT - вход.

уже всё исправил, но всё равно спасибо

Николаев Андрей
22.06.2011, 21:14
Точка_с_запятой после END_IF не нужна и бесполезна.

Не только не бесполезна, а я рекомендую всегда ставить. Точкой с запятой Вы даете однозначный ответ компилятору (уменьшаете для него неопределенность)


Компилятор в CodeSys слегка странный. При наличии нескольких ошибок в коде некоторые из них может пропускать, а также сообщать о несуществующих.
Просто до некоторых ошибок он не успевает дойти и проверить. В итоге, если есть хоть одна - он скажет. А когда ошибок 150 - все сразу не показывает - психику щадит ;)

Serge_UA
22.06.2011, 21:56
Не только не бесполезна, а я рекомендую всегда ставить. Точкой с запятой Вы даете однозначный ответ компилятору (уменьшаете для него неопределенность)


Однозначных ответ на что? Неопределенность в чем?
Я так понимаю, вы имеете ввиду, что компилятор точнее локализует ошибки?



Просто до некоторых ошибок он не успевает дойти и проверить. В итоге, если есть хоть одна - он скажет. А когда ошибок 150 - все сразу не показывает - психику щадит ;)

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

Николаев Андрей
23.06.2011, 07:37
Компилятор точнее понимает где закончилось условие. Сколько у Вас вложенных If может быть...

Ошибки иногда действительно пропускает, когда их много. Но в итоге если хоть одна ошибка есть - обязательно скажет об этом. Не пугаййте людей - отладчик и компилятор в CoDeSys отличный :)

capzap
23.06.2011, 08:34
Для тех кто хочет строго соответствовать стандартам программирования,:) а так же для тех кто не хочет в будущем выслушивать обидную критику в свой адрес используйте пункт меню "вставить" или волшебную кнопку F2, в этом случае КДС сделает за Вас всю черновую работу

Serge_UA
23.06.2011, 09:22
Ошибки иногда действительно пропускает, когда их много. Но в итоге если хоть одна ошибка есть - обязательно скажет об этом.
Именно это я и говорю.


Для тех кто хочет строго соответствовать стандартам программирования,:) а так же для тех кто не хочет в будущем выслушивать обидную критику в свой адрес используйте пункт меню "вставить" или волшебную кнопку F2, в этом случае КДС сделает за Вас всю черновую работу

Я не стремлюсь "строго соответствовать" стандартам, просто не вижу смысла делать лишние, бесполезные действия. Ассистентом ввода (F2) в некоторых случаях пользуюсь. Удобный инструмент, который обязательно должен присутствовать в среде разработки для ПЛК.

capzap
23.06.2011, 12:37
Вообще то я имел ввиду, что редактируя в ST ассистент никогда не предложит использовать команду CAL, а вот в IL данная команда будет присутствовать, хотя компилятору главное чтоб синтаксис был не нарушен поэтому CAL можно вызывать и в ST

Serge_UA
23.06.2011, 18:11
хотя компилятору главное чтоб синтаксис был не нарушен поэтому CAL можно вызывать и в ST

Пример работающего кода на ST с вызовом инструкции CAL в студию! :)

capzap
23.06.2011, 20:10
попробовал не получилось, значит остается во всем слушаться ассистента.