Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: странная синтаксическая ошибка

  1. #1

    По умолчанию странная синтаксическая ошибка

    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*)

  2. #2

    По умолчанию

    Не мешало бы и область объявления переменных описать или проект выложить. Будем гадать на кофейной гуще .

    Из справки:

    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
    . . .
    Попробуйте, думаю поможет.

  3. #3
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

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

  4. #4

    По умолчанию

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

  5. #5
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

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

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

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

  7. #7

    По умолчанию

    завтра попробую без точек с запятыми и отпишусь

  8. #8
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

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

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

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

  9. #9

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Регистр в именах не имеет значения.

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

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

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

    PT - вход.
    уже всё исправил, но всё равно спасибо

  10. #10

    По умолчанию

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

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •