Добрый день, уважаемые профессионалы и любители, подскажите пример объединения например: 4-ех 8-ми битовых масок в одну переменную 4 байта, на языке ST. Или где об этом можно почитать. Быстрый поиск не увенчался успехом. Заранее благодарю за помощь.
Вид для печати
Добрый день, уважаемые профессионалы и любители, подскажите пример объединения например: 4-ех 8-ми битовых масок в одну переменную 4 байта, на языке ST. Или где об этом можно почитать. Быстрый поиск не увенчался успехом. Заранее благодарю за помощь.
Можно, если сильно постараться, но зачем это надо? Не просматривается необходимости при работе с овеном..
или как вариантКод:VAR
mask1, mask2, mask3, mask4: BYTE;
mask: DWORD;
END_VAR
mask :=
SHL(mask1 + DWORD#0, 24) OR
SHL(mask2 + DWORD#0, 16) OR
SHL(mask3 + DWORD#0, 8) OR
mask4;
или такКод:mask := 0;
mask :=
SHL(mask1 + mask, 24) OR
SHL(mask2 + mask, 16) OR
SHL(mask3 + mask, 8) OR
mask4;
Код:mask :=
mask1 * 16#1000000 +
mask2 * 16#10000 +
mask3 * 16#100 +
mask4;
или такКод:VAR
b AT %MB0 : ARRAY[0..3] OF BYTE;
mask AT %MD0 : DWORD;
END_VAR
;
Всем спасибо, буду пробовать. А необходимость, это передавать с плк в скаду сразу 32 булевых значений одной переменной.
Для меня так нагляднее. Оперируем последним битом в 32-х битном слове.
Код:VAR
DWORD_tmp:DWORD;
b1:BOOL;
END_VAR
IF b1 THEN DWORD_tmp:=DWORD_tmp OR 2147483648; ELSE DWORD_tmp:=DWORD_tmp AND NOT 2147483648; END_IF;
krollcbas а для операции со всеми битами делать простыню кода ?
Уж лучше FB сделать со сдвигом регистров, тогда из параметров только номер бита и запись значения
Сплю с утра, не ругайтесь. В Oscat много чего есть, возможно и необходимое TC.
Столько примеров) столько споров. Вообще в идеале я хотел передавать из скады 2 2-ух байтовых маски для 2-ух 16Р, а из плк хотел передавать в скаду 4 байтовую переменную в которой склеены 2 модуля 8ДФ и +16 переменных из программ плк. Плохая затея?
в способах передачи из ПЛК в SCADA нет ничего плохого или хорошего, уж всяко лучше чем каждую булевую переменную передавать одним регистром, тем более если SCADA умеет распаковывать и склеивать..
Да сказал уже, и еще раз скажу! Спасибо всем, на форуме очень часто многие помогают, за это конечно благодарен. А собирать биты в 1 байт, есть какие то камни подводные, я думал, также как и раскрывать, только уже битам присваивать. Все везде вижу про перестановку старшими, младшими, не подскажите при передачи каких переменных это работает?
Vitorgan порядок байт определяет процессор обычно, старшим или младшим вперед, иногда приходится их менять местами, в той же MasterScada это есть. Но так как вы оперируете программой в ПЛК можете и сами перевернуть если необходимо.
И.Петров предлагал использовать директивы, я вместо добавлений просто .Х использую осмысленные константы. По поводу старшим словом вперед работает когда переменная больше одного слова или для модбаса больше регистра
Еще раз повторю, что для данного случая, когда в/из скады для экономии точек, совсем ненужно никаких программных Паков/Унпаков.
Все переменные в слейве ПЛК, не зависимо от того, битовые они или BYTE или WORD или DWORD, перекрывают друг друга в адресном пространстве
Скрытый текст:
По этому вместо тог, чтобы городить огород в программе, просто используйте это свойство ПЛК ОВЕН.
А именно, вот вместо "упакованной в одну переменную 4 байта 4-ех 8-ми битовых масок, на языке ST"
Вложение 25677
Здесь MASK - упакованная маска
Просто вставьте в слейв четыре модуля 8 bits, взамен модуля 4byte
Вложение 25678
здесь Mask_1, Mask_2, Mask_3, Mask_4 Ваши четыре битовые маски
Скада даже этого и не заметит. Если она читала значения DWORD по адресу 4х 02, то и теперь получит те же данные по тому же адресу.
ЗЫ.
На запись из скады в ПЛК это тоже распространяется.
petera, как всегда, инструкция для чайника (то бишь меня). Все с картинками, примерами и стрелочками. Я Вас понял. Спасибо. То есть, я просто вывожу из плк 4 маски, а в модбасе это читаю как 1 четырехбайтовую переменную? правильно?
Vitorgan правильно, только вам придется либо правильно расположить маски, либо при чтении SCADA-ой поменять местами слова или байты в зависимости как происходит передача.
Люди, please help. все сделал как в примере petera.
Как связать эти биты из масок с булевыми переменными в программе codesys? ;))) у меня каждый бит это кнопка для старта процесса. кнопки - на панели,а процессы в ПЛК. то есть Задача: выдернуть бит из маски (modbus slave) и сделать так, чтобы он писал свое значение в переменную. bool1, bool2 и т. д.
Или как правильно обращаться к конкретному биту в маске?
Как сделать элегантно? заранее спасибо
SUPER %))) спасибо еще раз!
Уважаемые знатоки, в ходе работы с битовой маской всплыла следующая проблема:
Панель Weintek cmtSVR (modbus master) + ПЛК ОВЕН (slave), кнопка на панели при нажатии пишет "true" команда 0х адрес (2) в маску Mask_1.1, в контроллере от этого запускается процесс.
Суть проблемы: кнопка залипает, не отжимается или отжимается через раз. Панель пишет иногда - "пропала связь с сервером".
Подскажите что поправить и в какую сторону копать? проекты прилагаю. для codesys и для easy builder.