Ну хорошо, допустим присвоили для первого входа W1.0, для третьего входа W1.2, для шестнадцатого - W1.15. Это для одного модуля, а для второго, третьего модуля как прописывать?
Ну хорошо, допустим присвоили для первого входа W1.0, для третьего входа W1.2, для шестнадцатого - W1.15. Это для одного модуля, а для второго, третьего модуля как прописывать?
Спасибо! Попробую так сделать
Перечитывая данную ветку и все ссылочные документы с неё многоразово. попробую обобщить (а вы, опытнейшие, прошу поправьте меня, новичка в этом)....
Для того, чтобы прочитать состояния входов модуля МВ110-16Д по Modbus нет "лёгкого" пути, как для других модулей. Поэтому:
1) В конфигурации ПЛК в элементе Modbus Master добавляем подэлемент Universal Modbus Device, в котором в свою очередь подэлемент Register input module, которому в параметрах модуля прописываем адрес регистра 51, а самому регистру присваиваем название переменной, например DI16_1 (дискретные входы 16 модуль 1, к примеру если модулей несколько то 2,3 и т.д.).
Таким образом после опроса всех модулей получим и некую переменную размером с WORD и содержащую по сути некоторое состояние, которое каждым своим битом описывает состояние каждого входа модуля), причём прочитав мануал (п.4.2.2 стр 15), мы понимаем, что:
т.е. 1-й вход (бит 0) в состоянии "замкнут"
2-й вход (бит 1) в состоянии "разомкнут"
.....
10 вход (бит 9) в состоянии "замкнут"
2) Поскольку, обозвав полученную переменную прямо в конфигураторе ПЛК, мы заявили её глобально, то использовать в дальнейшем в программах (любых) мы можем :
Желая получить состояние соответствующего входа, обращаемся к переменной через точку, т.е. ко входам №№ 1, 7 и 16 мы обращаемся соответсвенно как DI16_1.0, DI16_1.6, DI16_1.15 из любой программы, ФБ или функции напрямую.
Вероятно можно "распаковать" состояние регистра при помощи утилиты UnPack библиотеки Util.lib, но в библиотеке она BYTE размерности, а как её превратить в WORD, или значение регистра разбить на 2 составляющие BYTE средствами CoDeSys я пока не знаю (по крайней мере негеморойными методами, без сдвигов влево-вправо и т.п.), возможно кто-от из опытных опишет это действие с выкладыванием скринов.
Просьба к опытным программистам, прокомментируйте, если что не так - поправьте меня в самом начале пути .
П.С. это не руководство к действию. это попытка новичка разобраться. задача - опрос концевиков клапанов, заведённых на МВ110-16Д и обработка их в ОВЕН ПЛК 100.
Хорошо, ознакомлюсь . А в чём, собственно плох способ чтения состояния конкретного входа через имя переменной и точку? Какие плюсы в том, чотбы распаковывать регистр и присваивать куче булевых переменных эти значения? Я пока этого не знаю (не сталкивался) и не понимаю, зачем что-то ещё делать, когда можно просто "прочитать" значение, и даже логически помнить что за параметр к какому входу физически поlключен. например к третьему входу второго модуля МВ110-16Д - просто читаем DI16_2.2...
Или есть какие-то подводные камни?
Всем привет!
Такая же проблема как у автора темы, только плк63 и мв110-16д, смотрел кучу примеров с этим модулем, сделал все так же, а входы с 9 по 16 все равно не работают в программе, возможно не правильно организована распаковка буферных данных?!
мой пример в архиве...
Нашел выход после недели мучения
предположения были верны - не правильно была организована распаковка данных.
Решение в архиве...
Пожалуйста объясните как открыть данные с МВ110-16ДН с 9 по 16 входы на языке CFC !! Я уже весь форум просмотрел! Все ссылки на примеры ЗАБЛОКИРОВАНЫ. В языке CFC у меня регистр инпут модуль с регистром 51 тип WORD. Ч то мне делать дальше в программе с этой переменной WORD в языке CFC?К Как распаковать? Как достать данные каждого бита из WORD?
Пожалуйста скинте рабочий пример или объясните - очень прошу
точно также, как и с 1го по 8й
Снимок экрана (1).png
Регистру WORD который вы прочитали дайте имя, например Mask, тогда разложить его на биты можно через точку, Mask.0 это бит 0 (b0), Mask.1 это бит 1 (b1).....Mask.15 это бит 15 (b15)
Смотри скрин 1 Маска.jpg
Собирать маску из битов в обратном порядке.
Последний раз редактировалось kondor3000; 10.03.2022 в 13:25.
FUNCTION_BLOCK UNPACK_W
VAR_INPUT
input: WORD;
END_VAR
VAR_OUTPUT
B0: BOOL;
B1: BOOL;
B2: BOOL;
B3: BOOL;
B4: BOOL;
B5: BOOL;
B6: BOOL;
B7: BOOL;
B8: BOOL;
B9: BOOL;
B10: BOOL;
B11: BOOL;
B12: BOOL;
B13: BOOL;
B14: BOOL;
B15: BOOL;
END_VAR
B0:= input.0;
B1:= input.1;
B2:= input.2;
B3:= input.3;
B4:= input.4;
B5:=input.5;
B6:= input.6;
B7:= input.7;
B8:= input.8;
B9:= input.9;
B10:=input.10;
B11:= input.11;
B12:= input.12;
B13:= input.13;
B14:= input.14;
B15:= input.15;