Использую Modbus Universal MasterOPC Server demo, по протоколу Modbus TCP собираю данные с 6-ти ПЛК 100 по сети предприятия, какое то время все ОК, но через промежуток времени качество связи BAD, при этом ПЛК пингуются.
Вид для печати
Использую Modbus Universal MasterOPC Server demo, по протоколу Modbus TCP собираю данные с 6-ти ПЛК 100 по сети предприятия, какое то время все ОК, но через промежуток времени качество связи BAD, при этом ПЛК пингуются.
Нужно посмотреть по логу что в этот момент происходит с сервером.
Если он посылает запрос, а контроллер не отвечает - значит проблема с контроллером.
Включите запись лога у сервера и посмотрите.
Сервер посылает запрос, а контроллер не отвечает. Перезапускаем сервер и все восстанавливается на некоторое время.
Очевидно какие то проблемы с сетью или контроллером.
Если помогает перезапуск сервера, то попробуйте у устройства включить настройку "Реинициализация узла при ошибке".
Какая у вас версия ОРС сервера?
В настройках сервера включите запись журнала. Задайте максимальный размер журнала - 10000 кб, и включите запись всех событий.
Запустите сервер в работу и когда подобная ситуация возникнет пришлите нам сфомированный лог (с точным временем зависания), а также конфигурацию ОРС сервера.
c:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\
Кстати у вас зависает связь со всеми контроллерами? Вы используете masterSCADA? В этом случае можно сделать переподключение когда будут возникнуть зависания - сервер закроется и запустится снова.
Версия сервера последняя с сайта, использую MasterSCADA, к сожалению я сейчас уже не на объекте и попасть туда пока не возможно, контроллеры отваливаются из другой подсети. Конфигурация это имеется ввиду файл *.mbc? И расскажите пожалуйста поподробнее про перезапуск сервера!
В MasterSCADA у OPC сервера, есть закладка "Опрос", в ней есть поле "Переподключаться по условию". В это поле можно перетащить дискретную переменную из дерева объектов, и когда она перейдет в состояние "Вкл", произойдет отписка от сервера (он закроется), а затем подписка снова (он запустится).
Например вы можете использовать модуль "Событие". При помощи функции OPCQuality( ) анализируйте признак качества какой нибудь переменной ОРС сервера. Формула будет примерно такая:
OPCQuality( Ваша_переменная )=0
В настоящий момент между отпиской от сервера и повторной подпиской проходит слишком мало времени, и сервер не успевает закрыться. Мы сделаем настройку которая бы позволила увеличить этот интервал.
Пока что вы можете решить проблему закрывая процесс Modbus OPC сервера при помощи скрипта, а затем выполняя переподключение. Пример проекта в приложении.
Обратите внимание что у команды "Перезагрузить" на закладке "Опрос" продолжительность импульса - 3 такта (чтобы сервер успел закрыться).
Добавил в проект объект из вашего примера, но почему то переменные в режиме исполнения отображаются серым цветом как будто неактивны и напротив не отображаются данныеВложение 15298
Так это команды. Вы в них пока ничего не записали.
Совершенно верно. Включите у команды значение до опроса - "выкл", тогда все появится.
По нажатию кнопки на мнемосхеме
У меня есть событие OPCQuality( Модуль1_Канал0 )=0 которое при обрыве связи true, как его привязать к команде перезагрузить, чтобы сервер автоматический перезагружался при обрыве связи.
Вместо команды используете событие и все.
В приложении проект.
Большое спасибо!!!
здравствуйте!
столкнулся с похожей проблемой.
На OPC иногда, без видимых причин наглухо зависает скрипт, даже плохое качество не отсылает в функции onError.
Поставил галку на перезапуск узла при сбое - пофигу.
Добавил программу ST в скаде, которая даёт сигнал не переподключение к OPC. Но OPC не успевает перезапуститься.
как быть?
вложение с костылём на Си отсутствует.
Как именно выглядит зависание? Скрипт падает (посмотрите в сообщениях скриптов)?
Какая версия ОРС?
И так, зашёл я на форум с другого компа, оформление форму другое, вложение скачивается.
разобрался, как убивать. теперь перезапуск раборает.
Осталась другая проблема, скрипт глючить по-разному. Если сам заглючил, то перезапуск срабатывает, если usb-server (com->ethernet) помог, то уже никак.
Скрипт:
во вложении ошибки. одна, когда свет моргнёт, другая случайно, может через сутки, может два раза за час.
У вас скрипт падает. Что у вас в 27 строке?
Разбирайтесь - видимо какие то проверки добавить надо.
На первый взгляд:
b1=dest[3]-48;
b2=dest[4]-48;
b3=dest[5]-48;
b4=dest[6]-48;
b5=dest[7]-48;
b6=dest[8]-48;
А если пакет будет не полным и будет только 5 элементов например?
И где у вас проверка контрольной суммы? Или ее нет?
ну тут всё четко.
пробовал запросами, не раззобрался. и с XOR проверкой не разобрался.
Поставил непрерывную передачу.
Примерно за день разобрался, как заставить функцию только читать. (справка такаааая кривааая! да и интруция по протоколам тоже!!! Мануалы симинса на английском понятнее и в разы подробнее.)
в порт летит пакет 12 байт постоянно. начинается на [02], заканчивается на [03].
Функция сама видит начало и конец.
но пролетают и отрывки, поэтому в repeat проверяется длина (12шт) и начало (02).
Как говорил, с XOR не разобрался, поэтому не проверяю. И без него данные летят прекрасно.
так вот, если в нужном байте прилетает "0", то выглядит он 16х30, отнимаем 10х48, получаем 10х0. Максимум - 10х9.
Перед умножением проверяю на минимуи и максимум.
Плохое значение не пролетит.
Так же бывала ошибка функции записи тэга. не сфоткал. так же наглухо виснет скрипт.
Вообще даже если все функции засунуть в pcall, всё равно скрипт зависает.
всегда так зависает, что скада думает - всё норм. пришлось проверку делать.
У вас скрипт не зависает - происходит его падение, и он даже выдает строчку в которой это падение происходит.
Смотрите что вы делаете в этой строчке
неделю смотрю.
добавляю проверки.
ничего криминального не делаю.
максимально просто всё, я ж выложил то, что выстрадал.
Хорошо, что с перезапуском всего сервера разобрался, помогает чаще всего.
Но почему на работает "реинициализация узла при ошбке"? и почему сервер вообще сам не пытается перезапустить скрипт. бред же.
лучше б доусрачки перезапускал. И все были бы счастливы.
Лог вам выдает ошибку - в какой строчке падает. В том что на скриншотах - 27 строка.
Что у вас там?
я то думал, скрины помуогт в орпеделении ошибки. нагуглить не удалось.
когда скрипт падает сам, то ругается на этистрочки::
Если скрипту помогают падать, то на строчку с функцией записи тэга по имени. (это когда отваливается COM порт)
сделайте перед этим кодом:
if table.maxn(dest)~=8 then
end;
Выйдите из скрипта или снова выполните запрос
Спасибо, помогло! (только 12 элементов поставил)
С тех пор была пара перезапусков сервера, и по нескольку сообщений за день от скады об ошибке переменной.
Раньше сообщений не было, видимо скрипт теперь не падает, а отсылает плохое качество.
Результатом я доволен, система работает без вмешательства.