PDA

Просмотр полной версии : выбор POU



Владиславыч
16.04.2014, 12:10
Буду очен благодарен если кто-нибудь опишет в каких ситуациях какой POU лучше использовать а в частности вот такая ситуация:
к мастеру сети подключено несколько слейв устройств, есть код переподключения устройства при потери связи:




PROGRAM PLC_PRG2
VAR
BL: BLINK;
te1: BOOL;
te2: BOOL;
Con: BOOL;
Con2: BOOL;
sl1: Connect;
sl2: Connect;
MV110_16D_con: BOOL;
SIGE2_con: BOOL;
i: INT:=0;
J: INT:=0;
END_VAR



IF MV110_16D.xError THEN
Con:=FALSE;
j:=j+1;
BL(ENABLE:= TRUE, TIMELOW:= T#5S, TIMEHIGH:= T#100MS, OUT=> );
MV110_16D.xReset:=BL.OUT;
ELSE
BL(ENABLE:= FALSE, TIMELOW:= T#5S, TIMEHIGH:= T#100MS, OUT=> );
MV110_16D.xReset:=FALSE;
Con:=TRUE;
END_IF

так как слейв устройств много попробовал выделить этот кусок, в результате
в функции он перестает работать (но тут кое какие соображения появились почему такое выходит),
в функциональном блоке перестает работать (а вот тут полная непонятка)
работает если так в основной программе и пишу про каждое устройство

PS FB получился такой:


FUNCTION_BLOCK Connect
VAR_INPUT
ModbusSlave: IoDrvModbus.ModbusSlaveComPort;
END_VAR
VAR_OUTPUT
Connect:BOOL;
END_VAR
VAR
BL: BLINK;
END_VAR

//================================================== =================
IF ModbusSlave.xError THEN
Connect:=FALSE;
BL(ENABLE:= TRUE, TIMELOW:= T#5S, TIMEHIGH:= T#100MS, OUT=> );
ModbusSlave.xReset:=BL.OUT;
ELSE
BL(ENABLE:= FALSE, TIMELOW:= T#5S, TIMEHIGH:= T#100MS, OUT=> );
ModbusSlave.xReset:=FALSE;
Connect:=TRUE;
END_IF
//================================================== =================

Мурат Ахриев
16.04.2014, 16:21
"так как слейв устройств много попробовал выделить этот кусок"
Не совсем понятно что вы проделали.

Можно проще, для каждого слейв устройства нужно использовать такой код(меняете только название Modbus_Slave_COM_Port
на свои).


IF Modbus_Slave_COM_Port.xError THEN //Перезапуск подключения по Modbus
Blink_01(ENABLE:= TRUE, TIMELOW:= T#1S, TIMEHIGH:= T#10MS);
Modbus_Slave_COM_Port.xReset:= Blink_01.OUT;
END_IF

Владиславыч
17.04.2014, 10:11
я не хочу повторять этот код, а хочу проделывать эту операцию путем вызова функции проверки связи, и соответственно вызывать функцию передавая только переменную Modbus_Slave_COM_Port1, Modbus_Slave_COM_Port2 и т.д.

radar
22.04.2014, 14:53
"так как слейв устройств много попробовал выделить этот кусок"
Не совсем понятно что вы проделали.

Можно проще, для каждого слейв устройства нужно использовать такой код(меняете только название Modbus_Slave_COM_Port
на свои).


IF Modbus_Slave_COM_Port.xError THEN //Перезапуск подключения по Modbus
Blink_01(ENABLE:= TRUE, TIMELOW:= T#1S, TIMEHIGH:= T#10MS);
Modbus_Slave_COM_Port.xReset:= Blink_01.OUT;
END_IF


Добрый день! Пробовали сделать ресет по этому коду. Почему-то обратно цепляется только один слейв(у нас их три, и прописываем ресет для каждого из них). Как быть в этой ситуации?

Мурат Ахриев
22.04.2014, 15:41
Вы знаете причину потери связи? Пожалуйста более подробно опишите вашу систему.

radar
22.04.2014, 22:21
Связь мы обрываем сами(физически), для проверки. Но вот система проверку пройти не может ), так как связь восстанавливается только с одним модулем. Длина линии у нам малая, около 2-х метров.

Мурат Ахриев
23.04.2014, 09:22
Имеется ли возможность прислать ваш проект в личные сообщения?

radar
23.04.2014, 14:25
Да, но в форме личного сообщения не вижу возможности добавления вложения, есть видео, картинки, ссылки. Здесь есть, а в личном сообщении нет.



IF MVU8.xError THEN //Перезапуск подключения по Modbus
Blink_mvu(ENABLE:= TRUE, TIMELOW:= T#1000MS, TIMEHIGH:= T#20MS);
MVU8.xReset:=Blink_mvu.OUT;
END_IF
IF MV110.xError THEN //Перезапуск подключения по Modbus
Blink_mv(ENABLE:= TRUE, TIMELOW:= T#1000MS, TIMEHIGH:= T#20MS);
MV110.xReset:=Blink_mv.OUT;
END_IF


TIMELOW и TIMEHIGH меняли в различных сочетаниях.

Мурат Ахриев
23.04.2014, 15:04
Вы можете выслать мне на почту m.akhriev@owen.ru

RadistDog
23.04.2014, 15:29
"... Можно проще, для каждого слейв устройства нужно использовать такой код(меняете только название Modbus_Slave_COM_Port на свои).


IF Modbus_Slave_COM_Port.xError THEN //Перезапуск подключения по Modbus
Blink_01(ENABLE:= TRUE, TIMELOW:= T#1S, TIMEHIGH:= T#10MS);
Modbus_Slave_COM_Port.xReset:= Blink_01.OUT;
END_IF


Доброго дня, извините, вклинюсь в разговор, так как вопрос на близкую тему.
У меня слейвов четыре. Кстати, все они нормально рестартовались после обрыва линии связи по указанному выше алгоритму. Это я видел и в КДС и по миганию соответствующих индикаторов на слейвах.
После того, как я изменил алгоритм обмена с модулями, надобность в таком рестарте почему-то отпала. Почему - не знаю, но мне это сейчас не важно, потом разберусь.

А вопрос мой в другом: - я хотел бы фиксировать в отдельные переменные ошибки связи, но при этом код типа Var1 := Modbus_Slave_COM_Port.xError; и Var2 := Modbus_Slave_COM_Port.byModbusError; не приводит к желаемой фиксации этих ошибок в Var1 и Var2. Почему?

Владиславыч
23.04.2014, 16:45
Доброго дня, извините, вклинюсь в разговор, так как вопрос на близкую тему.
У меня слейвов четыре. Кстати, все они нормально рестартовались после обрыва линии связи по указанному выше алгоритму. Это я видел и в КДС и по миганию соответствующих индикаторов на слейвах.
После того, как я изменил алгоритм обмена с модулями, надобность в таком рестарте почему-то отпала. Почему - не знаю, но мне это сейчас не важно, потом разберусь.

А вопрос мой в другом: - я хотел бы фиксировать в отдельные переменные ошибки связи, но при этом код типа Var1 := Modbus_Slave_COM_Port.xError; и Var2 := Modbus_Slave_COM_Port.byModbusError; не приводит к желаемой фиксации этих ошибок в Var1 и Var2. Почему?

наверно потому что при восстановлении связи ошибка пропадает попробуйте что-то типа счетчика переподключений поставить



IF Modbus_Slave_COM_Port.xError THEN
Blink_01(ENABLE:= TRUE, TIMELOW:= T#1S, TIMEHIGH:= T#10MS);
Modbus_Slave_COM_Port.xReset:= Blink_01.OUT;
IF Blink_01.OUT THEN
count:= count+1;
END_IF
END_IF

ну или присвоение перенести в другое место:


IF Modbus_Slave_COM_Port.xError THEN
Var1 := Modbus_Slave_COM_Port.xError
Blink_01(ENABLE:= TRUE, TIMELOW:= T#1S, TIMEHIGH:= T#10MS);
Modbus_Slave_COM_Port.xReset:= Blink_01.OUT;
END_IF
так по идее признак ошибки в переменной Var1 будет пока принудительно где-нибудь не обнулим

Владиславыч
23.04.2014, 16:56
Да, но в форме личного сообщения не вижу возможности добавления вложения, есть видео, картинки, ссылки. Здесь есть, а в личном сообщении нет.



IF MVU8.xError THEN //Перезапуск подключения по Modbus
Blink_mvu(ENABLE:= TRUE, TIMELOW:= T#1000MS, TIMEHIGH:= T#20MS);
MVU8.xReset:=Blink_mvu.OUT;
END_IF
IF MV110.xError THEN //Перезапуск подключения по Modbus
Blink_mv(ENABLE:= TRUE, TIMELOW:= T#1000MS, TIMEHIGH:= T#20MS);
MV110.xReset:=Blink_mv.OUT;
END_IF


TIMELOW и TIMEHIGH меняли в различных сочетаниях.

попробуйте использовать тот же BLINK



IF MVU8.xError THEN //Перезапуск подключения по Modbus
Blink_mv(ENABLE:= TRUE, TIMELOW:= T#1000MS, TIMEHIGH:= T#20MS);
MVU8.xReset:=Blink_mv.OUT;
END_IF
IF MV110.xError THEN //Перезапуск подключения по Modbus
Blink_mv(ENABLE:= TRUE, TIMELOW:= T#1000MS, TIMEHIGH:= T#20MS);
MV110.xReset:=Blink_mv.OUT;
END_IF


у меня так работает все нормально

radar
23.04.2014, 23:55
Изначально пробовал с тем же блинком, безрезультатно.
Может скажите, какой у вас ПЛК, модули и параметры связи? И версии КДС и таргетов?
Заранее спасибо )

RadistDog
24.04.2014, 07:47
... Может скажите, какой у вас ПЛК, модули и параметры связи? И версии КДС и таргетов?
Заранее спасибо )

Возможно вопрос не ко мне, но отвечу:
- КДС V3.5 SP4 + (скачивал с Рутрекера, но таргет нормально заработал только с диска от СПК207!);
- контроллер СПК207, прошивка 3302, таргет SPK2xx_03_CS_WEB версия 3.5.0.40;
- в проекте подключены Modbus COM версии 3.4.0.0, Modbus Master версии 3.5.2.0, Modbus Slave (4 устройства) версии 3.5.2.0;
- физически слейвы - МВА8 (2 шт.), МВУ8 (1 шт.) и МУ110-16Р (1 шт.). Соединение 9600-8-N-1, всё это подключено пока на столе коротким проводниками, но сначала глючило (то и дело слейвы отваливались от мастера), потом перестало )))))

RadistDog
24.04.2014, 07:57
наверно потому что при восстановлении связи ошибка пропадает попробуйте что-то типа счетчика переподключений поставить


IF Modbus_Slave_COM_Port.xError THEN
Blink_01(ENABLE:= TRUE, TIMELOW:= T#1S, TIMEHIGH:= T#10MS);
Modbus_Slave_COM_Port.xReset:= Blink_01.OUT;
IF Blink_01.OUT THEN
count:= count+1;
END_IF
END_IF

ну или присвоение перенести в другое место:


IF Modbus_Slave_COM_Port.xError THEN
Var1 := Modbus_Slave_COM_Port.xError
Blink_01(ENABLE:= TRUE, TIMELOW:= T#1S, TIMEHIGH:= T#10MS);
Modbus_Slave_COM_Port.xReset:= Blink_01.OUT;
END_IF
так по идее признак ошибки в переменной Var1 будет пока принудительно где-нибудь не обнулим

Ваши предложения понятны. Я в точности так и делал! И счётчик взводил (который потом посекундно декрементируется если >0), и присвоение производил перед обработкой .xError, и флаг взводил в теле IF Modbus_Slave_COM_Port.xError THEN ... Flag := TRUE; ... END_IF, который нигде потом не сбрасывается. Чушь какая то, но не могу я почему то ошибки связи засечь! Ни .xError, ни .byModbusError! Хотя линию то я ручками физически разрываю! ))
Есть ещё идеи? Где я ошибаюсь?

ЗЫ: А почему используем именно .xReset, а не .xAcknowledge ??

Владиславыч
24.04.2014, 08:52
xReset сбрасывет флаг xError после востановления, а xAcnowledge как я понимаю нет, и надо это делать вручную, иначе будет постоянно выполнятся алгоритм восстановления связи... IF Modbus_Slave_COM_Port.xError THEN может вам стоит попробовать с xReset??

Владиславыч
24.04.2014, 09:00
Изначально пробовал с тем же блинком, безрезультатно.
Может скажите, какой у вас ПЛК, модули и параметры связи? И версии КДС и таргетов?
Заранее спасибо )

- КДС V3.5 SP3 Patch5
- контроллер СПК207, прошивка 3302, таргет SPK2xx_03_CS версия 3.5.3.40;
- в проекте подключены Modbus COM версии 3.4.0.0, Modbus Master версии 3.5.3.50, Modbus Slave (3 устройства) версии 3.5.3.0;
- физически слейвы - МВ110-16Д (1 шт.), и МУ110-8Р (1 шт.), еще один контроллер(пока это CODESYS Win V3 ). Соединение 115200-8-N-1, (основные глюки у меня начинались когда подключил виртуальный контроллер)

RadistDog
24.04.2014, 09:16
xReset сбрасывет флаг xError после востановления, а xAcnowledge как я понимаю нет, и надо это делать вручную, иначе будет постоянно выполнятся алгоритм восстановления связи... IF Modbus_Slave_COM_Port.xError THEN может вам стоит попробовать с xReset??

Может где нибудь тут ошибка, но для иллюстарции приложу два скриншота. Судя по всплывающим подсказкам как раз xReset не сбрасывает ошибки, а только перезапускает порт!
1274012741

Владиславыч
24.04.2014, 09:22
а у меня пишут вот так...
12742

RadistDog
24.04.2014, 10:04
а у меня пишут вот так...

Вот как странно! В Вашем случае iodrvmodbus какой версии? У меня в версии 3.5.2.0 по другому написано:
12743

Владиславыч
24.04.2014, 10:09
а можете еще раз подробнее описать проблему, у меня фиксация происходит нормально и в том и в другом случае, не могу понять где у вас возникла сложность
P.S. версия IoDrvModbus 3.5.3.50

12744

Владиславыч
24.04.2014, 11:08
P.P.S может поможет...

RadistDog
24.04.2014, 11:33
а можете еще раз подробнее описать проблему, у меня фиксация происходит нормально и в том и в другом случае, не могу понять где у вас возникла сложность
P.S. версия IoDrvModbus 3.5.3.50

Исследования ситуации привели к следующему.
1. Я заменил версии ModBus компонентов в своем проекте как в Вашем случае. Компиляция показала 501+ ошибок.
2. Заменил таргет СПК на такой же как и у Вас. Всё заработало. [причем нужно отметить, что мы совсем игнорируем тут правило о том, что версия таргета должна быть строго не старше версий библиотек!] Ошибки фиксируются в нужные переменные в заданных для этого местах. Действие xReset и xAcknowledge стало задекларировано в библиотеке, естественно, такое же как в Вашем случае.
3. xReset сбрасывает xError и byModbusError в соответствии с сигналом от Blink (то есть срезу же, хотя физическое соединение ещё не восстановилось).
4. xAcknowledge не сбрасывает xError по сигналу от Blink (пока линия связи нарушена), но, тем не менее, после восстановления линии связи xError и byModbusError сбрасываются! Уж не знаю кто это делает, может и не xAcknowledge... Но всё работает!
Причём с xAcknowledge работать вроде получается удобнее. Пока связи нет - флаг и код ошибки висят в переменных, по которым я могу обрабатывать ситуацию (например не учитывать в расчётах пропущенные значения с датчиков, или через какое то время совсем остановить систему), как связь появилась, так и мои буферные переменные обнулились.
А если использовать xReset, то получается что связи нет, но система с периодичностью от Blink начинает ошибочно думать что связь есть, пока опять не приедет xError от следующей попытки установить очередной цикл связи со слейвом.

ЗЫ: Владиславыч спасибо, у меня сейчас всё заработало.

Владиславыч
24.04.2014, 11:43
Осталось понять почему у меня все перестает работать когда я пытаюсь вынести переподключение в функцию...


[причем нужно отметить, что мы совсем игнорируем тут правило о том, что версия таргета должна быть строго не старше версий библиотек!]

P.S. попробовал xAcknowlege у меня с ним восстановление нормально не проходит, ошибку фиксирует, все отрабатывает, но восстановление связи не происходит, а с xReset все вроде нормально....

tkont
20.06.2015, 15:32
как посчитать с IoDrvModbus количество правильно переданных посылок , и неудачных
пока просто приходится взводить таймер на 500мсек (таймаут в мастере 1 сек) и в зависимости от состояния xAllSlavesOk и xError прибавлять единичку либо к счетчику ошибок либо к счетчику ОК
IF Modbus_Master_COM_Port_2.xAllSlavesOk=FALSE THEN
BLINK_MB2(enable:=TRUE,timelow:=T#2S, timehigh:=T#100MS,out=>);
MB_ERR:= 2 ; // пропал слейв в COM2
IF BLINK_MB_RTRG.Q THEN
MB_CNT_M2_ER:= MB_CNT_M2_ER + 1 ;
END_IF
ELSE
BLINK_MB2(enable:=FALSE,timelow:=T#2S, timehigh:=T#100MS,out=>);
Modbus_Master_COM_Port_2.xResetComPort:=BLINK_MB2. OUT ; //если мастер завис
IF BLINK_MB_RTRG.Q THEN
MB_CNT_M2_OK:= MB_CNT_M2_OK + 1 ;
END_IF
END_IF
как сделать что бы после каждой посылки в зависимости от того что вернул модуль MODBUS - DONE или Error (DONE вообще модуль не выдает) , прибавить к соответствующему счетчику единичку