Просмотр полной версии : странная синтаксическая ошибка
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
. . .
Попробуйте, думаю поможет.
Вроде как настоятельно рекомендует перед вызовом CAL ставить END_IF, чего тут странного, :) может Вы пишите программу несколько странно
alhoresm
22.06.2011, 15:38
с ошибками разобрался, оказалось не все ошибки видел в окне ошибок
а требовалось ставить символ ";" после всех END_IF, как ни странно, это влияет на появление этой ошибки
Очень интересно, я буквально не больше месяца, как избавился от привычки после ифов и кейсов ставить ; а теперь что же получается надо опять переучиваться :)
Если Вы исходник скопировали из программы, то приглядевшись можно заметить, что там где Вы пишите возникает ошибка между 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 отличный :)
Для тех кто хочет строго соответствовать стандартам программирования,:) а так же для тех кто не хочет в будущем выслушивать обидную критику в свой адрес используйте пункт меню "вставить" или волшебную кнопку F2, в этом случае КДС сделает за Вас всю черновую работу
Serge_UA
23.06.2011, 09:22
Ошибки иногда действительно пропускает, когда их много. Но в итоге если хоть одна ошибка есть - обязательно скажет об этом.
Именно это я и говорю.
Для тех кто хочет строго соответствовать стандартам программирования,:) а так же для тех кто не хочет в будущем выслушивать обидную критику в свой адрес используйте пункт меню "вставить" или волшебную кнопку F2, в этом случае КДС сделает за Вас всю черновую работу
Я не стремлюсь "строго соответствовать" стандартам, просто не вижу смысла делать лишние, бесполезные действия. Ассистентом ввода (F2) в некоторых случаях пользуюсь. Удобный инструмент, который обязательно должен присутствовать в среде разработки для ПЛК.
Вообще то я имел ввиду, что редактируя в ST ассистент никогда не предложит использовать команду CAL, а вот в IL данная команда будет присутствовать, хотя компилятору главное чтоб синтаксис был не нарушен поэтому CAL можно вызывать и в ST
Serge_UA
23.06.2011, 18:11
хотя компилятору главное чтоб синтаксис был не нарушен поэтому CAL можно вызывать и в ST
Пример работающего кода на ST с вызовом инструкции CAL в студию! :)
попробовал не получилось, значит остается во всем слушаться ассистента.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot