Просмотр полной версии : Красивая доступ к битам регистра ввода модуля
Добрый день
Имеется ПЛК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 такая же проблема в принципе и с выходами которые записываются не побитно а регистром
Можно использовать битовую адресацию через глобальные константы
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
Доступ к входам модуля через два регистра (не побитно) с адресами 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.
Хороший вариант, спасибо.
Жаль только что в этом случае нельзя избавится от названий которые присвоены регистрам ввода-вывода модуля
То есть для входа нужно помнить название регистра на котором он сидит и название входа. При большом количестве модулей тут может быть путаница.
Почитал хелп про опцию "Замена констант" - я так понял что влияет только при отладке онлайн - если она включена то с константами нельзя обращаться как с переменными - присваивать им значения. Но зато при включенной код в контроллере выполняется быстрей.
Возник еще вопрос:
Что произойдет если в область ввода вывода добавить 8 bit input module а читать его командой чтения регистра (т е 16 бит )?
28764
Прочитаются только 8 бит в модуль Bit8_1?
или остальные 8 бит попадут в следующий модуль ввода (на рисунке под именем Bit8_2)? Если это так то это удобный способ битового доступа к входам или выходам
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
Этот способ решает все проблемы
Спасибо огромное. Буду пользоваться
кстати прописал строку
createbitchannels=true
и для следующих модулей
[Module.ID2003]
Name=Register input module
[Module.ID2004]
Name=Register output module
теперь и регистры стало возможно именовать побитно
красота
Надеюсь эта самодеятельность ни где не аукнется
кстати прописал строку
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" оригинальный? проблем не будет?
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot