PDA

Просмотр полной версии : Битовая маска



Vitorgan
01.08.2016, 17:17
Добрый день, уважаемые профессионалы и любители, подскажите пример объединения например: 4-ех 8-ми битовых масок в одну переменную 4 байта, на языке ST. Или где об этом можно почитать. Быстрый поиск не увенчался успехом. Заранее благодарю за помощь.

alex55
01.08.2016, 20:18
Можно, если сильно постараться, но зачем это надо? Не просматривается необходимости при работе с овеном..

Yegor
01.08.2016, 20:21
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;

Валенок
01.08.2016, 21:41
или так

VAR
b AT %MB0 : ARRAY[0..3] OF BYTE;
mask AT %MD0 : DWORD;
END_VAR
;

Vitorgan
01.08.2016, 21:54
Всем спасибо, буду пробовать. А необходимость, это передавать с плк в скаду сразу 32 булевых значений одной переменной.

krollcbas
02.08.2016, 08:04
Для меня так нагляднее. Оперируем последним битом в 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;

melky
02.08.2016, 09:13
krollcbas а для операции со всеми битами делать простыню кода ?
Уж лучше FB сделать со сдвигом регистров, тогда из параметров только номер бита и запись значения

capzap
02.08.2016, 09:19
krollcbas а для операции со всеми битами делать простыню кода ?
Уж лучше FB сделать со сдвигом регистров, тогда из параметров только номер бита и запись значения
а Вы заглядывали в оскатовскую функцию? krollcbas конкретно написал как поступить для отдельного взятого бита, с намеком что для остальных можно написать функцию

А ТС вобще то нужно байты склеить а не биты, вот какую претензию надо было предъявить krollcbas

melky
02.08.2016, 09:44
Сплю с утра, не ругайтесь. В Oscat много чего есть, возможно и необходимое TC.

Vitorgan
02.08.2016, 10:31
Столько примеров) столько споров. Вообще в идеале я хотел передавать из скады 2 2-ух байтовых маски для 2-ух 16Р, а из плк хотел передавать в скаду 4 байтовую переменную в которой склеены 2 модуля 8ДФ и +16 переменных из программ плк. Плохая затея?

melky
02.08.2016, 10:34
в способах передачи из ПЛК в SCADA нет ничего плохого или хорошего, уж всяко лучше чем каждую булевую переменную передавать одним регистром, тем более если SCADA умеет распаковывать и склеивать..

capzap
02.08.2016, 10:38
Столько примеров) столько споров. Вообще в идеале я хотел передавать из скады 2 2-ух байтовых маски для 2-ух 16Р, а из плк хотел передавать в скаду 4 байтовую переменную в которой склеены 2 модуля 8ДФ и +16 переменных из программ плк. Плохая затея?
Егор с Валенком выложили примеры, пользуйтесь и спасибо людям скажите. И здесь ни кто Вас не осудил за такое использование

Vitorgan
02.08.2016, 10:42
Егор с Валенком выложили примеры, пользуйтесь и спасибо людям скажите. И здесь ни кто Вас не осудил за такое использование

Да сказал уже, и еще раз скажу! Спасибо всем, на форуме очень часто многие помогают, за это конечно благодарен. А собирать биты в 1 байт, есть какие то камни подводные, я думал, также как и раскрывать, только уже битам присваивать. Все везде вижу про перестановку старшими, младшими, не подскажите при передачи каких переменных это работает?

melky
02.08.2016, 10:51
Vitorgan порядок байт определяет процессор обычно, старшим или младшим вперед, иногда приходится их менять местами, в той же MasterScada это есть. Но так как вы оперируете программой в ПЛК можете и сами перевернуть если необходимо.

capzap
02.08.2016, 10:55
И.Петров предлагал использовать директивы, я вместо добавлений просто .Х использую осмысленные константы. По поводу старшим словом вперед работает когда переменная больше одного слова или для модбаса больше регистра

petera
02.08.2016, 13:40
Еще раз повторю, что для данного случая, когда в/из скады для экономии точек, совсем ненужно никаких программных Паков/Унпаков.
Все переменные в слейве ПЛК, не зависимо от того, битовые они или BYTE или WORD или DWORD, перекрывают друг друга в адресном пространстве
http://www.owen.ru/forum/attachment.php?attachmentid=12345&d=1395648726
По этому вместо тог, чтобы городить огород в программе, просто используйте это свойство ПЛК ОВЕН.
А именно, вот вместо "упакованной в одну переменную 4 байта 4-ех 8-ми битовых масок, на языке ST"
25677
Здесь MASK - упакованная маска
Просто вставьте в слейв четыре модуля 8 bits, взамен модуля 4byte
25678
здесь Mask_1, Mask_2, Mask_3, Mask_4 Ваши четыре битовые маски

Скада даже этого и не заметит. Если она читала значения DWORD по адресу 4х 02, то и теперь получит те же данные по тому же адресу.

ЗЫ.
На запись из скады в ПЛК это тоже распространяется.

Vitorgan
02.08.2016, 14:22
petera, как всегда, инструкция для чайника (то бишь меня). Все с картинками, примерами и стрелочками. Я Вас понял. Спасибо. То есть, я просто вывожу из плк 4 маски, а в модбасе это читаю как 1 четырехбайтовую переменную? правильно?

melky
02.08.2016, 14:54
Vitorgan правильно, только вам придется либо правильно расположить маски, либо при чтении SCADA-ой поменять местами слова или байты в зависимости как происходит передача.

petera
02.08.2016, 15:59
petera, как всегда, инструкция для чайника (то бишь меня). Все с картинками, примерами и стрелочками. Я Вас понял. Спасибо. То есть, я просто вывожу из плк 4 маски, а в модбасе это читаю как 1 четырехбайтовую переменную? правильно?

Правильно, если бы я читал этот DWORD в панель СПхх, то Маsк_4 - самый старший байт в DWORD, а Mask_1 - самый младший. Как читает Ваша скада легко определите экспериментально

Andrey_om
17.05.2018, 15:59
Люди, please help. все сделал как в примере petera.
Как связать эти биты из масок с булевыми переменными в программе codesys? ;))) у меня каждый бит это кнопка для старта процесса. кнопки - на панели,а процессы в ПЛК. то есть Задача: выдернуть бит из маски (modbus slave) и сделать так, чтобы он писал свое значение в переменную. bool1, bool2 и т. д.
Или как правильно обращаться к конкретному биту в маске?
Как сделать элегантно? заранее спасибо

capzap
17.05.2018, 16:06
Люди, please help. все сделал как в примере petera.
Как связать эти биты из масок с булевыми переменными в программе codesys? ;))) у меня каждый бит это кнопка для старта процесса. кнопки - на панели,а процессы в ПЛК. то есть Задача: выдернуть бит из маски (modbus slave) и сделать так, чтобы он писал свое значение в переменную. bool1, bool2 и т. д.
Или как правильно обращаться к конкретному биту в маске?
Как сделать элегантно? заранее спасибо

bool1 := modbusvalue.0
bool2 := modbusvalue.1

Andrey_om
17.05.2018, 16:32
SUPER %))) спасибо еще раз!

Andrey_om
25.05.2018, 00:36
Уважаемые знатоки, в ходе работы с битовой маской всплыла следующая проблема:
Панель Weintek cmtSVR (modbus master) + ПЛК ОВЕН (slave), кнопка на панели при нажатии пишет "true" команда 0х адрес (2) в маску Mask_1.1, в контроллере от этого запускается процесс.

Суть проблемы: кнопка залипает, не отжимается или отжимается через раз. Панель пишет иногда - "пропала связь с сервером".

Подскажите что поправить и в какую сторону копать? проекты прилагаю. для codesys и для easy builder.