PDA

Просмотр полной версии : Красивая доступ к битам регистра ввода модуля



razv
16.01.2017, 16:37
Добрый день
Имеется ПЛК110 master и МВ110-32ДН slave
Протокол Modbus RTU
Доступ к входам модуля через два регистра (не побитно) с адресами 99 и 100 функцией Read holding registr
Все хорошо но как красиво получить доступ к конкретному входу

1 вариант
в конфигураторе ПЛК присвоить регистрам имена например In_1_16 и In_17_32
читать состояние входов по адресации бита в переменной например In_1_16.5 - состояние входа 6
Плохо то что входа в этом случае обезличены - нельзя их назвать как то удобно
если потребуется перенести вход на другой модуль или бит то придется искать и заменять во все программе

2 вариант
объявить глобальную переменную по адресу области ввода модуля например _In_1_16 AT %IW6.3.0.0 : WORD;
Проблемы теже что и с предыдущем вариантом

3 вариант
каждый раз присваивать BOOL переменным значения битов из регистра ввода модуля
например
In1 := In_1_16.0;
In2 := In_1_16.1;
In3 := In_1_16.2;
etc...
Уже можно обращаться к входам по красивым и правильным названиям и легко пересадить программную переменную на другой вход но этот вариант увеличивает объем программы и время ее выполнения

Вопрос:
Существует ли еще какие то возможности удобно присвоить переменные входам модуля или расположить переменную по адресу бита входа
Хотя конечно последнее глупость - невозможно расположить булевую переменную 8 бит в памяти 1 бита входа

Поделитесь кто как делает пожалуйста

PS такая же проблема в принципе и с выходами которые записываются не побитно а регистром

petera
16.01.2017, 19:13
Можно использовать битовую адресацию через глобальные константы
28756

не забыть вкл. эту галку
28757

Самый простой способ
VAR_GLOBAL CONSTANT
In1:INT:=0;
In2:INT:=1;
In3:INT:=2;
In4:INT:=3;
In5:INT:=4;
In6:INT:=5;
In7:INT:=6;
In8:INT:=7;
In9:INT:=8;
In10:INT:=9;
In11:INT:=10;
In12:INT:=11;
In13:INT:=12;
In14:INT:=13;
In15:INT:=14;
In16:INT:=15;
In17:INT:=16;
In18:INT:=17;
In19:INT:=18;
и т.д.
28758
В отличии от Ваших вар.1 и 2 в том, что если нужно "пересадить программную переменную на другой вход", например поменять местами In1 и In5, то достаточно в объявлении констант поменять значения
VAR_GLOBAL CONSTANT
In1:INT:=4;
In2:INT:=1;
In3:INT:=2;
In4:INT:=3;
In5:INT:=0;
In6:INT:=5;
In7:INT:=6;
..............
Вариант Б. Осмысленные названия.
VAR_GLOBAL CONSTANT
Urov_man:INT:=0;
Razr_man:INT:=1;
Par_man:INT:=2;
Urov_plus:INT:=3;
Urov_minus:INT:=4;
Razr_plus:INT:=5;
Razr_minus:INT:=6;
Par_plus:INT:=7;
Par_minus:INT:=8;
Produvka:INT:=9;
TST_Alarm:INT:=10;
TST_Next:INT:=11;
TST_Prev:INT:=12;
и т.д.
28759

petera
17.01.2017, 05:42
Доступ к входам модуля через два регистра (не побитно) с адресами 99 и 100 функцией Read holding registr
Все хорошо но как красиво получить доступ к конкретному входу
1. Совсем не обязательно читать с помощью двух регистров, можно прочитать битовую маску маску из МВ110-32Д с помощью одного 32bit input module

2. Совсем забыл про такой способ - самый красивый - http://www.owen.ru/forum/showthread.php?t=21976&p=178890&viewfull=1#post178890
Про те шаблоны, что там упоминаются я ничего не нашел. Но в этой теме есть совет

Галочку надо в таргете поставить для модуля 32 bit input или output.
createbitchannels=true
Чтобы среда генерила битовые коннекторы. Что и было сделано в шаблоне. Шаблона то у Вас нет? Сделайте сами, по аналогии с 8bit
Воспользуемся этим советом на примере ПЛК160
Ищем на диске С папку "C:\CoDeSys\Targets\PLC110.60_M\IOModules" или "C:\CoDeSys\Targets\PLC110.60_L\IOModules" в зависимости от вида лицензии на ПЛК (L или M).
Блокнотом открываем файл "hardware.cfg" в нем через поиск ищем "[Module.ID2005]"
В этой группе добавляем строку
createbitchannels=true
28760

В Содесис обновить конфигурацию ПЛК (Дополнение, Стандартная конфигурация) или создать новый проект с ПЛК110-60(L или M).
Теперь в «Universal ModBus Device» вставить не 2 Register input module, а 32bit input module.
28761
Адрес регистра 99 из руководства.
Теперь можно присвоить имена отдельным разрядам прямо в конфигурации
Например IN1, IN2, IN3,... и тд.
Эти имена будут глобальными, их дополнительно нигде больше не нужно объявлять(описывать).
28762

Тот же фокус можно сделать, например для Register input module
28763

Для таких модулей, если отдельные биты не нужны, то никто и не заставляет именовать отдельные биты. Остается возможность присваивать имена регистрам, как и у обычных 32bit module или Register input module.

razv
17.01.2017, 05:50
Хороший вариант, спасибо.
Жаль только что в этом случае нельзя избавится от названий которые присвоены регистрам ввода-вывода модуля
То есть для входа нужно помнить название регистра на котором он сидит и название входа. При большом количестве модулей тут может быть путаница.

Почитал хелп про опцию "Замена констант" - я так понял что влияет только при отладке онлайн - если она включена то с константами нельзя обращаться как с переменными - присваивать им значения. Но зато при включенной код в контроллере выполняется быстрей.

Возник еще вопрос:
Что произойдет если в область ввода вывода добавить 8 bit input module а читать его командой чтения регистра (т е 16 бит )?
28764
Прочитаются только 8 бит в модуль Bit8_1?
или остальные 8 бит попадут в следующий модуль ввода (на рисунке под именем Bit8_2)? Если это так то это удобный способ битового доступа к входам или выходам

razv
17.01.2017, 06:07
1. Совсем не обязательно читать с помощью двух регистров, можно прочитать битовую маску маску из МВ110-32Д с помощью одного 32bit input module

2. Совсем забыл про такой способ - самый красивый - http://www.owen.ru/forum/showthread.php?t=21976&p=178890&viewfull=1#post178890
Про те шаблоны, что там упоминаются я ничего не нашел. Но в этой теме есть совет


Отлично!!!
Попробовал - все получилось!
Не понятно почему эта опция не включена поумолчанию в таргете
А то называется 32 bit module а выглядиn как DWORD

Этот способ решает все проблемы
Спасибо огромное. Буду пользоваться

razv
17.01.2017, 06:35
кстати прописал строку
createbitchannels=true
и для следующих модулей

[Module.ID2003]
Name=Register input module

[Module.ID2004]
Name=Register output module

теперь и регистры стало возможно именовать побитно
красота

Надеюсь эта самодеятельность ни где не аукнется

petera
17.01.2017, 09:10
кстати прописал строку
createbitchannels=true
и для следующих модулей

[Module.ID2003]
Name=Register input module

[Module.ID2004]
Name=Register output module

теперь и регистры стало возможно именовать побитно
красота

Надеюсь эта самодеятельность ни где не аукнется
Для модулей в Slave это тоже работает.

DIPHENHYDRAMINE
20.01.2019, 11:25
1. Совсем не обязательно читать с помощью двух регистров, можно прочитать битовую маску маску из МВ110-32Д с помощью одного 32bit input module

2. Совсем забыл про такой способ - самый красивый - http://www.owen.ru/forum/showthread.php?t=21976&p=178890&viewfull=1#post178890
Про те шаблоны, что там упоминаются я ничего не нашел. Но в этой теме есть совет

Воспользуемся этим советом на примере ПЛК160
Ищем на диске С папку "C:\CoDeSys\Targets\PLC110.60_M\IOModules" или "C:\CoDeSys\Targets\PLC110.60_L\IOModules" в зависимости от вида лицензии на ПЛК (L или M).
Блокнотом открываем файл "hardware.cfg" в нем через поиск ищем "[Module.ID2005]"
В этой группе добавляем строку
createbitchannels=true
28760

В Содесис обновить конфигурацию ПЛК (Дополнение, Стандартная конфигурация) или создать новый проект с ПЛК110-60(L или M).
Теперь в «Universal ModBus Device» вставить не 2 Register input module, а 32bit input module.
28761
Адрес регистра 99 из руководства.
Теперь можно присвоить имена отдельным разрядам прямо в конфигурации
Например IN1, IN2, IN3,... и тд.
Эти имена будут глобальными, их дополнительно нигде больше не нужно объявлять(описывать).
28762

Тот же фокус можно сделать, например для Register input module
28763

Для таких модулей, если отдельные биты не нужны, то никто и не заставляет именовать отдельные биты. Остается возможность присваивать имена регистрам, как и у обычных 32bit module или Register input module.

а если потом открыть этот проект на другом компе, где
файл "hardware.cfg" оригинальный? проблем не будет?