Позволяет ли структурированный текст IEC-61131 сравнивать логические операнды?

Я создаю синтаксический анализатор и средство проверки типов для структурированного текста. ST является производным от Паскаля.

Ясно, что ST позволяет сравнивать на равенство две объявленные действительные переменные X и Y как

 X = Y

Также ясно, что вы можете написать

 X <> Y

а также

 X > Y

Если у меня есть две объявленные логические переменные A и B,

 A = B

законно? Паскаль, конечно, сказал бы так. Имеющиеся у меня справочные документы по ST (включая австралийскую версию стандарта 2004 года и реализации нескольких поставщиков) неясны.

Могу ли я написать:

 A > B

и что это значит?

[В аннотации меня интересуют те же вопросы для сравнения строк. Брауни также указывает на решение этой проблемы].

[Нет, я не могу просто попробовать это на реальном контроллере; На самом деле у меня его нет, а ближайший в двух днях от меня.]

Каков ответ и какой справочный документ, в котором вы консультировались, показывает ответ?


person Ira Baxter    schedule 13.08.2018    source источник


Ответы (1)


Ответ на этот вопрос действительно зависит от IDE. Хотя для ST существует стандарт, каждый поставщик реализует его немного по-своему.

В целом это верное утверждение.

VAR
    a, b: BOOL;
END_VAR

IF a = b THEN
   // Do something
END_IF

Вот что содержится в проекте IEC 61131-3. К сожалению, это не открытый документ и стоит денег, поэтому я не могу разместить его здесь или дать ссылку.

https://webstore.iec.ch/publication/4552

  1. GT > По убыванию: OUT := (IN1>IN2) & (IN2>IN3) & ... & (INn-1 > INn)
  2. GE >= Монотонная последовательность: OUT := (IN1>=IN2)&(IN2>=IN3)& ... & (INn-1 >= INn)
  3. EQ = Равенство: OUT := (IN1=IN2) & (IN2=IN3) & ... & (INn-1 = INn)
  4. LE <= Монотонная последовательность: OUT := (IN1<=IN2)&(IN2<=IN3)& ... & (INn-1 <= INn)
  5. LT < Возрастающая последовательность: OUT := (IN1<IN2) & (IN2<IN3) & ... & (INn-1 < INn)
  6. NE <> Неравенство (нерасширяемое) OUT := (IN1 <> IN2)

Это также означает, что в некоторых IDE вы можете использовать

IF EQ(a, b) THEN
   // Do something
END_IF

И это тоже должно быть в силе.

Можно ли написать: А > В и что это значит?

Если A больше B, это выражение вернет TRUE, иначе FALSE.

person Sergey Romanov    schedule 15.08.2018
comment
Отлично, цитата из главы и стиха. Как раз то, что мне было нужно. Спасибо! - person Ira Baxter; 15.08.2018