Просмотр полной версии : Чтение регистра из модуля ввода
Добрый день
Есть связка ПЛК-160-30 [M2] и модуль дискретного ввода MB110. Все сконфигурировал и могу обращаться к входам модуля через точку: module_in.0, module_in.1 и тд.
Вопрос: можно ли привязать каждый вход модуля к отдельной переменной (module_id1, module_id2 и тд)? (также как это работает в самом ПЛК-160, там для каждого входа/выхода можно задать свою переменную)
Да, сейчас сконфигурировано так, что я читаю битовую маску всех входов (регистры 99 и 100).
Но в документациии к модулю я вижу что можно считать состояние каждого отдельного входа (Значение на входе № 1 - регистр 101, Значение на входе № 2 - регистр 102 и тд).
Вот не пойму как сконфигурировать модуль так, чтоб считывать каждый отдельный регистр в отдельную переменную.
Сейчас вот так:
56975
Ну если в ПЛК руками разобрать.
Я так делаю: беру маску и через точки присваиваю её биты булевым переменным (типа - кнопки, лампы) - и с ними работаю
kondor3000
14.09.2021, 11:19
Да, сейчас сконфигурировано так, что я читаю битовую маску всех входов (регистры 99 и 100).
Но в документациии к модулю я вижу что можно считать состояние каждого отдельного входа (Значение на входе № 1 - регистр 101, Значение на входе № 2 - регистр 102 и тд).
Вот не пойму как сконфигурировать модуль так, чтоб считывать каждый отдельный регистр в отдельную переменную.
Сейчас вот так:
56975
Не понимаю чем вас не устраивает
Bit1:=module_in.0;
Bit2:=module_in.1;
............
Bit16:=module_in.15; и т. д., как вы хотели каждой переменной присвоен бит. Этим вариантом все пользуются).
Но если очень надо, можно в каждый регистр вместо RegistrInput добавить по 2 шт. 8 BitInput, но это неточно))), есть и третий вариант, тут Petera писал в соседних темах.
Вот я отмечусь тоже.
Я так делаю:
56977 56978 56979
kondor3000
14.09.2021, 12:07
Вот нашёл ещё вариант, пост № 5 от Petera.
https://owen.ru/forum/showthread.php?t=22749&p=187668&viewfull=1#post187668
Не понимаю чем вас не устраивает
Bit1:=module_in.0;
Bit2:=module_in.1;
............
Bit16:=module_in.15; и т. д., как вы хотели каждой переменной присвоен бит. Этим вариантом все пользуются).
Но если очень надо, можно в каждый регистр вместо RegistrInput добавить по 2 шт. 8 BitInput, но это неточно))), есть и третий вариант, тут Petera писал в соседних темах.
Не хотел делать именно так, потому что это лишние операции присваивания в программе. Аналогично в модуле вывода в конце программы нужно делать
module_out.0 := leftLampState;
вместо того, чтобы в коде программы сделать leftLampState := TRUE; и все (для этого мне и нужно переменную leftLampState привязать к определенному входу / выходу, тогда сразу после leftLampState := TRUE состояние выхода будет меняться )
но ведь конфигуратор не далает групповые запросы, если его не попросить, а время потраченное на последовательный опрос регистров несоизмеримо больше чем в плк присвоить из слова биты булевым переменным и обратно
Да, согласен. Тогда остается вариант, как Petera предложил (но там небольшой хак)
kondor3000
15.09.2021, 00:11
Да, согласен. Тогда остается вариант, как Petera предложил (но там небольшой хак)
А второй вариант проверить?
capzap ...а ведь хочется иметь условные "Кнопки", "Лампы", "Датчики дверей" и прочие не в виде полей структуры. А они могут быть раскиданы по разным модулям IO.
Я руками всё присваиваю (и думаю написать тулзу, которая этот код будет генерировать автоматически). Делаю задачу с названием типа TaskIO, и там окучиваю:
* Опрос модулей (OCL, CommLib)
* Разбор битовых полей
* Режим теста IO (когда специальный вход врубает все-все выходы)
* Разбор данных с Modbus-устройств (это когда от датчика получаешь "Температура х 100" и надо перевести в REAL).
Система устоялась ща, но неудобная - это факт.
Добавил. Каналы я именую по тому, как модули обозначаются в щите (у меня весь ОВЕН - с префиксом W - W1, W2, W3) и по их типу. То есть: W2_32DI, W3_32DO, W6_8AI (если читаем пакетно).
В документации идёт большая таблица со списком IO по модулям, и поэтому если по ней видно что какая-нибудь кнопка света спальни верха подключена на 10ый вход модуля W2, то в коде присваивание будет выглядеть так:
hwBtnLightSpalnVerh := W2_32DI.9;
capzap Так я готов учиться. Если речь идёт про какой-нить UNION из DWORD и битовых полей или MemCpy из буфера в структуру - то это я понял.
Но как быть, если я хочу видеть весь список переменных с префиксами (я же не просто так их делаю), ну типа:
hwBtnLightNNN
hwBtnMasterNNN
hwBtnTPolNNN
hwBtnVentNNN
а они будут распиханы по разным модулям IO? Я же хотел и хочу уйти от абстракции и работать в коде с булевыми переменными.
capzap Почитал. Так это шило на мыло: от W2_32DI никуда не уходим. А я хочу список своих переменных без ссылок на модули IO.
Я понял, ага: у тебя идёт от помещения, а у меня - от назначения.
А как ты так структурируешь через точку? Делаешь кучу своих типов данных? Или объектную модель, которая на лету собирает метаданные как у 1С?
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot