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

Вопросы, не попадающие в другие разделы.

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

Сообщение Anna » Пн дек 20, 2010 2:32 pm

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

Сообщение MEXAHuK » Вт дек 21, 2010 4:28 am

Здравствуйте !

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

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:
MEXAHuK
 
Сообщения: 21
Зарегистрирован: Пн мар 23, 2009 10:21 am

Сообщение Anna » Вт дек 21, 2010 9:32 am

Спасибо большое! Сам скрипт работает нормально, но, если скрипт выполняется по условию пока открыто окно, при переходе на другие окна приложения, вьювер выдает ошибку приложения: Инструкция по адресу "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".

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

Так как я не совсем понимаю, как работает этот скрипт, не могу написать условие, которое бы останавливало его работу при закрытии окна, в котором он должен работать.
Помогите еще, пожалуйста, спасибо!
Anna
 
Сообщения: 16
Зарегистрирован: Пт сен 03, 2010 7:35 am

Сообщение Klinkmann_Msk » Вт дек 21, 2010 10:46 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".

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

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

Поместите скрипт в Application Script-while Running-1000 мс
А в Application Script-Оn Shootdown попробуйте прописать OLE_ReleaseObject (%WS);
Klinkmann_Msk
 
Сообщения: 819
Зарегистрирован: Пт сен 18, 2009 10:12 am

Сообщение Anna » Вт дек 21, 2010 11:30 am

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

Сообщение Anna » Вт дек 21, 2010 11:39 am

Единственный вариант на данный момент какой вижу, этот скрипт повесить на условие по нажатию кнопки срабатывание. Тогда никакие ошибки не вылезают )
И этот вариант всех устроил )

Все равно понять не могу, если у меня в интаче нет функций OLE, почему скрипт работает? :roll:
Anna
 
Сообщения: 16
Зарегистрирован: Пт сен 03, 2010 7:35 am

Сообщение MEXAHuK » Вт дек 21, 2010 12:58 pm

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

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

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

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

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

Хм. Надо поэкспериментировать. Если чего-нибудь найду, отпишусь сюда.
MEXAHuK
 
Сообщения: 21
Зарегистрирован: Пн мар 23, 2009 10:21 am

Сообщение MEXAHuK » Вт дек 21, 2010 1:36 pm

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

Сообщение Klinkmann_Msk » Вт дек 21, 2010 1:39 pm

Anna писал(а):есть операторская панель контроллера...

"Я вспомню как всё начиналось..." (почти Макаревич)
Что за панель? Что на ней установлено? Зачем нужно контроллировать её онлайн?
Klinkmann_Msk
 
Сообщения: 819
Зарегистрирован: Пт сен 18, 2009 10:12 am

Сообщение Anna » Вт дек 21, 2010 3:14 pm

MEXAHuK
Да, вы совершенно правы, я это и имела в виду, что команда пинг относительно долго выполняется, просто подробно не написала. Спасибо за совет, попробую обязательно )


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




Спасибо вам еще раз! С наступающим Новым Годом и Рождеством и всего вам самого хорошего! )
Anna
 
Сообщения: 16
Зарегистрирован: Пт сен 03, 2010 7:35 am

Сообщение Klinkmann_Msk » Вт дек 21, 2010 3:26 pm

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


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




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

Можно зайти с другой стороны. Считывать с этой панели в InTouch 1 тег. И по качеству этого тега судить (с большой долей вероятности) о доступности панели. В InTouch есть целый раздел в хелпе IOStatus
Klinkmann_Msk
 
Сообщения: 819
Зарегистрирован: Пт сен 18, 2009 10:12 am

Сообщение MEXAHuK » Ср дек 22, 2010 2:58 am

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");


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

Вас тоже с наступающими праздниками !
MEXAHuK
 
Сообщения: 21
Зарегистрирован: Пн мар 23, 2009 10:21 am

Сообщение Anna » Ср дек 22, 2010 8:46 am

Klinkmann_Msk
Если бы на эту панель можно было опрашивать, я бы и вопрос такой тут не поднимала ) Хотя я сама с этой панелью не работала, менеджер проекта ведет все оборудование, если бы была возможность, он бы наверное предложил бы наилегчайший путь опрашивать тег, но я этот вариант все-таки проверю. Спасибо )

MEXAHuK
Quick-функцию еще пока не создавала, но в течении дня сегодня попробую сделать. Спасибо еще раз за вашу огромную помощь! )
Anna
 
Сообщения: 16
Зарегистрирован: Пт сен 03, 2010 7:35 am

Сообщение Anna » Ср дек 22, 2010 11:41 am

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

Сообщение MEXAHuK » Ср дек 22, 2010 12:46 pm

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

Сообщение Anna » Ср дек 22, 2010 1:40 pm

Я наверное не знаю как асинхронность функции выставить :oops:

Я упорно вешаю этот скрипт на окно по условию While Showing, потому что не хочу обременять систему лишним процессом. Это не настолько значимый процесс, чтобы он выполнялся постоянно пока открыт вьювер, достаточно чтобы он работал пока открыто окно ) Там даже не одна панель, а две и еще два сервера будут опрашиваться таким способом, а машины на объекте слабей чем у меня, боюсь что притормаживать будут...
Anna
 
Сообщения: 16
Зарегистрирован: Пт сен 03, 2010 7:35 am

Сообщение Klinkmann_Msk » Пт дек 24, 2010 8:50 am

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 периодически запускать батник и опрашивать содержимое файла.
Klinkmann_Msk
 
Сообщения: 819
Зарегистрирован: Пт сен 18, 2009 10:12 am


Вернуться в Другое

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39