Страница 1 из 1

Отображение работы операторской панели контроллера в InTouch

СообщениеДобавлено: Пн дек 20, 2010 2:32 pm
Anna
Здравствуйте! Подскажите пожалуйста, есть операторская панель контроллера, у нее есть свой айпишник, можно ли как-то через InTouch пинговать эту панель, чтобы отображать в окне работу или неработу этой панели или какой-то другой способ может есть? Попробовали через функцию StartApp пинговать, команда проходит, открывается окно командной строки и выполняется пинг, но как результат отобразить в интаче, не могу придумать )) И желательно чтобы окно командной строки лучше бы не открывалось, так как опрос работы панели будет каждую секунду и неудобно будет если перед оператором будет постоянно висеть окно cmd. Помогите пожалуйста! )

СообщениеДобавлено: Вт дек 21, 2010 4:28 am
MEXAHuK
Здравствуйте !

Попробуйте так:

OLE_CreateObject(%WS,"Wscript.Shell");
RESULT = %WS.Run ("ping -n 1 127.0.0.1",0,1);
OLE_ReleaseObject (%WS);

RESULT - тег типа memory integer
RESULT = 0 - пинг есть
RESULT = 1 - пинга нет

ЗЫ
вместо 127.0.0.1 - адрес панели :wink:

СообщениеДобавлено: Вт дек 21, 2010 9:32 am
Anna
Спасибо большое! Сам скрипт работает нормально, но, если скрипт выполняется по условию пока открыто окно, при переходе на другие окна приложения, вьювер выдает ошибку приложения: Инструкция по адресу "0х004572f5" обратилась к памяти по адресу "0х50da0092". Память не может быть "read". И после нажатия ок вьювер закрывается. Также если закрываю вьювер, возникает другая ошибка:
InTouch OLE Automation Error: 0x100e0301.
Error processing 'unknown)' in method call (init). Internal InTouch Error - RT_OLE_E_ACTION_NOT_INIT.
Окошко ошибки закрывается только после трех или четырех нажатий ок и выскакивает другое окно:
Shutdown WindowViewer: view.exe - Ошибка приложения.
Инструкция по адресу "0х004572f5" обратилась к памяти по адресу "0х50da0092". Память не может быть "read".

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

Так как я не совсем понимаю, как работает этот скрипт, не могу написать условие, которое бы останавливало его работу при закрытии окна, в котором он должен работать.
Помогите еще, пожалуйста, спасибо!

СообщениеДобавлено: Вт дек 21, 2010 10:46 am
Klinkmann_Msk
Anna писал(а):Спасибо большое! Сам скрипт работает нормально, но, если скрипт выполняется по условию пока открыто окно, при переходе на другие окна приложения, вьювер выдает ошибку приложения: Инструкция по адресу "0х004572f5" обратилась к памяти по адресу "0х50da0092". Память не может быть "read". И после нажатия ок вьювер закрывается. Также если закрываю вьювер, возникает другая ошибка:
InTouch OLE Automation Error: 0x100e0301.
Error processing 'unknown)' in method call (init). Internal InTouch Error - RT_OLE_E_ACTION_NOT_INIT.
Окошко ошибки закрывается только после трех или четырех нажатий ок и выскакивает другое окно:
Shutdown WindowViewer: view.exe - Ошибка приложения.
Инструкция по адресу "0х004572f5" обратилась к памяти по адресу "0х50da0092". Память не может быть "read".

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

Так как я не совсем понимаю, как работает этот скрипт, не могу написать условие, которое бы останавливало его работу при закрытии окна, в котором он должен работать.
Помогите еще, пожалуйста, спасибо!

Поместите скрипт в Application Script-while Running-1000 мс
А в Application Script-Оn Shootdown попробуйте прописать OLE_ReleaseObject (%WS);

СообщениеДобавлено: Вт дек 21, 2010 11:30 am
Anna
Получается очень интересная ситуация ) Перемещение части скрипта в условие On hide не помогло. Увеличила время опроса вначале до минуты потом в обратную сторону до 30секунд и остановилась на 10 секундах опроса, в принципе работает стабильно. Единственное но, если попадешь в момент когда эти 10 секунд подошли и происходит выполнение скрипта, если не дай Бог перейти в этот момент на другое окно, то тогда вылезает ошибка приложения, что опять же плохо, следовательно при увеличении времени вероятность попасть в такую ситуацию все равно сохраняется хоть и в меньшей степени, но и увеличивается время опроса, этое не очень хорошо. Наверное, как я понимаю, в этой ситуации мало чем уже поможешь (
Единственное непонятное для меня остается то, что функций OLE у меня в 8 версии InTouchа нет и я не понимаю, как вообще у меня этот скрипт работает )

СообщениеДобавлено: Вт дек 21, 2010 11:39 am
Anna
Единственный вариант на данный момент какой вижу, этот скрипт повесить на условие по нажатию кнопки срабатывание. Тогда никакие ошибки не вылезают )
И этот вариант всех устроил )

Все равно понять не могу, если у меня в интаче нет функций OLE, почему скрипт работает? :roll:

СообщениеДобавлено: Вт дек 21, 2010 12:58 pm
MEXAHuK
Если честно, я не могу ничего сказать по поводу 8 интача :(
Вот 9 и 10 совершенно точно умеют использовать OLE объекты, это описано в документации.

А работает этот скрипт весьма незамысловато.
В первой строке создается OLE объект с указателем %WS на класс Wscript.Shell
У этого класса есть метод Run, который, собственно, и используется для выполнения системной команды ping. Результат выполнения считывается в переменную интача.
Третьей строкой освобождаем объект класса Wscript.Shell и удаляем указатель на него.

Вероятно, в 8 версии тоже есть поддержка OLE, поэтому и работает.

С ошибками вышло, конечно, нехорошо. :(
Вроде все должно было работать нормально, я не раз использовал метод Run для других нужд.

А если запихнуть этот скрипт в QuickFunction и уже его вызывать из скрипта WhileRunning ?

Хм. Надо поэкспериментировать. Если чего-нибудь найду, отпишусь сюда.

СообщениеДобавлено: Вт дек 21, 2010 1:36 pm
MEXAHuK
Кажется, разобрался.
Команда ping - довольно длительная по времени выполнения. В этом, скорее всего и проблема.
Т.е. команда не отработала, мы пытаемся закрыть окно, возникает ошибка.
Попробуйте сделать так.
Создайте асинхронную Quick-функцию, допустим PING.
Поместите в нее скрипт.
Из WhileRunning скрипта вызывайте наш скрипт: Call PING();
Так вроде бы все работает без ошибок.

СообщениеДобавлено: Вт дек 21, 2010 1:39 pm
Klinkmann_Msk
Anna писал(а):есть операторская панель контроллера...

"Я вспомню как всё начиналось..." (почти Макаревич)
Что за панель? Что на ней установлено? Зачем нужно контроллировать её онлайн?

СообщениеДобавлено: Вт дек 21, 2010 3:14 pm
Anna
MEXAHuK
Да, вы совершенно правы, я это и имела в виду, что команда пинг относительно долго выполняется, просто подробно не написала. Спасибо за совет, попробую обязательно )


Klinkmann_Msk
Панель примерно такая, но это неважно
http://automation-drives.ru/as/download ... Line_r.pdf
не суть, просто есть окно, где отображено все оборудование и эта панель в том числе, состояние оборудования, то есть работает или нет, все просто ) Проблема была лишь в том, что ни мне, ни моим коллегам ни в 8, ни в 9 интаче не приходилось сталкиваться с такой задачей.




Спасибо вам еще раз! С наступающим Новым Годом и Рождеством и всего вам самого хорошего! )

СообщениеДобавлено: Вт дек 21, 2010 3:26 pm
Klinkmann_Msk
Anna писал(а):MEXAHuK
Да, вы совершенно правы, я это и имела в виду, что команда пинг относительно долго выполняется, просто подробно не написала. Спасибо за совет, попробую обязательно )


Klinkmann_Msk
Панель примерно такая, но это неважно
http://automation-drives.ru/as/download ... Line_r.pdf
не суть, просто есть окно, где отображено все оборудование и эта панель в том числе, состояние оборудования, то есть работает или нет, все просто ) Проблема была лишь в том, что ни мне, ни моим коллегам ни в 8, ни в 9 интаче не приходилось сталкиваться с такой задачей.




Спасибо вам еще раз! С наступающим Новым Годом и Рождеством и всего вам самого хорошего! )

Можно зайти с другой стороны. Считывать с этой панели в InTouch 1 тег. И по качеству этого тега судить (с большой долей вероятности) о доступности панели. В InTouch есть целый раздел в хелпе IOStatus

СообщениеДобавлено: Ср дек 22, 2010 2:58 am
MEXAHuK
Klinkmann_Msk
Могу ошибаться, но мне кажется, что по запросу с этих панелей ничего вытащить наружу не получится. Они могут только или опрашивать контроллер, или записывать в него же.

Anna
По дороге на работу подумалось.
В созданную Quick-функцию можно передавать в качестве аргумента IP адрес. Тогда одной функцией можно будет пинговать произвольные адреса.

Код: Выделить всё
Function: PING (asynchronous)
Arguments
IP          Message

OLE_CreateObject(%WS,"Wscript.Shell");
RESULT = %WS.Run ("ping -n 1 "+IP,0,1);
OLE_ReleaseObject (%WS);


Вызов функции:

Код: Выделить всё
Call PING("192.168.0.100");


Результат также можно сделать возвращаемым аргументом.

Вас тоже с наступающими праздниками !

СообщениеДобавлено: Ср дек 22, 2010 8:46 am
Anna
Klinkmann_Msk
Если бы на эту панель можно было опрашивать, я бы и вопрос такой тут не поднимала ) Хотя я сама с этой панелью не работала, менеджер проекта ведет все оборудование, если бы была возможность, он бы наверное предложил бы наилегчайший путь опрашивать тег, но я этот вариант все-таки проверю. Спасибо )

MEXAHuK
Quick-функцию еще пока не создавала, но в течении дня сегодня попробую сделать. Спасибо еще раз за вашу огромную помощь! )

СообщениеДобавлено: Ср дек 22, 2010 11:41 am
Anna
MEXAHuK Спасибо за бесценный опыт, скрип заработал сразу. Но все-таки даже быстрая функция не такая быстрая :wink: и все-таки если переключаешь окно во время выполнения ping, вылезает ошибка приложения, к сожалению. Я думаю тут уже никакое средство не поможет, так как 4 пакета пинга - это достаточно долго на любом компе, может быть в 10 интаче это все лучше работает. А нашим заказчикам пока придется работать "методом тыка" на кнопку )) так по крайней мере застрахованы будут на 100% от таких ошибок )
Спасибо! )

СообщениеДобавлено: Ср дек 22, 2010 12:46 pm
MEXAHuK
Да не за что, в общем то :)
А свойство асинхронности функции не забыли выставить ?
Я бы еще обязательно вынес вызов этой функции из оконного скрипта в Scripts->Application->WhileRunning.
Или вовсе создал бы отдельный Condition-скрипт с условием, например, $Second/10 == Int($Second/10) и вызывал бы функцию оттуда.
Кстати, оказывается, получать результат из асинхронной функции нельзя, это одно из ограничений.

СообщениеДобавлено: Ср дек 22, 2010 1:40 pm
Anna
Я наверное не знаю как асинхронность функции выставить :oops:

Я упорно вешаю этот скрипт на окно по условию While Showing, потому что не хочу обременять систему лишним процессом. Это не настолько значимый процесс, чтобы он выполнялся постоянно пока открыт вьювер, достаточно чтобы он работал пока открыто окно ) Там даже не одна панель, а две и еще два сервера будут опрашиваться таким способом, а машины на объекте слабей чем у меня, боюсь что притормаживать будут...

СообщениеДобавлено: Пт дек 24, 2010 8:50 am
Klinkmann_Msk
Anna писал(а):Я наверное не знаю как асинхронность функции выставить :oops:

Я упорно вешаю этот скрипт на окно по условию While Showing, потому что не хочу обременять систему лишним процессом. Это не настолько значимый процесс, чтобы он выполнялся постоянно пока открыт вьювер, достаточно чтобы он работал пока открыто окно ) Там даже не одна панель, а две и еще два сервера будут опрашиваться таким способом, а машины на объекте слабей чем у меня, боюсь что притормаживать будут...

Можно так.
Создайте C:\mmm.bat с содержанием:
ping -n 1 0.0.0.0
goto answer%ERRORLEVEL%
:answer0
echo 0 > C:\mmm.txt
goto end
:answer1
echo 1 > C:\mmm.txt
:end

Результат запуска такого файла = 0 или 1 в файле C:\mmm.txt
Из-под InTouch периодически запускать батник и опрашивать содержимое файла.