PDA

Просмотр полной версии : Modbus Universal MasterOPC Server demo теряет связь



maks-tver
18.01.2013, 22:22
Использую Modbus Universal MasterOPC Server demo, по протоколу Modbus TCP собираю данные с 6-ти ПЛК 100 по сети предприятия, какое то время все ОК, но через промежуток времени качество связи BAD, при этом ПЛК пингуются.

SCADAMaster
19.01.2013, 09:38
Нужно посмотреть по логу что в этот момент происходит с сервером.
Если он посылает запрос, а контроллер не отвечает - значит проблема с контроллером.
Включите запись лога у сервера и посмотрите.

maks-tver
09.04.2013, 23:24
Сервер посылает запрос, а контроллер не отвечает. Перезапускаем сервер и все восстанавливается на некоторое время.

SCADAMaster
10.04.2013, 08:07
Очевидно какие то проблемы с сетью или контроллером.
Если помогает перезапуск сервера, то попробуйте у устройства включить настройку "Реинициализация узла при ошибке".

maks-tver
10.04.2013, 09:45
Если помогает перезапуск сервера, то попробуйте у устройства включить настройку "Реинициализация узла при ошибке".
Включено, не помогает.

SCADAMaster
10.04.2013, 10:14
Какая у вас версия ОРС сервера?
В настройках сервера включите запись журнала. Задайте максимальный размер журнала - 10000 кб, и включите запись всех событий.
Запустите сервер в работу и когда подобная ситуация возникнет пришлите нам сфомированный лог (с точным временем зависания), а также конфигурацию ОРС сервера.
c:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\

Кстати у вас зависает связь со всеми контроллерами? Вы используете masterSCADA? В этом случае можно сделать переподключение когда будут возникнуть зависания - сервер закроется и запустится снова.

maks-tver
10.04.2013, 10:47
Версия сервера последняя с сайта, использую MasterSCADA, к сожалению я сейчас уже не на объекте и попасть туда пока не возможно, контроллеры отваливаются из другой подсети. Конфигурация это имеется ввиду файл *.mbc? И расскажите пожалуйста поподробнее про перезапуск сервера!

SCADAMaster
10.04.2013, 11:30
В MasterSCADA у OPC сервера, есть закладка "Опрос", в ней есть поле "Переподключаться по условию". В это поле можно перетащить дискретную переменную из дерева объектов, и когда она перейдет в состояние "Вкл", произойдет отписка от сервера (он закроется), а затем подписка снова (он запустится).
Например вы можете использовать модуль "Событие". При помощи функции OPCQuality( ) анализируйте признак качества какой нибудь переменной ОРС сервера. Формула будет примерно такая:
OPCQuality( Ваша_переменная )=0

maks-tver
18.11.2014, 17:31
В MasterSCADA у OPC сервера, есть закладка "Опрос", в ней есть поле "Переподключаться по условию". В это поле можно перетащить дискретную переменную из дерева объектов, и когда она перейдет в состояние "Вкл", произойдет отписка от сервера (он закроется), а затем подписка снова (он запустится).
Например вы можете использовать модуль "Событие". При помощи функции OPCQuality( ) анализируйте признак качества какой нибудь переменной ОРС сервера. Формула будет примерно такая:
OPCQuality( Ваша_переменная )=0

Сделал так, не помогает, причем ПЛК пингуется, помогает только остановка сервера и запуск кнопками старт стоп.

SCADAMaster
18.11.2014, 17:51
В настоящий момент между отпиской от сервера и повторной подпиской проходит слишком мало времени, и сервер не успевает закрыться. Мы сделаем настройку которая бы позволила увеличить этот интервал.
Пока что вы можете решить проблему закрывая процесс Modbus OPC сервера при помощи скрипта, а затем выполняя переподключение. Пример проекта в приложении.
Обратите внимание что у команды "Перезагрузить" на закладке "Опрос" продолжительность импульса - 3 такта (чтобы сервер успел закрыться).

maks-tver
19.11.2014, 08:51
Добавил в проект объект из вашего примера, но почему то переменные в режиме исполнения отображаются серым цветом как будто неактивны и напротив не отображаются данные15298

ASo
19.11.2014, 09:05
Так это команды. Вы в них пока ничего не записали.

SCADAMaster
19.11.2014, 09:43
Совершенно верно. Включите у команды значение до опроса - "выкл", тогда все появится.

maks-tver
19.11.2014, 10:45
В настоящий момент между отпиской от сервера и повторной подпиской проходит слишком мало времени, и сервер не успевает закрыться. Мы сделаем настройку которая бы позволила увеличить этот интервал.
Пока что вы можете решить проблему закрывая процесс Modbus OPC сервера при помощи скрипта, а затем выполняя переподключение. Пример проекта в приложении.
Обратите внимание что у команды "Перезагрузить" на закладке "Опрос" продолжительность импульса - 3 такта (чтобы сервер успел закрыться).
А по какому условию скрипт в примере закрывает процесс?

SCADAMaster
19.11.2014, 11:17
По нажатию кнопки на мнемосхеме

maks-tver
19.11.2014, 12:17
У меня есть событие OPCQuality( Модуль1_Канал0 )=0 которое при обрыве связи true, как его привязать к команде перезагрузить, чтобы сервер автоматический перезагружался при обрыве связи.

SCADAMaster
19.11.2014, 12:33
Вместо команды используете событие и все.

SCADAMaster
19.11.2014, 12:41
В приложении проект.

maks-tver
19.11.2014, 13:37
Большое спасибо!!!

Alexlyu
26.05.2021, 08:59
здравствуйте!
столкнулся с похожей проблемой.
На OPC иногда, без видимых причин наглухо зависает скрипт, даже плохое качество не отсылает в функции onError.
Поставил галку на перезапуск узла при сбое - пофигу.
Добавил программу ST в скаде, которая даёт сигнал не переподключение к OPC. Но OPC не успевает перезапуститься.
как быть?
вложение с костылём на Си отсутствует.

SCADAMaster
26.05.2021, 09:48
Как именно выглядит зависание? Скрипт падает (посмотрите в сообщениях скриптов)?
Какая версия ОРС?

Alexlyu
26.05.2021, 13:57
И так, зашёл я на форум с другого компа, оформление форму другое, вложение скачивается.
разобрался, как убивать. теперь перезапуск раборает.
Осталась другая проблема, скрипт глючить по-разному. Если сам заглючил, то перезапуск срабатывает, если usb-server (com->ethernet) помог, то уже никак.

-- Initialization
function OnInit()


end
-- Uninitialization
function OnClose()
end
-- Processing
function OnBeforeReading()
local send={};
local sendmask={"byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","byte","byte"};
local dest={};
local destmask={};
local bb={};
local n=0;
local weight;
local b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12;


repeat
err,dest,len=server.SendAndReceiveDataByMask(0,0,s endmask,send,destmask,12);
--NoErr,err,dest,len=pcall(server.SendAndReceiveData ByMask,0,0,sendmask,send,destmask,12);

n=n+1;
until (err>=0 and len == 12 and dest[1]==02) or n>=3
if err>=0 then
b1=dest[3]-48;
b2=dest[4]-48;
b3=dest[5]-48;
b4=dest[6]-48;
b5=dest[7]-48;
b6=dest[8]-48;
if b1>9 or b1<0 then
b1=0;
end
if b2>9 or b2<0 then
b2=0;
end
if b3>9 or b3<0 then
b3=0;
end
if b4>9 or b4<0 then
b4=0;
end
if b5>9 or b5<0 then
b5=0;
end
if b6>9 or b6<0 then
b6=0;
end
bb[1]=b1*100000;
bb[2]=b2*10000;
bb[3]=b3*1000;
bb[4]=b4*100;
bb[5]=b5*10;
bb[6]=b6*1;
weight=bb[1]+bb[2]+bb[3]+bb[4]+bb[5]+bb[6];
end
--контроль зависания
if weight==0 then
--timeSt=time.TimeStampNow( );
--w={};
--w=time.UnpackTime(timeSt );
--weight=w[6];
--weight=time.TimeNow( );
time1=time.TimeNow( );
w={};
w=time.UnpackTime(time1 );
weight=w[6];

end




--weight=b1*100000+b2*10000+b3*1000+b4*100+b5*10+b6* 1;
res=server.WriteTagByRelativeName("Weight",weight,OPC_QUALITY_GOOD);
--NoErr,res=pcall(server.WriteTagByRelativeName,"Weight",weight,OPC_QUALITY_GOOD);
if err<0 or dest[1]~=02 then
weight=0;
res=server.WriteTagByRelativeName("Weight",weight,OPC_QUALITY_BAD);
--NoErr,res=pcall(server.WriteTagByRelativeName,"Weight",weight,OPC_QUALITY_BAD);
end
end
-- Processing
function OnAfterReading()

end

-- Device failure
function OnError()
res=server.WriteTagByRelativeName("Weight",weight,OPC_QUALITY_BAD);


end
во вложении ошибки. одна, когда свет моргнёт, другая случайно, может через сутки, может два раза за час.

SCADAMaster
26.05.2021, 14:50
У вас скрипт падает. Что у вас в 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 элементов например?
И где у вас проверка контрольной суммы? Или ее нет?

Alexlyu
26.05.2021, 15:07
ну тут всё четко.
пробовал запросами, не раззобрался. и с XOR проверкой не разобрался.
Поставил непрерывную передачу.
Примерно за день разобрался, как заставить функцию только читать. (справка такаааая кривааая! да и интруция по протоколам тоже!!! Мануалы симинса на английском понятнее и в разы подробнее.)

в порт летит пакет 12 байт постоянно. начинается на [02], заканчивается на [03].
Функция сама видит начало и конец.
но пролетают и отрывки, поэтому в repeat проверяется длина (12шт) и начало (02).
Как говорил, с XOR не разобрался, поэтому не проверяю. И без него данные летят прекрасно.
так вот, если в нужном байте прилетает "0", то выглядит он 16х30, отнимаем 10х48, получаем 10х0. Максимум - 10х9.
Перед умножением проверяю на минимуи и максимум.
Плохое значение не пролетит.
Так же бывала ошибка функции записи тэга. не сфоткал. так же наглухо виснет скрипт.
Вообще даже если все функции засунуть в pcall, всё равно скрипт зависает.
всегда так зависает, что скада думает - всё норм. пришлось проверку делать.

SCADAMaster
26.05.2021, 15:22
У вас скрипт не зависает - происходит его падение, и он даже выдает строчку в которой это падение происходит.
Смотрите что вы делаете в этой строчке

Alexlyu
26.05.2021, 15:29
неделю смотрю.
добавляю проверки.
ничего криминального не делаю.
максимально просто всё, я ж выложил то, что выстрадал.
Хорошо, что с перезапуском всего сервера разобрался, помогает чаще всего.
Но почему на работает "реинициализация узла при ошбке"? и почему сервер вообще сам не пытается перезапустить скрипт. бред же.
лучше б доусрачки перезапускал. И все были бы счастливы.

SCADAMaster
26.05.2021, 15:40
Лог вам выдает ошибку - в какой строчке падает. В том что на скриншотах - 27 строка.
Что у вас там?

Alexlyu
26.05.2021, 15:49
я то думал, скрины помуогт в орпеделении ошибки. нагуглить не удалось.
когда скрипт падает сам, то ругается на эти
b1=dest[3]-48;
b2=dest[4]-48;
b3=dest[5]-48;
b4=dest[6]-48;
b5=dest[7]-48;
b6=dest[8]-48;

Если скрипту помогают падать, то на строчку с функцией записи тэга по имени. (это когда отваливается COM порт)

SCADAMaster
26.05.2021, 16:13
сделайте перед этим кодом:
if table.maxn(dest)~=8 then

end;

Выйдите из скрипта или снова выполните запрос

Alexlyu
03.06.2021, 08:41
сделайте перед этим кодом:
if table.maxn(dest)~=8 then

end;

Выйдите из скрипта или снова выполните запрос

Спасибо, помогло! (только 12 элементов поставил)
С тех пор была пара перезапусков сервера, и по нескольку сообщений за день от скады об ошибке переменной.
Раньше сообщений не было, видимо скрипт теперь не падает, а отсылает плохое качество.
Результатом я доволен, система работает без вмешательства.