Просмотр полной версии : Битовая маска
Vitorgan
01.08.2016, 17:17
Добрый день, уважаемые профессионалы и любители, подскажите пример объединения например: 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
;
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;
krollcbas а для операции со всеми битами делать простыню кода ?
Уж лучше FB сделать со сдвигом регистров, тогда из параметров только номер бита и запись значения
krollcbas а для операции со всеми битами делать простыню кода ?
Уж лучше FB сделать со сдвигом регистров, тогда из параметров только номер бита и запись значения
а Вы заглядывали в оскатовскую функцию? krollcbas конкретно написал как поступить для отдельного взятого бита, с намеком что для остальных можно написать функцию
А ТС вобще то нужно байты склеить а не биты, вот какую претензию надо было предъявить krollcbas
Сплю с утра, не ругайтесь. В Oscat много чего есть, возможно и необходимое TC.
Vitorgan
02.08.2016, 10:31
Столько примеров) столько споров. Вообще в идеале я хотел передавать из скады 2 2-ух байтовых маски для 2-ух 16Р, а из плк хотел передавать в скаду 4 байтовую переменную в которой склеены 2 модуля 8ДФ и +16 переменных из программ плк. Плохая затея?
в способах передачи из ПЛК в SCADA нет ничего плохого или хорошего, уж всяко лучше чем каждую булевую переменную передавать одним регистром, тем более если SCADA умеет распаковывать и склеивать..
Столько примеров) столько споров. Вообще в идеале я хотел передавать из скады 2 2-ух байтовых маски для 2-ух 16Р, а из плк хотел передавать в скаду 4 байтовую переменную в которой склеены 2 модуля 8ДФ и +16 переменных из программ плк. Плохая затея?
Егор с Валенком выложили примеры, пользуйтесь и спасибо людям скажите. И здесь ни кто Вас не осудил за такое использование
Vitorgan
02.08.2016, 10:42
Егор с Валенком выложили примеры, пользуйтесь и спасибо людям скажите. И здесь ни кто Вас не осудил за такое использование
Да сказал уже, и еще раз скажу! Спасибо всем, на форуме очень часто многие помогают, за это конечно благодарен. А собирать биты в 1 байт, есть какие то камни подводные, я думал, также как и раскрывать, только уже битам присваивать. Все везде вижу про перестановку старшими, младшими, не подскажите при передачи каких переменных это работает?
Vitorgan порядок байт определяет процессор обычно, старшим или младшим вперед, иногда приходится их менять местами, в той же MasterScada это есть. Но так как вы оперируете программой в ПЛК можете и сами перевернуть если необходимо.
И.Петров предлагал использовать директивы, я вместо добавлений просто .Х использую осмысленные константы. По поводу старшим словом вперед работает когда переменная больше одного слова или для модбаса больше регистра
Еще раз повторю, что для данного случая, когда в/из скады для экономии точек, совсем ненужно никаких программных Паков/Унпаков.
Все переменные в слейве ПЛК, не зависимо от того, битовые они или 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 четырехбайтовую переменную? правильно?
Vitorgan правильно, только вам придется либо правильно расположить маски, либо при чтении SCADA-ой поменять местами слова или байты в зависимости как происходит передача.
petera, как всегда, инструкция для чайника (то бишь меня). Все с картинками, примерами и стрелочками. Я Вас понял. Спасибо. То есть, я просто вывожу из плк 4 маски, а в модбасе это читаю как 1 четырехбайтовую переменную? правильно?
Правильно, если бы я читал этот DWORD в панель СПхх, то Маsк_4 - самый старший байт в DWORD, а Mask_1 - самый младший. Как читает Ваша скада легко определите экспериментально
Andrey_om
17.05.2018, 15:59
Люди, please help. все сделал как в примере petera.
Как связать эти биты из масок с булевыми переменными в программе codesys? ;))) у меня каждый бит это кнопка для старта процесса. кнопки - на панели,а процессы в ПЛК. то есть Задача: выдернуть бит из маски (modbus slave) и сделать так, чтобы он писал свое значение в переменную. bool1, bool2 и т. д.
Или как правильно обращаться к конкретному биту в маске?
Как сделать элегантно? заранее спасибо
Люди, 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.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot