Использование массивов или байтов для установки нескольких выходных данных в структурированном тексте

Я дурачусь в TwinCAT3, пытаясь познакомиться с ST. У меня сейчас простой вопрос.

Скажем, у меня 8 светодиодов. Каждому назначен выход 1-8. Теперь я хочу иметь возможность отправить байт, выглядящий примерно так: 10101010. Давайте вызовем эту переменную для хранения этого байта setOUTPUTS. Стоит ли мне инициализировать setOUTPUTS следующим образом, чтобы сохранить это?

bsetOUTPUTS := BYTE;  

После того, как я инициализирую эту переменную, как я могу пройти через нее, чтобы установить для каждого светодиода соответствующий бит?

Например: setOUTPUTS = 10001000, как мне выполнить цикл через переменную setOUTPUTS, чтобы включить светодиоды 8 и 4, а остальные оставить выключенными.

ЕСЛИ это невозможно, каков альтернативный способ использования массивов?

Спасибо!!


person youngEngineer    schedule 16.12.2016    source источник
comment
Вы программируете в Codesys?   -  person mrsargent    schedule 16.12.2016
comment
Нет в среде TwinCAT   -  person youngEngineer    schedule 19.12.2016


Ответы (3)


Чтобы инициализировать байт, вы должны

setOUTPUTS : BYTE:=86; (* equiavlent to 01010101  *)

вы можете установить выходы на основе бита следующим образом

out1 := setOUTPUTS.0;  (* bit 0 of byte *)
out2:=setOUTPUTS.1;  (* bit 1 of byte *)

вы можете подумать, что можете сделать что-то вроде перебора битов в байте

FOR i:=0 TO 8 BY 1 DO
(* out is an array of outputs *)
out[i] := setOUTPUTS.i;
END_FOR

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

person mrsargent    schedule 16.12.2016

Вы можете сравнить каждый бит вашей переменной setOutputs с битом, сдвинутым на длину setOutputs:

FOR i := 0 TO 7 DO
  out[i] := setOutputs AND SHL(1, i);
END_FOR;
person pboedker    schedule 19.12.2016
comment
Хороший ответ. Я не думал об этом. +1 для вас. - person mrsargent; 19.12.2016
comment
Будет ли out[i] массивом/перечислением из 8 светодиодов? и означает ли SHL сдвиг влево на 1? Спасибо! - person youngEngineer; 19.12.2016
comment
out[i] — это массив, который можно сопоставить с 8 отдельными светодиодами. SHL(n,i) сдвинет число n, 'i' раз влево. - person pboedker; 19.12.2016

Я бы просто сопоставил бит «bsetOUTPUTS» с вводом-выводом.

введите здесь описание изображения

Смещение 0 означает бит 0, смещение 1 означает бит 1 и т. д.

Поэтому я свяжу свой канал 1 (светодиод 1) со смещением 0 bsetOUTPUTS, канал 2 со смещением 1 bsetOUTPUTS и т. д.

введите здесь описание изображения

person Stucky    schedule 21.03.2018