PDA

Просмотр полной версии : Соединение TCP после обновления программы или БАГ в ПЛК110



dudanov
19.01.2015, 08:24
День добрый.

Вопрос в следующем: написана программа, опрашивающая другой ПЛК по протоколу Modbus TCP с помощью сокетов и библиотеки SysLibSockets. При включении ПЛК успешно опрашивает раз в 30 секунд, открывая сокет, устанавливая TCP соединение, посылая запрос, получая ответ и закрывая сокет. Но стоит обновить программу через CoDeSys, используя без разницы или Debug RS-232 или Ethernet, то после естественного сброса ПЛК после прошивки и инициализации переменных опрос перестает работать, холодный сброс в CoDeSys не помогает. Требуется физически отключить питание ПЛК и дождавшись пока пройдет время работы от батареи, заново подать питание. При всем при этом рабочим остается блок синхронизации времени с NTP сервером, использующего UDP протокол!

Остается только догадываться, что это баг в ПЛК110. В моем случае это просто недопустимо. Что скажут разработчики и пользователи ПЛК фирмы ОВЕН?

При необходимости могу выложить фрагмент кода функционального блока.

lara197a
19.01.2015, 08:47
Старт программы нажимаете в ручную?
Если нет то ПЛК стартанет(перейдет в RUN) только после перезапуска питания.

dudanov
19.01.2015, 09:10
Старт программы нажимаете в ручную?
Если нет то ПЛК стартанет(перейдет в RUN) только после перезапуска питания.

Запуск ПЛК происходит через CoDeSys, через него же и попытки сброса обычного и "холодного". Не помогает ничего. Но, как я говорил, синхронизация времени по UDP в этой же программе на этом же ПЛК отлично работает!

lara197a
19.01.2015, 09:36
Проверьте сколько сокетов у вас открыто.
попробуйте их сначала закрыть.

capzap
19.01.2015, 10:04
естественно при прошивке программы, Вы не закрываете корректно сокет и получаете проблемы

dudanov
19.01.2015, 12:20
Проверьте сколько сокетов у вас открыто.
попробуйте их сначала закрыть.

Сокетов не может быть открыто много. После открытия и обмена данными я их сразу же закрываю.

dudanov
19.01.2015, 12:24
естественно при прошивке программы, Вы не закрываете корректно сокет и получаете проблемы

Тогда вопрос: почему программа стартует заново, переменные заново инициализируются, а открытые сокеты не закрываются?! Это же баг и никак иначе! И поворюсь во второй раз, что обмен по UDP работает и с сокетами проблем не возникает, в отличие от сокетов TCP. Что это тогда если не баг? Встроенная прошивка ПЛК должна об этом заботится.

lara197a
19.01.2015, 12:25
естественно при прошивке программы, Вы не закрываете корректно сокет и получаете проблемы
правильно вам подсказывают.
как вы их закрываете?
просто рвете соединение после прошивки?

capzap
19.01.2015, 12:37
программа стартует, переменные инициализируются, а ОС как работала так и работает и даже при выключении питания возможно сохраняет дескриптор порта

dudanov
19.01.2015, 12:41
правильно вам подсказывают.
как вы их закрываете?
просто рвете соединение после прошивки?

Закрытием сокетов, корректным освобождением других ресурсов перед предстоящей прошивкой должна заниматься встроенная прошивка ПЛК или я не прав?? Это стандартная штатная задача, предусмотренная IDE CoDeSys.

dudanov
19.01.2015, 12:55
программа стартует, переменные инициализируются, а ОС как работала так и работает и даже при выключении питания возможно сохраняет дескриптор порта

Как я уже говорил, при инициализации управляющей программы, ОС, как Вы называете CoDeSys Runtime, должна следить за всеми дескрипторами и ресурсами, открываемыми ОС для управляющей пользовательской программы и при попытке перепрошивки ее на новую должна заботится о корректном закрытии и освобождении всех этих ресурсов! Не может же ОС "забивать" на все это?! На то она и ОС, которая работает на низком уровне! Представляете если бы десктопная ОС на наших компах "забывала" закрыть открытые ей же для пользовательского убитого процесса ресурсы, высвободить память и т.п.

И опять таки, почему UDP то работает?! UDP же тоже сокеты использует!

lara197a
19.01.2015, 12:58
вам что закрыть тяжело?

dudanov
19.01.2015, 13:06
вам что закрыть тяжело?

Хорошо, подскажите как выполнить какое то действие именно перед процессом обновления программы? Может есть какой-то EVENT, который необходимо обработать, запустив POU или как это сделать? Вариант с принудительным "ручным" приводом прошу не предлагать. Так как я при таком раскладе уже считаю ОВЕН ПЛК "дефектным" оборудованием. Это не дело, чтобы пользователь за ОС работал, причем решая штатные задачи, которые она сама не только в состоянии, но и обязана выполнять!

capzap
19.01.2015, 13:08
ОС это операционная система, а рантайм это то что крутится в ней, какая между гими связь. непонятны Ваши претензии, раз Вы перешли на бибки, то почему сокет должен открываться Вами, а закрыватся кем то другим,не нравится переходите на конфигуратор и тогда уж предъявляйте претензии к разработчикам

что касается udp, там открытие порта никого ни к чему не обязывает, связь клиента с сервером не поддерживается,а следовательно и-закрытие не принципиально

capzap
19.01.2015, 13:15
Хорошо, подскажите как выполнить какое то действие именно перед процессом обновления программы? Может есть какой-то EVENT, который необходимо обработать, запустив POU или как это сделать? Вариант с принудительным "ручным" приводом прошу не предлагать. Так как я при таком раскладе уже считаю ОВЕН ПЛК "дефектным" оборудованием. Это не дело, чтобы пользователь за ОС работал, причем решая штатные задачи, которые она сама не только в состоянии, но и обязана выполнять!

в бибке оскат всё расписано как закрывать сокеты по системному событию, а по поводу дефектности кого то, КДС это немецкий продукт, им и предъявляйте свои претензии

lara197a
19.01.2015, 13:17
а почему не использовать сокет клос после завершения загрузки.

dudanov
19.01.2015, 13:29
непонятны Ваши претензии, раз Вы перешли на бибки, то почему сокет должен открываться Вами, а закрыватся кем то другим,не нравится переходите на конфигуратор и тогда уж предъявляйте претензии к разработчикам

закрыть открытые ресурсы моя задача, когда выполняется программа, здесь я не спорю, я это и делаю, а при перепрошивке? это же задача рантайма...


что касается udp, там открытие порта никого ни к чему не обязывает, связь клиента с сервером не поддерживается,а следовательно и-закрытие не принципиально
согласен, но сокет то открывается, а "никем не закрывается"....

Кстати, вспомнил! У меня таймер между удачными запросами стоит одна минута, и сокет, после опроса тут же закрывается! То есть даже если опрос длиться с 10-кратным запасом секунду, то минимум 59 секунд он закрыт, а UDP сокет вообще открывается и закрывается раз в сутки. Поэтому во время инициации перепрошивки сокетов открытых НЕТ! Что то я сразу не сообразил!

Сейчас попробую вообще увеличить время до часа и отпишусь.

dudanov
19.01.2015, 13:41
в бибке оскат всё расписано как закрывать сокеты по системному событию, а по поводу дефектности кого то, КДС это немецкий продукт, им и предъявляйте свои претензии

Я не знал, что Вы сотрудник ОВЕН и принимаете все на свой счет. Я не предъявляю претензии, я пытаюсь конструктивно разобраться с этим вопросом. А это вопрос общий для всех: Пользователь - ОВЕН - CoDeSys. И разбираться должны сообща. Вот если бы Вы мне кинули полезную ссылку на ОФИЦИАЛЬНЫЙ документ, говорящий о том, что перед перепрошивкой программы пользователь обязан .... так как ..... , то это был бы другой разговор.

dudanov
19.01.2015, 13:43
а почему не использовать сокет клос после завершения загрузки.
тогда уж по событию before_reset. только вот при прошивке происходит ли оно?.. надо только пробовать... но что то мне подсказывает, что это именно ошибка во внутреннем ПО, так как все сокеты на момент прошивки закрыты... что я буду закрывать сокет клосом? несуществующий дескриптор??

capzap
19.01.2015, 15:30
какое то высасывание проблемы ихз пальца, перепрошивка программы если это онлайн изменения вообще не приведит к перегрузке плк, о чем вообще речь тогда идет?

Дмитрий Артюховский
19.01.2015, 17:45
Да че спорить то? сделайте так чтобы при старте программы один раз выполнялось то что ниже и все... относитесь к этому как к наступлению зимы )))


SysSockClose( 1 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 2 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 3 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 4 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 5 ); (* ЗАКРЫТЬ СОКЕТ *)

dudanov
19.01.2015, 18:05
какое то высасывание проблемы ихз пальца, перепрошивка программы если это онлайн изменения вообще не приведит к перегрузке плк, о чем вообще речь тогда идет?

так даже "горячее" обновление без перезагрузки приводит к неработоспособности кода вот в чем дело ))) уже смешно ))) все советуют как новичку, который только вчера познакомился с ПЛК ))) не хочу никого обидеть, мужики, спасибо конечно за советы...

dudanov
19.01.2015, 18:21
Да че спорить то? сделайте так чтобы при старте программы один раз выполнялось то что ниже и все... относитесь к этому как к наступлению зимы )))


SysSockClose( 1 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 2 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 3 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 4 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 5 ); (* ЗАКРЫТЬ СОКЕТ *)

Спасибо, Дмитрий, попробую так ) Но, во-первых, я думаю что не поможет, так как на момент обновления кода нет открытых сокетов, ну а во-вторых, это решение проблемы через одно место, с этим нужно детально разбираться и я думаю не нам, а разработчикам. А при подтверждении данной проблемы ее решать, а не выдумавать решения, вызывая в цикле SysSockClose со всеми возможными дескрипторами... Попробую, отпишусь...

capzap
19.01.2015, 18:42
так даже "горячее" обновление без перезагрузки приводит к неработоспособности кода вот в чем дело ))) уже смешно ))) все советуют как новичку, который только вчера познакомился с ПЛК ))) не хочу никого обидеть, мужики, спасибо конечно за советы...

какие советы, вы же водите всех за нос, начинаете развиать темы, что событие нужно использовать перед перезагрузкой, которой как оказывается и нет. Я вот тоже могу сказать, что когда делал веб-сервер открывал сокет, отправлял ответ на запрос клиенту, закрывал соединение и открывал для следущего запроса и в работе у меня при заливке обновлений ни чего не зависало, Вы мне поверите или я для Вас не авторитет в этом вопросе, раз так почему я должен относится к Вам как опытному спецу

dudanov
19.01.2015, 19:36
какие советы, вы же водите всех за нос, начинаете развиать темы, что событие нужно использовать перед перезагрузкой, которой как оказывается и нет. Я вот тоже могу сказать, что когда делал веб-сервер открывал сокет, отправлял ответ на запрос клиенту, закрывал соединение и открывал для следущего запроса и в работе у меня при заливке обновлений ни чего не зависало, Вы мне поверите или я для Вас не авторитет в этом вопросе, раз так почему я должен относится к Вам как опытному спецу

Хорошо, попытаюсь объяснить все по порядку чтобы было понятнее. ПЛК стоит на объекте и реально работает в тестовом режиме, внутренняя программа постоянно дорабатывается и отлаживается, чтобы добавлять новый функционал, исправлять ошибки, от этого никуда не деться. При обновлении программы без изменения переменных или конфигурации ПЛК, то есть при возможности "горячего" обновления перезагрузки не происходит. А возникает эта проблема как при "горячем" так и при полном обновлении, что тоже естественно опробовано. Опробован также "ручной" сброс ПЛК из КДС, все это не помогает.

В Вашем опыте работы с сокетами и созданию простого веб-сервера я не сомневаюсь. Но в создании веб-сервера все же несколько иной принцип работы с теми же сокетами, чем в описываемой мной проблеме. В Вашем случае открывается "прослушивающий" сокет и в ответ на входящий запрос акцептируете соединение, открыв другой, принимаете запрос, отвечаете, ответив на запрос его закрываете, а первоначальный естественно продолжает принимать входящие соединения. А у меня клиентское приложение, которое открывает сокет, устанавливает соединение, отправляет запрос, получает ответ и закрывает сокет до следующего цикла опроса по истечении определенного времени.

Так что случаи немного разные. Извините если как то задел Ваше самолюбие.

capzap
19.01.2015, 19:52
спасибо, что заботитесь о моем психологическом самочуствии
Только мне всёравно не понятны претензии к разработчикам, у Вас же проблемы при манипуляциях во время отладки, а не во время работы получаются, может перед прошивкой Вы его не целуете в правый торец,отсюда всё и вытекает.
Чтоб развеять свои сомнения можно взять любой другой проект и поробовать происходит такая же ситуация или нет
И так то я не только сервер тестировал, но и клиента тоже, вот например http://www.owen.ru/forum/showthread.php?t=12729&p=83823&viewfull=1#post83823

dudanov
19.01.2015, 20:14
Да че спорить то? сделайте так чтобы при старте программы один раз выполнялось то что ниже и все... относитесь к этому как к наступлению зимы )))


SysSockClose( 1 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 2 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 3 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 4 ); (* ЗАКРЫТЬ СОКЕТ *)
SysSockClose( 5 ); (* ЗАКРЫТЬ СОКЕТ *)

Не помогает классическое в теле программы:


IF NOT _INIT THEN

SysSockClose ( 1 ) ;
SysSockClose ( 2 ) ;
SysSockClose ( 3 ) ;
SysSockClose ( 4 ) ;
SysSockClose ( 5 ) ;
SysSockClose ( 6 ) ;
SysSockClose ( 7 ) ;
SysSockClose ( 8 ) ;
SysSockClose ( 9 ) ;
SysSockClose ( 10 ) ;
SysSockClose ( 11 ) ;
SysSockClose ( 12 ) ;
SysSockClose ( 13 ) ;

_INIT := TRUE ;

END_IF


Может надо было продолжить и добавить еще с десяток? ))

lara197a
19.01.2015, 20:48
Проще в цикле через FOR.
А количество n- можно и побольше.

Если серьезно, то посмотрите какие сокеты после перезагрузке открыты.

Scream
19.01.2015, 21:09
dudanov, одно время тоже мучился с этим.
Попробуйте перед заливкой новой программы сделать заводской сброс (не холодный) и отпишитесь пожалуйста.

dudanov
20.01.2015, 15:10
dudanov, одно время тоже мучился с этим.
Попробуйте перед заливкой новой программы сделать заводской сброс (не холодный) и отпишитесь пожалуйста.

не помогло...

Scream
20.01.2015, 15:35
Тогда или код или овен...) Пробовал на 100\160\150, закрываются верняк и дискрипторы на открытые файлы потерянные тоже закрывались.
----------------

Связь с NTP сами реализовывали?

dudanov
20.01.2015, 15:47
Тогда или код или овен...) Пробовал на 100\160\150, закрываются верняк и дискрипторы на открытые файлы потерянные тоже закрывались.
----------------

Связь с NTP сами реализовывали?

Так я и говорю, что все должно закрываться, контроллер же сбрасывается. А за код я уверен.

Связь с NTP брал по примеру библиотеки OSCAT, но дописал к ней модуль программной коррекции времени, то есть ПЛК сам себя поправляет каждую секунду на несколько милисекунд, рассчитанных между запросами точного времени NTP. Это позволяет повысить точность часов реального времени до не хуже +/- 1,8 секунды в час. В среднем по опыту ПЛК ОВЕН около 3 мс спешат, то есть на 0.3%. А вот Beckhoff, например, точен как кремлевские часы ))))

Дмитрий Артюховский
20.01.2015, 23:20
доступных сокетов всего 5 поэтому перебирать дальше нет смысла )) должно сработать, проблема еще где-то наслоенная..
1. проверить что _INIT принимает FALSE
2. проверить что закрытие и открытие вновь, происходит в разных циклах плк

очень удобно использовать структуру SFC для выполнения вдумчивой инициализации рабочего цикла

а перезагрузки удаленные лучше всего ватчдогом устраивать (сделав проект загрузочным перед этим!) при этом состояние как после включения питания и проект с флэшки перечитывается

dudanov
21.01.2015, 10:03
Проблема РЕШИЛАСЬ обновлением внутренней прошивки ПЛК с версии 2.14 до присланной мне инженером технической поддержки версии 2.15.3.

Как я и полагал, проблема в особенности (ошибке) работы прошивки ПЛК.

Старый вывод PLCInfo (MAC заменен):


PLCInfo
PLC model MODEL PLC 110-32
Binary VERSION 2.14.0
Need Target version 2.10
Compiled: 14:37:41 Apr 28 2011
MAC xx:xx:xx:xx:xx:xx
IP 192.168.0.250
GATE 192.168.0.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited

Новый:


PLCInfo
PLC model MODEL PLC 110-32 Версия ПО метр: 2.0
Binary VERSION 2.15.3
Need Target version 2.10
Compiled: 12:49:27 Sep 20 2013
MAC xx:xx:xx:xx:xx:xx
IP 192.168.0.250
GATE 192.168.0.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited

Всем спасибо!