PDA

Просмотр полной версии : Задание контроллеру из двух мест



kanadchikov
29.01.2013, 12:16
Уважаемы, помогите решить задачу. Имеется контроллера ПЛК-154, сенсорная панель, СКАДА. Панель (modbus мастер) подключена к ПЛК по RS485. Контроллер подключен к СКАДе по Modbus TCP и является slave. Как навести мосты, чтобы уствавки можно было менять из двух мест?

kgsh82
29.01.2013, 13:28
Для уставки заведите переменные: значение с панели, значение со скады и значение для ПЛК. Если Значение с панели не равно значению для ПЛК, то значению для ПЛК и для скады присваивается значение с панели. И наоборот. Как то так...

kanadchikov
29.01.2013, 14:34
Много мороки, единственно, что пока работает - дополнительная кнопка "Записать"

energvk
26.09.2014, 16:23
Для уставки заведите переменные: значение с панели, значение со скады и значение для ПЛК. Если Значение с панели не равно значению для ПЛК, то значению для ПЛК и для скады присваивается значение с панели. И наоборот. Как то так...
Реально не получается у меня это реализовать:/
Есть панель мастер (по 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 на последний вариант одинаковы.

Boris_K
26.09.2014, 21:12
Просто же! Как и писал 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;


Тут даже не надо заводить переменные для значений от предыдущего цикла ПЛК.

Yegor
27.09.2014, 10:34
Просто же!Ну хз. Переменные на ввод и на вывод у слейва как правило разные.

Я обычно систему команд делаю. Три-пять записываемых регистров идут на код команды и её параметры, а остальные читаемые — на передачу текущего состояния. Панель или скада однократно записывает в свой или чужой регистр код и параметры, а состояние считывает постоянно. Можно хоть десять панелей подключить, и без разницы мастер или слейв.


(* Панели А и Б, для каждой свой набор читаемых и записываемых регистров *)

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 (слейв по двум портам). Сейчас так делаю на установку с двумя постами.

Boris_K
27.09.2014, 15:58
Ну хз. Переменные на ввод и на вывод у слейва как правило разные. Зачем так? Я сейчас успешно веду проект, там как раз СП270 - мастер, ПЛК100 - слейв (Модбас), и есть много регистров которые пишут и читают как панель, так и ПЛК, и часто это удобно.

energvk
29.09.2014, 09:53
Просто же! Как и писал 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...

Boris_K
29.09.2014, 16:44
Я показал сам принцип, который работает 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), удобнее читать будет, это общепринятый признак хорошего тона в программировании :)

energvk
29.09.2014, 16:49
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
29.09.2014, 16:54
См. мой пост выше, я дополнил.

Валенок
30.09.2014, 10:56
Boris_K
Требуется целое число или символьная константа

см.пост #11. Особенно обратите внимание на подчеркнутое


Boris_K
ip_hh_day, p_hh_day, os_hh_day - сделал разные регистры

energvk
30.09.2014, 13:09
Решил пока с 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. насчёт табов понятно, просто пока тестю, мне так нагляднее, где что меняю

Boris_K
30.09.2014, 23:05
Не очень понял мысль насчёт задержки, но сомневаюсь что там где-то нужна задержка, это противоречит самой сути задачи, 95% что это неправильный путь. Или вам важно именно отследить момент, что в действительности сменило уставку последним - панель или скада, даже если разница в 1 секунду? Если да, то можно например вместе с новой уставкой передавать точное время в миллисекундах, которое было на тот момент, конечно тогда нужно будет его периодически синхронизировать, чтобы не успевала набежать значительная ошибка.

petera
01.10.2014, 03:57
Уважаемы, помогите решить задачу. Имеется контроллера ПЛК-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 общими для обоих мест.
Второй вариант наверно можно приспособить и для случая, когда для одного места ПЛК слейв, а для другого мастер.

energvk
01.10.2014, 16:11
petera
Спасибо, это должно решить проблему и ощутимо уменьшить и упростить код. Буду тестить...

petera
01.10.2014, 17:05
Когда ПЛК является слейвом для обоих мест, то оба варианта работают на ура.:rolleyes:
Но если мастер встроить в слейв, то слейв реально видит(и читает и пишет) во вложенном мастере только модули Register output, а Register input всегда отображаются в слейве с нулевым содержимым:(.

energvk
01.10.2014, 23:36
Когда ПЛК является слейвом для обоих мест, то оба варианта работают на ура.:rolleyes:
Но если мастер встроить в слейв, то слейв реально видит(и читает и пишет) во вложенном мастере только модули Register output, а Register input всегда отображаются в слейве с нулевым содержимым:(.

То есть, я правильно понимаю, что в данном случае если панель (мастер) записывает в Register input значение, что плк его не увидит? Если так, то это не вариант конечно.

Валенок
01.10.2014, 23:39
SysLibCom - и область io-мастера легко совмещается со слейвом. В любом количестве

petera
01.10.2014, 23:49
То есть, я правильно понимаю, что в данном случае если панель (мастер) записывает в Register input значение, что плк его не увидит? Если так, то это не вариант конечно.
В таком варианте нет. Только если сделать в мастере два модуля Register input(Work mode значение By poll time) и Register Output(Work mode значение By value change) с одинаковым адресом регистра. Т.е значение из панели сначала попадет в скаду(Register Output), а скада перешлет его(Register input) обратно в ПЛК. По другому у меня не получилось.:(

energvk
02.10.2014, 12:11
В общем, извращение ещё то, скорее всего я лучше sim'ку на статику переведу, проще должно быть

energvk
10.10.2014, 21:21
да, слэйв и 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 регистра?

petera
08.12.2020, 12:57
Подскажите, если реализовывать по 2 варианту, адресация идет сквозная? Т.е. если у нас Панель один из мастеров, обращение идет как обычно, по порядку с 0 регистра?

Для Внешнего Слейва - адресация сквозная, по порядку, начиная с 0
Например,

52362

Здесь таблица на экране панели начинается с регистра 4х00
52364

Bigcrash
08.12.2020, 14:03
Спасибо. Только приложенный пример не открывается, ошибка чтения целевой платформы. У Вас ПЛК160 без М2 модификация?

petera
08.12.2020, 14:39
Спасибо. Только приложенный пример не открывается, ошибка чтения целевой платформы. У Вас ПЛК160 без М2 модификация?
Примеры были сделаны в 2014г.
52366
Естественно, ПЛК160 на тот момент был без М2 :)

Собственно в проекте даже кода нет
52367

Только конфигурация с двумя слейвами, по картинке можете сами повторить для М2

ЗЫ.
На всякий случай проект панели

Bigcrash
08.12.2020, 15:28
А еще такой вопрос, сейчас на оборудовании проверить возможности нет, ПЛК уехал по гарантии, а сроки уже прошли...
Панель (Мастер) <> RS-485 <>ПЛК (слейв)<>RS-232-RS485<>Облако через ПМ210(Мастер).
Если их все посадить на 485? По идее нельзя же иметь 2 мастеров в одной сети? Кто-нибудь опыты такие ставил?

petera
08.12.2020, 15:52
А еще такой вопрос, сейчас на оборудовании проверить возможности нет, ПЛК уехал по гарантии, а сроки уже прошли...
Панель (Мастер) <> RS-485 <>ПЛК (слейв)<>RS-232-RS485<>Облако через ПМ210(Мастер).
Если их все посадить на 485? По идее нельзя же иметь 2 мастеров в одной сети? Кто-нибудь опыты такие ставил?
Два мастера никак, да и зачем?
ПЛК вроде у Вас слейв для обоих мест и для панели и для облака
Панель мастер --> ПЛК слейв через RS-232Debug, если панель и ПЛК в одном шкафу.
Остаются RS232 и RS485

Bigcrash
09.12.2020, 07:32
Debug занят опросом электросчетчиков ). Панель и шкаф разнесены метров на 20.
Спасибо за помощь!