Просмотр полной версии : Задание контроллеру из двух мест
kanadchikov
29.01.2013, 12:16
Уважаемы, помогите решить задачу. Имеется контроллера ПЛК-154, сенсорная панель, СКАДА. Панель (modbus мастер) подключена к ПЛК по RS485. Контроллер подключен к СКАДе по Modbus TCP и является slave. Как навести мосты, чтобы уствавки можно было менять из двух мест?
Для уставки заведите переменные: значение с панели, значение со скады и значение для ПЛК. Если Значение с панели не равно значению для ПЛК, то значению для ПЛК и для скады присваивается значение с панели. И наоборот. Как то так...
kanadchikov
29.01.2013, 14:34
Много мороки, единственно, что пока работает - дополнительная кнопка "Записать"
Для уставки заведите переменные: значение с панели, значение со скады и значение для ПЛК. Если Значение с панели не равно значению для ПЛК, то значению для ПЛК и для скады присваивается значение с панели. И наоборот. Как то так...
Реально не получается у меня это реализовать:/
Есть панель мастер (по 232) и opc слэйв (по 485 gprs). Пишу
IF NOT strt_panel THEN
IF mm_day<>p_mm_day THEN
mm_day:=p_mm_day;
os_mm_day:=mm_day;
END_IF;
IF b_modemLine=3 THEN
bl2(ENABLE:=TRUE , TIMELOW:=T#30s , TIMEHIGH:=T#30s);
IF bl2.OUT THEN
comm2:=255;
IF mm_day<>is_mm_day THEN
mm_day:=is_mm_day;
p_mm_day:=mm_day;
END_IF;
os_mm_day:=mm_day;
ELSE
bl2(ENABLE:=FALSE , TIMELOW:=T#5s , TIMEHIGH:=T#5s);
comm2:=254;
END_IF;
END_IF;
END_IF;
Работает очень коряво, во время работы gprs нельзя поменять уставку с панели. Уже несколько вариантов пробовал, но прямо чтобы адекватная работа получилось - не выходит. Как правильнее это можно реализовать? Адреса mm_day, p_mm_day, os_mm_day и is_mm_day на последний вариант одинаковы.
Просто же! Как и писал kgsh82, сделайте переменную, в которую панель может записывать своё значение (r_panel), аналогично, переменную, в которую пишет скада (r_scada), и дополнительную переменную в ПЛК (r_plc), и пишете например так:
IF r_panel<>r_plc THEN
r_plc:=r_panel;
r_scada:=r_panel;
END_IF;
IF r_scada<>r_plc THEN
r_plc:=r_scada;
r_panel:=r_scada;
END_IF;
Тут даже не надо заводить переменные для значений от предыдущего цикла ПЛК.
Просто же!Ну хз. Переменные на ввод и на вывод у слейва как правило разные.
Я обычно систему команд делаю. Три-пять записываемых регистров идут на код команды и её параметры, а остальные читаемые — на передачу текущего состояния. Панель или скада однократно записывает в свой или чужой регистр код и параметры, а состояние считывает постоянно. Можно хоть десять панелей подключить, и без разницы мастер или слейв.
(* Панели А и Б, для каждой свой набор читаемых и записываемых регистров *)
IF КодКомандыА <> 0 THEN
CASE КодКомандыА OF
КомандаОткрытьКлапан:
ОткрытьКлапан(ПараметрА0);
КомандаЗакрытьКлапан:
ЗакрытьКлапан(ПараметрА0);
END_CASE
(* Чтобы только один раз выполнилось *)
КодКомандыА := 0;
END_IF
IF КодКомандыБ <> 0 THEN
CASE КодКомандыБ OF
КомандаОткрытьКлапан:
ОткрытьКлапан(ПараметрБ0);
КомандаЗакрытьКлапан:
ЗакрытьКлапан(ПараметрБ0);
END_CASE
КодКомандыБ := 0;
END_IFКак видно, по вкусу можно оформить в виде ФБ или наоборот пропускать разные наборы команд (типа: с одного поста можно открывать и закрывать, а со второго — только закрывать). Уже проверял с двумя СПК110 (обе — мастер) и ПЛК110 (слейв по двум портам). Сейчас так делаю на установку с двумя постами.
Ну хз. Переменные на ввод и на вывод у слейва как правило разные. Зачем так? Я сейчас успешно веду проект, там как раз СП270 - мастер, ПЛК100 - слейв (Модбас), и есть много регистров которые пишут и читают как панель, так и ПЛК, и часто это удобно.
Просто же! Как и писал kgsh82, сделайте переменную, в которую панель может записывать своё значение (r_panel), аналогично, переменную, в которую пишет скада (r_scada), и дополнительную переменную в ПЛК (r_plc), и пишете например так:
IF r_panel<>r_plc THEN
r_plc:=r_panel;
r_scada:=r_panel;
END_IF;
IF r_scada<>r_plc THEN
r_plc:=r_scada;
r_panel:=r_scada;
END_IF;
Тут даже не надо заводить переменные для значений от предыдущего цикла ПЛК.
В том то и дело, что данный код не работает как надо. То есть при
IF NOT strt_panel THEN
hh_day:=p_hh_day;
IF p_mm_day<>mm_day THEN
mm_day:=p_mm_day;
os_mm_day:=p_mm_day;
END_IF;
END_IF;
IF b_modemLine=3 THEN
comm2:=255;
IF is_mm_day<>mm_day THEN
mm_day:=is_mm_day;
p_mm_day:=is_mm_day;
END_IF;
os_mm_day:=mm_day;
ELSE comm2:=254;
END_IF;
уставка меняется только со скады, с панели поменять уже не получается.
p_mm_day - слэйв
os_mm_day, is_mm_day - мастер
mm_day - внутр. глоб. переменная
Похоже придется разбираться с CASE...
Я показал сам принцип, который работает 100%, это очевидно. У вас где-то какие-то грабли:
1) В вашем примере 4 переменных, в моём - 3. Не понятно, чем у вас различаются os_mm_day и is_mm_day (и зачем os_mm_day присваивается ещё и после условного оператора (третья снизу строчка)). И вообще, эти дополнительные условия (на модем) которые у вас там, я не могу проверить, т. к. не знаю полной логики работы вашей программы. Блок, отвечающий за обновление уставок, должен вообще выполняться безусловно, выделите его в отдельный блок. Возможно, какие-то дополнительные условия и мешают его нормальной работе.
2) Проверьте внимательно, нужные ли команды на запись вы используете в панели и скаде: префикс для команд на запись регистра - "4х", возможно, у вас где-то стоит "3х" (это только чтение).
И дело тут не в CASE. Это уже чисто эстетический вопрос. Я например вообще CASE не юзаю, даже в программах по 5 тысяч строк. Потому что по функциональности IF-ELSE-END_IF ничем не хуже.
P. S. Лучше структурировать код для условных операторов (клавишей Tab), удобнее читать будет, это общепринятый признак хорошего тона в программировании :)
Boris_K
Не могу понять как прописать команду на запись уставки. Код
IF ust1<>0 THEN
CASE ust1 OF
sm_ust_hh:
hh_day:=ip_hh_day;
p_hh_day:= hh_day;
os_hh_day:= hh_day;
END_CASE;
ust1:=0;
END_IF
выдает ошибку:
Требуется целое число или символьная константа
Необходимо Число, 'ELSE' или 'END_CASE'
Пробовал разные варианты, но ни один не работает. Что не правильно я прописываю, с CASE ещё не сталкивался особо, плохо понимаю принцип кода
ip_hh_day, p_hh_day, os_hh_day - сделал разные регистры
См. мой пост выше, я дополнил.
Boris_K
Требуется целое число или символьная константа
см.пост #11. Особенно обратите внимание на подчеркнутое
Boris_K
ip_hh_day, p_hh_day, os_hh_day - сделал разные регистры
Решил пока с CASE не заморачиваться, так как с IFами должно работать. В общем, добился хоть какого-нибудь результат с кодом:
IF NOT strt_panel THEN
p_hh:=hour;
p_mm:=minute;
p_ss:=second;
p_dd:=day;
p_mh:=month;
p_yy:=year;
IF p_hh_day<>hh_day THEN
hh_day:=p_hh_day;
os_hh_day:=hh_day;
END_IF;
p_hh_day:=hh_day;
IF b_modemLine=3 THEN
IF is_hh_day<>os_hh_day THEN
hh_day:=is_hh_day;
p_hh_day:=hh_day;
END_IF;
os_hh_day:=hh_day;
END_IF;
END_IF;
При этом переменные на один регистр завязал
14553 14554
Проблема, как я понял, кроется в скорости обмена данными со скадой по gprs. То есть алгоритм работает, если ставить задержку на
IF is_hh_day<>os_hh_day THEN
/*Здесь нужна задержка*/
hh_day:=is_hh_day;
p_hh_day:=hh_day;
END_IF;
Но время этой задержки из-за gprs вычислить нереально и соответственно изменение уставки срабатывает через раз.
в первоисточнике не пробовали прочитать http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
Читал, я конечно, общую суть понял, но не сообразил пока как это применить к своему случаю, на досуге ещё покумекаю конечно.
В общем, пока ломаю голову дальше...
p.s. насчёт табов понятно, просто пока тестю, мне так нагляднее, где что меняю
Не очень понял мысль насчёт задержки, но сомневаюсь что там где-то нужна задержка, это противоречит самой сути задачи, 95% что это неправильный путь. Или вам важно именно отследить момент, что в действительности сменило уставку последним - панель или скада, даже если разница в 1 секунду? Если да, то можно например вместе с новой уставкой передавать точное время в миллисекундах, которое было на тот момент, конечно тогда нужно будет его периодически синхронизировать, чтобы не успевала набежать значительная ошибка.
Уважаемы, помогите решить задачу. Имеется контроллера ПЛК-154, сенсорная панель, СКАДА. Панель (modbus мастер) подключена к ПЛК по RS485. Контроллер подключен к СКАДе по Modbus TCP и является slave. Как навести мосты, чтобы уствавки можно было менять из двух мест?
Соседняя тема http://www.owen.ru/forum/showthread.php?t=18199 заставила перечитать "owen_plc-configuration.pdf".
Если ПЛК является слейвом для обоих мест, то возможно два варианта решения доступа к одним и тем же переменным из разных мест без копирования в промежуточные переменные
1. Использовать несколько портов для одного Modbus Slave
14575---->14576
Для этого варианта все переменные будут общими для обоих мест.
2. Вставить Modbus Slave в другой Modbus Slave
14577----->14578
Для этого варианта только переменные встроенного Modbus Slave общими для обоих мест.
Второй вариант наверно можно приспособить и для случая, когда для одного места ПЛК слейв, а для другого мастер.
petera
Спасибо, это должно решить проблему и ощутимо уменьшить и упростить код. Буду тестить...
Когда ПЛК является слейвом для обоих мест, то оба варианта работают на ура.:rolleyes:
Но если мастер встроить в слейв, то слейв реально видит(и читает и пишет) во вложенном мастере только модули Register output, а Register input всегда отображаются в слейве с нулевым содержимым:(.
Когда ПЛК является слейвом для обоих мест, то оба варианта работают на ура.:rolleyes:
Но если мастер встроить в слейв, то слейв реально видит(и читает и пишет) во вложенном мастере только модули Register output, а Register input всегда отображаются в слейве с нулевым содержимым:(.
То есть, я правильно понимаю, что в данном случае если панель (мастер) записывает в Register input значение, что плк его не увидит? Если так, то это не вариант конечно.
SysLibCom - и область io-мастера легко совмещается со слейвом. В любом количестве
То есть, я правильно понимаю, что в данном случае если панель (мастер) записывает в Register input значение, что плк его не увидит? Если так, то это не вариант конечно.
В таком варианте нет. Только если сделать в мастере два модуля Register input(Work mode значение By poll time) и Register Output(Work mode значение By value change) с одинаковым адресом регистра. Т.е значение из панели сначала попадет в скаду(Register Output), а скада перешлет его(Register input) обратно в ПЛК. По другому у меня не получилось.:(
В общем, извращение ещё то, скорее всего я лучше sim'ку на статику переведу, проще должно быть
да, слэйв и 2 интерфейса рулят :)
Bigcrash
08.12.2020, 12:35
Соседняя тема http://www.owen.ru/forum/showthread.php?t=18199 заставила перечитать "owen_plc-configuration.pdf".
Если ПЛК является слейвом для обоих мест, то возможно два варианта решения доступа к одним и тем же переменным из разных мест без копирования в промежуточные переменные
1. Использовать несколько портов для одного Modbus Slave
14575---->14576
Для этого варианта все переменные будут общими для обоих мест.
2. Вставить Modbus Slave в другой Modbus Slave
14577----->14578
Для этого варианта только переменные встроенного Modbus Slave общими для обоих мест.
Второй вариант наверно можно приспособить и для случая, когда для одного места ПЛК слейв, а для другого мастер.
Подскажите, если реализовывать по 2 варианту, адресация идет сквозная? Т.е. если у нас Панель один из мастеров, обращение идет как обычно, по порядку с 0 регистра?
Подскажите, если реализовывать по 2 варианту, адресация идет сквозная? Т.е. если у нас Панель один из мастеров, обращение идет как обычно, по порядку с 0 регистра?
Для Внешнего Слейва - адресация сквозная, по порядку, начиная с 0
Например,
52362
Здесь таблица на экране панели начинается с регистра 4х00
52364
Bigcrash
08.12.2020, 14:03
Спасибо. Только приложенный пример не открывается, ошибка чтения целевой платформы. У Вас ПЛК160 без М2 модификация?
Спасибо. Только приложенный пример не открывается, ошибка чтения целевой платформы. У Вас ПЛК160 без М2 модификация?
Примеры были сделаны в 2014г.
52366
Естественно, ПЛК160 на тот момент был без М2 :)
Собственно в проекте даже кода нет
52367
Только конфигурация с двумя слейвами, по картинке можете сами повторить для М2
ЗЫ.
На всякий случай проект панели
Bigcrash
08.12.2020, 15:28
А еще такой вопрос, сейчас на оборудовании проверить возможности нет, ПЛК уехал по гарантии, а сроки уже прошли...
Панель (Мастер) <> RS-485 <>ПЛК (слейв)<>RS-232-RS485<>Облако через ПМ210(Мастер).
Если их все посадить на 485? По идее нельзя же иметь 2 мастеров в одной сети? Кто-нибудь опыты такие ставил?
А еще такой вопрос, сейчас на оборудовании проверить возможности нет, ПЛК уехал по гарантии, а сроки уже прошли...
Панель (Мастер) <> RS-485 <>ПЛК (слейв)<>RS-232-RS485<>Облако через ПМ210(Мастер).
Если их все посадить на 485? По идее нельзя же иметь 2 мастеров в одной сети? Кто-нибудь опыты такие ставил?
Два мастера никак, да и зачем?
ПЛК вроде у Вас слейв для обоих мест и для панели и для облака
Панель мастер --> ПЛК слейв через RS-232Debug, если панель и ПЛК в одном шкафу.
Остаются RS232 и RS485
Bigcrash
09.12.2020, 07:32
Debug занят опросом электросчетчиков ). Панель и шкаф разнесены метров на 20.
Спасибо за помощь!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot