PDA

Просмотр полной версии : Запись и чтение переменных BOOL со slave устройства. ПОМОГИТЕ!



Алексей КИПОВЕЦ
17.06.2020, 15:02
Уважаемые форумчане, помогите советом. Подключаю ОВЕН КТР-121.01.10 к ОВЕН ПЛК-100 по RS-485. В сети мастером является сам ПЛК-100. Мне необходимо завести на ПЛК-100 с КТР-121 сигналы аварийных состояний и выдавать команду на старт / стоп котла по интерфейсу RS-485. Согласно карты регистров данные параметры имеют формат данных типа BOOL. Как выполнить ввод данных состояний параметров в ПЛК-100 и и выдавать команду на старт / стоп котла по интерфейсу RS-485, которая аналогично имеет формат данных типа BOOL? Через элемент 8 bit input module (ввод данных типа BOOL с КТР-121) и 8 bit output module (выдача команды на старт / стоп котла)? Если регистром типа BOOL 512.2 понятно все, то как отображать регистр типа BOOL 512.15? Помогите новичку разобраться. Заранее спасибо.

petera
17.06.2020, 16:07
Уважаемые форумчане, помогите советом. Подключаю ОВЕН КТР-121.01.10 к ОВЕН ПЛК-100 по RS-485. В сети мастером является сам ПЛК-100. Мне необходимо завести на ПЛК-100 с КТР-121 сигналы аварийных состояний и выдавать команду на старт / стоп котла по интерфейсу RS-485. Согласно карты регистров данные параметры имеют формат данных типа BOOL. Как выполнить ввод данных состояний параметров в ПЛК-100 и и выдавать команду на старт / стоп котла по интерфейсу RS-485, которая аналогично имеет формат данных типа BOOL? Через элемент 8 bit input module (ввод данных типа BOOL с КТР-121) и 8 bit output module (выдача команды на старт / стоп котла)? Если регистром типа BOOL 512.2 понятно все, то как отображать регистр типа BOOL 512.15? Помогите новичку разобраться. Заранее спасибо.

Зачем 8 bit input module? Тем более, что к 512 регистру так обратиться нельзя
У Вас же в 512 регистре битовая маска входов, по этому использовать нужно Rerister input module и читать всю маску(весь регистр 512)
В программе кодесис использовать битовую адресацию разрядов, через точку - Имя.Номер бита (512.14 или 512.2)
49675

Алексей КИПОВЕЦ
17.06.2020, 17:30
Правильно я понял. Для ввода из КТР-121 параметров в формате данных BOOL использую Rerister input module в котором указываю конкретный регистр, а уже в программе указываю конкретный бит? А для управления выходами КТР-121 в формате данных BOOL использую Rerister output module?

petera
17.06.2020, 22:16
Правильно я понял. Для ввода из КТР-121 параметров в формате данных BOOL использую Rerister input module в котором указываю конкретный регистр, а уже в программе указываю конкретный бит? А для управления выходами КТР-121 в формате данных BOOL использую Rerister output module?

Да, .

Алексей КИПОВЕЦ
18.06.2020, 13:33
Мой проект выполнен на CFC правильно ли я вас понял и выполнил чтение и запись регистров?

petera
18.06.2020, 14:10
Мой проект выполнен на CFC правильно ли я вас понял и выполнил чтение и запись регистров?

Какие физические номера регистров, в которых находятся эти BOOL?
49692

Правильно ли я понимаю
net_Start_K1.0 --> 532.0
net_Stop_K1.0 --> 533.0
net_ResetAv_K1.2 --> 532.2

Если да, то не следует под сброс (532.2) заводить отдельный Register output.
И net_Start_K1.0 и net_ResetAv_K1.2 должны использовать один и тот же Register output! Нужно полностью формировать битовую маску в ОДНОМ Register output
иначе будет ерунда - когда пишете net_ResetAv_K1.2 --> 532.2, то остальные биты регистра 532 будут иметь неопределенное состояние, в лучшем случае принудительно сброшены.

Что-то мне кажется, что Вы и для кодов аварии - на каждую завели свой Register input и читаете из них всего по одному биту?
Это неправильно т.к. расточительно и требует большего времени на обмен по шине!
Для каждого регистра с битовыми масками (512, 513, 514, 515, 544, 545) нужен только ОДИН Register input !

Alexey_Palich
18.06.2020, 14:12
49693Так примерно булевые читаются и записываются.

petera
18.06.2020, 14:47
В КТР-121 (а-ля ПР200) в карте регистров нет булевых переменных из областей 0х или 1х, а есть битовые маски в регистрах 4х(WORD).
Если использовать не документированные для КТР области 0х, как для ПР200, то можно попытаться и 8бит модули использовать
Только переводить придется
4х512.0 --> 0х8192
4х512.15 --> 0х8207
4х513.0 --> 0х8208
и т.д.
Геморрой в общем.

Alexey_Palich
18.06.2020, 15:10
Ну да не посмотрел. Делал я такой преобразователь когда то.

Алексей КИПОВЕЦ
18.06.2020, 15:10
Из выше описанного я все исправил и высылаю скрин лист. Объединил register input аварий по номерам регистров. Их всего два получается и register output (командное слово согласно РЭ на КТР-121) их тоже всего два получается (вкл / откл котла и сброс аварий). Посмотрите все ли я правильно сделал?

Alexey_Palich
18.06.2020, 15:15
49698Такую штучку использовать можно? Я такую переделывал на 16 разрядов, На входе цифра на выходе булевые один ноль.

petera
18.06.2020, 16:11
Из выше описанного я все исправил и высылаю скрин лист. Объединил register input аварий по номерам регистров. Их всего два получается и register output (командное слово согласно РЭ на КТР-121) их тоже всего два получается (вкл / откл котла и сброс аварий). Посмотрите все ли я правильно сделал?

Правильно, только почему в программу не все аварии берете из code_Error_1? Например нет 544.9 - Давление воды выше/ниже нормы?

Алексей КИПОВЕЦ
18.06.2020, 16:15
А я его беру из кода аварии 545.5 - много 545.6 - мало. Буду делать с расшифровкой на панели оператора. А 544.9 єто один параметр отклонения давления воды.

Алексей КИПОВЕЦ
19.06.2020, 23:32
Спасибо что помогли разобраться. Единственное можете посмотреть правильно ли я прописал в конфигурации ПЛК: параметры подключения КТР-121.01.10. Его я разделяю как два устройства Universal modbus device с одним и тем же адресом подключения. Через одно устройство Universal modbus device выполняю опрос регистров, а через втрое устройство выполняю запись значений. У первого устройства в параметрах подключения Work mode - by poll time и polling time ms - 100. У второго устройства в параметрах подключения Work mode - by value chenge и polling time ms - 100. Просто впервые сталкиваюсь с подключением КТР-121. Прибор то новый только вот вот недавно запустили его в продажу...Посмотрите пожалуйста, а то я что то засомневался...

Sulfur
20.06.2020, 10:03
Алексей КИПОВЕЦ
Я в подобных случаях обычно вот такие конструкции использую:
49732


Через одно устройство Universal modbus device выполняю опрос регистров, а через втрое устройство выполняю запись значений.
Обычно это работает. Только в вашем примере мне не очень нравится то, что порт ПЛК для СП307 является мастером. При таком способе обмена данные в регистрах панели обнуляются при включении. Если сделать мастером панель, а порт в ПЛК слейвом, то данные в этих регистрах по выключению ПЛК будут сохраняться в ретайн автоматически, и при последующем включении панель их прочитает и отобразит.

petera
20.06.2020, 10:17
Спасибо что помогли разобраться. Единственное можете посмотреть правильно ли я прописал в конфигурации ПЛК: параметры подключения КТР-121.01.10. Его я разделяю как два устройства Universal modbus device с одним и тем же адресом подключения. Через одно устройство Universal modbus device выполняю опрос регистров, а через втрое устройство выполняю запись значений. У первого устройства в параметрах подключения Work mode - by poll time и polling time ms - 100. У второго устройства в параметрах подключения Work mode - by value chenge и polling time ms - 100. Просто впервые сталкиваюсь с подключением КТР-121. Прибор то новый только вот вот недавно запустили его в продажу...Посмотрите пожалуйста, а то я что то засомневался...

Что-то Вы совсем мнительный :-)
Все правильно.

Алексей КИПОВЕЦ
20.06.2020, 22:00
Так у меня в программе ПЛК идет по rs-485 мастером сети, а все подключенные к нему устройства (модули МВ-110 и модуль МУ-110) slave устройствами относительно ПЛК. Панель оператора является мастером сети по RS-232 относительно ПЛК. Так в принце пе то возможно два мастера в сети один по RS-485, а другой по сети RS-232? Или я ошибаюсь? Поправите меня если я ошибаюсь...

Алексей КИПОВЕЦ
20.06.2020, 22:26
Тем более на панели оператора планирую выводить состояние котлов работа или авария и по какой причине авария, состояние общекотельных датчиков. Регулирование технологического процесса котельной (регулятор подмеса, приготовление ГВС). Измеренные значения планирую загружать в регистры панели типа PSW, а вот уставки регуляторов и алармов параметров работы котельной через устройства вода на панели оператора СП 307-Р записываю в регистры энергонезависимой памяти PFW. По этому при включении питания на ПЛК значения уставок регуляторов и алармов загрузятся из регистров энергонезависимой памяти PFW с панели оператора, даже если панель оператора будет отключена тоже (отключение питания на всю котельную). Подправите меня если я ошибаюсь...просто впервые делаю такой проект с такой большой обвязкой по связи ModBus RTU. Поделитесь своим опытом как сделали бы в подобной ситуации. Заранее спасибо.

Sulfur
21.06.2020, 16:27
Панель мастер, ПЛК слейв - все, что панель читает\пишет в регистры ПЛК по его выключению сохраняется в ретайн. Однако сохраняется вероятность сбоя\сброса (например при перепрошивки проекта), поэтому в ПЛК желательно делать проверку ключевых переменных на ноль, и если ноль, то записать в них некие безопасные значения.

Панель оператора является мастером сети по RS-232 относительно ПЛК.
Из вашего скриншота следует что наоборот - Панель слейв, ПЛК мастер.
На одном порту может быть только один мастер. Мастер на каждый порт свой. Это значит, что при имеющихся трех-четырех портах на ПЛК он может быть, например, на двух портах матером, а на оставшихся слейвом.

Алексей КИПОВЕЦ
22.06.2020, 14:45
Исходя из вашей рекомендации сделал панель мастером сети, ПЛК-100 slave, добавил в конфигурацию ПЛК-100 модуль statistic для отслеживания Power status контроллера ПЛК-100. Сделал небольшую программку для записи ключевых уставок регуляторов в retein при выключении контроллера от сети. Скирин программы прикладываю.

Алексей КИПОВЕЦ
22.06.2020, 14:47
Вот только подскажите как сделать проверку этих ключевых переменных на 0 и запись в них безопасных значений? Хотя бы пример приведите, а то пока с таким не сталкивался. Заранее спасибо.

petera
22.06.2020, 15:03
Исходя из вашей рекомендации сделал панель мастером сети, ПЛК-100 slave, добавил в конфигурацию ПЛК-100 модуль statistic для отслеживания Power status контроллера ПЛК-100. Сделал небольшую программку для записи ключевых уставок регуляторов в retein при выключении контроллера от сети. Скирин программы прикладываю.

Вы думаете, что retein переменные объявленные явно, в программе хранятся в каком-то другом месте чем неявно объявленные перемеренные в модуле слейв?
Масло - масляное хранить одни retein переменные в других retein переменных.

Достаточно, сделать хранение уставок в PFW регистрах панели, при включении панели - однократная запись всех в регистры ПЛК и забыть про проблему retein переменных(батарейка) в ПЛК.

petera
22.06.2020, 15:10
Вот Вам инструкция, как реализовать хранение уставок в PWF, копировать ВСЕ из панели в ПЛК при включении питания и копировать по одной при изменении оператором на экране https://owen.ru/forum/showthread.php?t=32014&p=316048&viewfull=1#post316048

Алексей КИПОВЕЦ
22.06.2020, 17:27
Спасибо большое разобрался. В вашем примере все очень просто.

Sulfur
23.06.2020, 09:29
Алексей КИПОВЕЦ

Вот только подскажите как сделать проверку этих ключевых переменных на 0 и запись в них безопасных значений? Хотя бы пример приведите, а то пока с таким не сталкивался.
Как делаю я в связке Панель-мастер\ПЛК-слейв:
1. Все переменные, объявленные в соответствующем порту ПЛК-слейв по умолчанию являются ретайн.
2. При перепрошивке\сбросе ПЛК они теряются, т. е. сбрасываются в нули (но остаются при выключении\включении ПЛК).
3. Для того, что бы избежать запуска установки\машины с неправильными (нулевыми) уставками\параметрами делаю проверку следующим образом:
В ПЛЦ_ПРГ:

var
init:bool; (*Флаг первичной инициализации, при включении ПЛК он всегда FALSE. Обычная BOOL-переменная*)
end_var
---

(*В самом начале ПЛЦ_ПРГ*)
IF NOT init THEN (*Если init не TRUE, то делаем далее*)
FirstInit(); (*Вызов программы первичной проверки и инициализации*)
init:=TRUE; (*Присваиваем TRUE, что бы больше не было вызова FirstInit до следующего перевключения\перезагрузки ПЛК*)
END_IF;
IF RecoveryFlag THEN (*Переменная BOOL GLOBAL*)
==Делаем вызов всплывающего окна с предупреждением о сбросе значений переменных к значениям по умолчанию==
==Сбрасываем RecoveryFlag в FALSE по подтверждению и закрытию окна==
END_IF;
-------
Создаем ПОУ FirstInit на ST
В секции VAR переменные не нужны, т. к. все используемые переменные, объявленные в соответствующем порту ПЛК-слейв по умолчанию являются так же и GLOBAL
----

PROGRAMM FirstInit
(*Тело программы*)
IF Var1=0 AND Var2=0 AND Var3=0 THEN (*Var1..Var3 - переменные, объявленные в соответствующем порту ПЛК-слейв, которые по
логике работы установки по определению НЕ могут иметь нулевое значение. Обычно нескольких переменных достаточно,
что бы понять, что произошел сброс в нули всех переменных в регистрах ПЛК-слейв*)
Var1:=*некое безопасное значение 1*;
Var2:=*некое безопасное значение 2*;
.
.
VarN:=*некое безопасное значение N*;
RecoveryFlag:=TRUE; (*Флаг факта сброса значений переменных в значения по умолчанию.
Можно использовать для вызова всплывающего окна на Панели с предупреждением и
квитированием(закрытие окна и сброс флага*)
END_IF;
-------
Преимущества данного способа:
1. Все сохраняемые переменные находятся в одном месте, что удобно при отладке на реальной установке.
2. При потере связи с Панелью ПЛК работает со значениями переменных, оставшихся в регистрах на момент потери связи.
3. Функции Панели сокращаются только до отображения и изменения переменных, т. к. всю математику (масштабирование и пр) можно делать в ПЛК.
---
Не претендую на идеологическую правильнось и кошерность, просто делюсь опытом, который применял на практике.