PDA

Просмотр полной версии : Универсальный Modbus Сервер Инсат и 200 контроллеров ПЛК-100



lomtik
12.10.2012, 22:06
Здравствуйте!
Суть проблемы. Мы перешли с кодесиса на модбас сервер инсат. Кодесисовский сервер зависал и не мог проработать в сети даже 1-го часа. Сейчас сервер считывает четыре переменных - три цифры и одну логическую (0 или 1). ,Все работает, но при кратковременном обрыве или сбое связи (похоже у провайдера какие-то проблемы) в первый момент сервер считывает у контроллера ложное состояние 1 хотя в контроллере эта переменная 0, затем где-то через секунду состояние переменной считывается правильно, т.е. 1 меняется на 0. Таким образом идут ложные сработки в скада проекте. Пробовал обрывать связь напрямую, подключив контроллер к ПК - все ок, сбоев нет, а на объекте наверно из-за наличия большого числа маршрутизаторо-роутеров-свитчей при восстановлении связи происходит ложная сработка. И похоже из-за этой проблемы со связью и не мог долго работать кодесис. Как это можно побороть?
Может сделать задержку в мастерскада проекте? и как? В момент считывания ложной единицы качество переменной на опс сервере модбас не bad , а ok.

SCADAMaster
13.10.2012, 21:44
Посмотрите по логу что происходит в момент когда пропадает связь - не открывается соединение, или запросы уходят, но не приходят ответы?

Можно попробовать эту ситуацию обработать в скриптах ОРС сервера. Нужно отслеживать момент ошибки, а когда ошибка исчезнет выполнить функцию server.UndoCurrentTag( ) - возврат предыдущего значения тега.

Однако если у вас не удается установить соединение, то скрипты в узле не выполняются (так как данных нет). Мы планируем сделать в скриптах отдельную функцию OnError которая будет вызываться в момент ошибки.

lomtik
16.10.2012, 19:24
когда нет связи - запросы идут ответ не получен, при восстановлении связи - получен обычный ответ, только с ложным значением переменной, который в следующем ответе уже верный . Причем так бывает не каждый раз, бывает , что нормально с первого запроса.

lomtik
17.10.2012, 10:38
т.е. сейчас ничего я пока сделать не смогу?
а если сделать в скаде проекте какую-то задержку обработки этой переменной? чтоб событие по выдачи моего аварийного сигнала в проекте запускалось через 1-2 сек, так получится?

SCADAMaster
17.10.2012, 15:03
когда нет связи - запросы идут ответ не получен
Тогда сможете.
Вам нужно в скрипте каждого тега (перед чтением) проверять признак качества тега. Если признак качества Bad, то установить флаг ошибки.
Когда признак качества снова станет Good - сбросить флаг, и вернуть предыдущее значение тега.
Код скрипта примерно такой:

local Error;

-- инициализация
function OnInit()
Error=false;
end
-- деинициализация
function OnClose()
end
-- обработка
function OnRead()
val,qual=server.ReadCurrentTag();
if qual==OPC_QUALITY_BAD then
Error=true;
end;
if Error==true and qual==OPC_QUALITY_GOOD then
server.UndoCurrentTag( );
Error=false;
end;
end

Вопросы по MasterSCADA и MasterOPC лучше задавать к нам в техподдержку - по электронной почте

SCADAMaster
17.10.2012, 19:19
И если таких проблемных переменных у вас много, то желательно исполнять скрипт из файла - чтобы можно было быстро внести изменения в код.
Обратитесь в техподдержку - мы скажем как это можно сделать.

lomtik
17.10.2012, 20:55
ага, вот это уже интересно, завтра попробую,
получается что таких переменных у меня очень много, практически все 200. А в техподдержку писать куда - в инфо собака инсат.ру?

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

качество значение
ok //////////////false
ok //////////////false
ok //////////////false
bad /////////////false
bad /////////////false
bad /////////////false
bad /////////////false
bad /////////////false
ok //////////////true - ложная сработка
ok //////////////false
ok //////////////false
ok //////////////false

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

lomtik
18.10.2012, 14:19
извините, может что не так делаю, но пока не получается :(

и как вот это побороть - когда связь рвется несколько раз подряд, то ложная сработка запоминается?

ok //////////////false
ok //////////////false
ok //////////////false
bad /////////////false
bad /////////////false
bad /////////////false
bad /////////////false
bad /////////////false
ok //////////////true - ложная сработка, при этом значение качества ок
bad//////////////true
bad //////////////true
ok //////////////false
ok //////////////false
ok //////////////false

SCADAMaster
18.10.2012, 15:39
А в техподдержку писать куда - в инфо собака инсат.ру?

Support



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



и как вот это побороть - когда связь рвется несколько раз подряд, то ложная сработка запоминается?

А при Bad всегда должно быть False?
Ну тогда такой код:
local Error;

-- инициализация
function OnInit()
Error=false;
end
-- деинициализация
function OnClose()
end
-- обработка
function OnRead()
val,qual=server.ReadCurrentTag();
if qual==OPC_QUALITY_BAD then
Error=true;
server.WriteCurrentTag(false,OPC_QUALITY_BAD );
end;
if Error==true and qual==OPC_QUALITY_GOOD then
server.UndoCurrentTag( );
Error=false;
end;
end

lomtik
19.10.2012, 14:30
вообщем, потестил еще раз на одном котнроллере, в итоге ничего не помогает. Заметил правда еще глюк - при восстановлении связи на тестовом контроллере три числовых тэга сбрасывают кратковременно значение на 0, а логические - меняют false на true. Попробовал увеличить частоту опроса в 10 раз и о чудо на тестовом контроллере все заработало, ни одной ложной сработки при восстановлении связи и ни одного сброса числа. Надеюсь это поможет. Пусть частота будет по-больше, но зато не будет ложных сработок.
Помогите немного со скриптами разобраться: мне надо сделать чтобы при качестве тэга bad значение тэга было бы всегда false. Тот скрипт, который последний указан выше не работает или я что то сделал не то.
Когда он должен всетаки выполняться - перед чтением или после?
вы написали:




Вам нужно в скрипте каждого тега (перед чтением) проверять признак качества тега.

а в сервере у каждого тэга скрипт можно запустить только после чтения.

SCADAMaster
19.10.2012, 18:25
Помогите немного со скриптами разобраться: мне надо сделать чтобы при качестве тэга bad значение тэга было бы всегда false. Тот скрипт, который последний указан выше не работает или я что то сделал не то.
Когда он должен всетаки выполняться - перед чтением или после?
вы написали:

Что значит не работает?
Не меняется признак? Что выводится в логи скриптов?
Посмотрите видеопримеры, в них есть примеры работы со скриптами.
http://www.masteropc.ru/prices/info.php?pid=6944

если вам нужно чтобы скрипт просто сбрасывал в False при плохом качества, то нужно использовать такой скрипт:
val,qual=server.ReadCurrentTag();
if qual==OPC_QUALITY_BAD then
server.WriteCurrentTag(false,OPC_QUALITY_BAD );
end;




Когда он должен всетаки выполняться - перед чтением или после?

После чтения



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

lomtik
19.10.2012, 21:32
я имел ввиду то, что скрипт откомпилирован без ошибок, запускается в момент обращения к тэгу, но не меняется значение тэга при качестве bad. Делал значение специально true , потом обрывал связь, и тэг должен был по идее поменяться на false, но он не менялся. А логи скрипта смотреть на закладке сообщения скриптов? Там пусто.
Да, видеопримеры смотрел, это здорово, что есть и такая помощь, по ним очень хорошо изучать ;)
теперь в понедельник еще попробую.

кажись я понял почему у меня не меняется значения тэга считанного с контроллера при отсутствии связи, т.е. качестве bad:


если у вас не удается установить соединение, то скрипты в узле не выполняются (так как данных нет).
это поэтому, да? это прокатывает только если на сервере тэг - server_only?


Мы планируем сделать в скриптах отдельную функцию OnError которая будет вызываться в момент ошибки.
т.е. этого еще нет в существующем сервере? и когда планируете?

SCADAMaster
22.10.2012, 08:43
кажись я понял почему у меня не меняется значения тэга считанного с контроллера при отсутствии связи, т.е. качестве bad:

Скрипт не выполняется если не удается открыть порт, в сообщения в этом случае выводится:
[22.10.2012 8:39:58.906] Information : попытка соединения 127.0.0.1 502
[22.10.2012 8:40:03.890] Error : ошибка установления соединения 127.0.0.1 502
В таком случае скрипты выполняться не будут. Потому как порт закрыт и данных нет.



т.е. этого еще нет в существующем сервере? и когда планируете?
В текущей версии этого нет. В ближайшее время этот функционал добавить не удастся.

Можете пока что создавать конфигурацию с включенными скриптами и исполнением скриптов из файла. Пример в приложении.
Файлы ScriptDevice.lua и ScriptTag.lua нужно положить в папку
c:\Documents and Settings\All Users\Application Data\Insat\MasterOPC Universal Modbus Server\MODULES\
У тега и у устройства нужно прописать строку загрузки кода из файла.

lomtik
29.10.2012, 11:51
ок, техподдержка ответила также, скрипты не выполняются если нет связи. В принципе, на первое время достаточно увеличив период опроса - основные ошибки пропали, остались несколько контроллеров, которые через wi-fi обмениваются, но это уже не критично. Вопрос другой: есть контроллер ПЛК-100, который удален физически от сервера на несколько километров, связи проводной с ним нет, и его надо тоже опрашивать. Подскажите, я правильно понял что мне нужно докупить: модем ПМ-01 + антенна. У провайдера заказываю статический IP для модема ПМ-01, который будет установлен у ПЛК-100 и через компьютер с уже приобритенным универсальным ОПС-сервером Модбас и выходом в интернет я точно также зная IP-шник контроллера подключаюсь через ОПС сервер и вижу все переменные? Я прав? Больше ничего не надо?

SCADAMaster
30.10.2012, 11:01
Может потребоваться чтобы компьютер и контроллеры находились в одной "локальной" сети.
Подробнее вам нужно уточнить в техподдержке ОВЕН.

lomtik
08.11.2012, 00:40
подскажите примерные сроки выхода нового опс от инсат с поддержкой работы скриптов в off-line режиме когда нет связи с плк?
И все таки, можно ли как то тогда уже не дожидаясь нового опс в мастер скаде сделать так, чтобы при отсутствии связи с прибором значение одной переменной было бы всегда false?
спс.

SCADAMaster
08.11.2012, 09:37
подскажите примерные сроки выхода нового опс от инсат с поддержкой работы скриптов в off-line режиме когда нет связи с плк?

Сроков пока что назвать не можем - этот функционал не простой, а программист сейчас занят.



И все таки, можно ли как то тогда уже не дожидаясь нового опс в мастер скаде сделать так, чтобы при отсутствии связи с прибором значение одной переменной было бы всегда false?

В скаде в принципе можно.
У нас есть функциональный блоки для работы с признаками качества. Например можно использовать ФБ "Вывод признаков качества".
Также можно использовать модуль "Событие", у него есть функция для определения признака качества - OPCQuality( ). С помощью этой функции можно определить признак качества переменной, и выдать на выход события "Ложь" если признак качества.
Можно использовать модуль "Скрипт C#" - в нем также можно работать с признаками качествами. Пример такого скрипта есть в библиотеке - Примеры скриптов - Получение признака качества.

lomtik
08.11.2012, 23:42
огромное спасибо за подзсказки.