1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Язык ST, мэк 61131-3. Баг или фича?

PLC, прочие контроллеры, промышленные компьютеры, операторские панели
Ответить

Автор темы
Dotarev
знаток Eplan
знаток Eplan
Сообщения: 260
Зарегистрирован: 12 июн 2014, 06:17
Имя: Мишкин Иван
Страна: Россия
город/регион: Самара
Благодарил (а): 16 раз
Поблагодарили: 70 раз

Язык ST, мэк 61131-3. Баг или фича?

Сообщение Dotarev »

Написал небольшую программку:

Код: Выделить всё

PROGRAM Main
VAR
	Counter1:DWORD;
	Counter2:DWORD;
	StartSelfDestruct:BOOL:=FALSE;
END_VAR
Counter1:=0;
Counter2:=Counter1+1;
IF NOT counter2=counter1 THEN
	(*everything is fine *)
	;
ELSE
	(*Fail !*)
	StartSelfDestruct:=TRUE;
END_IF
При запуске на выходе StartSelfDestruct установлен в true!
Конечно, победил за десять минут, но вот вопрос: это баг или фича языка ST?
Если что, среда - TwinCat v2.11.1539

leon78
эксперт
эксперт
Сообщения: 1031
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 34 раза
Поблагодарили: 110 раз

Язык ST, мэк 61131-3. Баг или фича?

Сообщение leon78 »

1. Выполняется побитовое НЕТ для counter2. Результат 16#FFFFFFFE
2. Выполняется сравнение 16#FFFFFFFE=0
3. Переход в ветку ELSE

Надо исправить на
IF NOT (counter2 = counter1) THEN
или
IF counter2 <> counter1 THEN
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Автор темы
Dotarev
знаток Eplan
знаток Eplan
Сообщения: 260
Зарегистрирован: 12 июн 2014, 06:17
Имя: Мишкин Иван
Страна: Россия
город/регион: Самара
Благодарил (а): 16 раз
Поблагодарили: 70 раз

Язык ST, мэк 61131-3. Баг или фича?

Сообщение Dotarev »

Точно. Не учел, что NOT может применяться как к bool, так и к word, dword.

checker
здесь недавно
здесь недавно
Сообщения: 40
Зарегистрирован: 30 окт 2009, 13:53
Имя: ----
Поблагодарили: 5 раз

Язык ST, мэк 61131-3. Баг или фича?

Сообщение checker »

TwinCat сделал все строго по стандарту. Оператор NOT имеет более высокий приоритет, чем оператор присваивания, поэтому выполняется первым.

Стандарт IEC 61131-3 (2 редакция от 2003 г.): стр, 131, таблица 55 - Operators of the ST language
Стандарт IEC 61131-3 (3 редакция от 2013 г.): стр, 202, таблица 71 - Operators of the ST language
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 30 раз
Поблагодарили: 165 раз

Язык ST, мэк 61131-3. Баг или фича?

Сообщение aranea »

я всегда условие в IF пишу в скобках

Код: Выделить всё

IF counter2 != counter1 THEN
а так можно было?
Изображение

checker
здесь недавно
здесь недавно
Сообщения: 40
Зарегистрирован: 30 окт 2009, 13:53
Имя: ----
Поблагодарили: 5 раз

Язык ST, мэк 61131-3. Баг или фича?

Сообщение checker »

Оператор неравенства - это <>, оператора != в стандарте 61131-3 нет.
Аватара пользователя

petr2off
эксперт
эксперт
Сообщения: 1614
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Страна: Россия
город/регион: Красноярск
Благодарил (а): 70 раз
Поблагодарили: 189 раз

Язык ST, мэк 61131-3. Баг или фича?

Сообщение petr2off »

От реализации кстати тоже зависит. В ISAGRAF такой код не отранслируется, там запрещено применять оператор NOT к целым выражениям, для этого существует ФБ NOT_MASK(ival)

Автор темы
Dotarev
знаток Eplan
знаток Eplan
Сообщения: 260
Зарегистрирован: 12 июн 2014, 06:17
Имя: Мишкин Иван
Страна: Россия
город/регион: Самара
Благодарил (а): 16 раз
Поблагодарили: 70 раз

Язык ST, мэк 61131-3. Баг или фича?

Сообщение Dotarev »

checker писал(а): 02 фев 2018, 15:39TwinCat сделал все строго по стандарту
Точно. Немного дополню.
Оператор NOT определяется как "побитовое дополнение" и может применяться к битово-строковым литералам: BOOL, BYTE, WORD, DWORD, LWORD. При попытке применения NOT к переменным другого типа, в т.ч. INT, выдается ошибка компиляции.
Это теперь я поумнел, после изучения стандарта :oops:
Ответить

Вернуться в «Средний уровень автоматизации (управляющий)»