This is topic Остановка МРВ in forum Редактор проекта TRACE MODE 6 / at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/32/t/000072.html

Posted by PMA (Участник № / Member № 1387) on :
 
Добрый день !
При работе МРВ нужно отловить событие когда оператор нажал кнопку остановить МРВ, и выполнить определённую программу.
Это необходимо для установки выходных сигналов
в исходное состояние.
Как можно это сделать ???
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Тогда необходимо останавливать МРВ не через меню, а программно через системную переменную @Exit - смотрите описание в справочной системе.
А в графике реализовать оператору кнопку выключения МРВ.
 
Posted by PMA (Участник № / Member № 1387) on :
 
Использовал переменную @Exit, результат очень
странный, предполагалось что произойдёт отключение монитора аналогичное нажатию кнопки на бегущем человеке однако...
1. Остановка происходит вроде бы, но сохраняется работоспособность всех графических элементов, то есть можно открывать - закрывать окна вводить значения.
2. Кнопка с бегущим человеком находится в утопленном состоянии, так как будто монитор запущен.

Пожалуйста дайте более подробное описание того, что происходит при присваивании значени 5 переменной @Exit, в документации очень мало информации.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Все верно - сервер останавливается, но графика еще работоспособна, она независит от математики. После останова МРВ может быть закрыт штатными средствами (например, Alt+F4). Других способов нет.
 
Posted by Виталий (Участник № / Member № 2118) on :
 
Кстати, в полноэкранном режиме все равно alt+F4 не работает, и смысл в @Exit теряется полностью.

У меня например за машиной сидит "чайник" и для него нажать в полноэкранном режиме с отключенным меню ctrl+f ctrl+r alt+F4 совершенно нереально. Ему надо так - запустил весь проект одной кнопкой (это я по простому на bat сделал) и закрыл одной же кнопкой целиком, т.е. чтобы на экране ничего не осталось и в задачах тоже.

Может быть можно передать среде последовательность нажатых клавиш?
Может кто пробовал ActiveX объект сделать, который бы выполнил подобную операцию, или грубо закрыл процесс в диспетчере или еще что от внешнего программирования?
 
Posted by Дмитрий Юрьевич М. (Участник № / Member № 1930) on :
 
Подпишусь под каждым словом Виталия. Мне нужно то же самое! Идея была вызвать внешнюю dll, которая найдёт процесс МРВ и добьёт его снаружи. Но пока не писал, всё ещё надеюсь, что ADASTRA Technical Support поможет решить проблему более гуманными способами. Может, в релиз 6.05 добавить такую возможность???? Закрытие программы для чайника?
 
Posted by Константин Арапов (Участник № / Member № 1998) on :
 
Народ ! Эта тема параллельно обсуждается в разделе
"Мониторы Реального Времени / Real Time Monitors".

Разаработчики сказали, что им
"необходимо обоснование, в каких случаях и почему необходима остановка (а возможно и полное завершение работы) удалённого узла."
И они просят направлять это обоснование на адрес техподдержки hotline2@adastra.ru

Предлагаю всем написать. Я уже это сделал.
 
Posted by Константин Арапов (Участник № / Member № 1998) on :
 
Параллельно эта тема обсуждается здесь.

http://forum.adastra.ru/ubb/ultimatebb.php/ubb/get_topic/f/35/t/000084.html
 
Posted by Майборода Алексей (Участник № / Member № 1701) on :
 
Можно это делать вот так (вариант не оптимален накидал за 5 минут)
Пишем на делфи (например) получаем exe теперь если запустить exe то RTM выгрузится полностью.
Как запустить внешнее приложение из TM наверное уже все знают.
program KillRTM;

uses
Windows;

const
PROCESS_TERMINATE = $0001;
var
ProcessHandle : THandle;
ProcessID: Integer;
TheWindow : HWND;

{$R *.res}

begin
TheWindow := FindWindow('QWidget', nil);
if TheWindow <> 0 then
begin
GetWindowThreadProcessID(TheWindow, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;
end.
 
Posted by Константин Арапов (Участник № / Member № 1998) on :
 
А если речь идет о закрытии NLL? Насколько я понимаю, там вообще никакой мат. обработки нет.
И внешнюю программу, насколько я понимаю запустить нельзя...
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
В узле NLL можно использовать программы, а соответственно и внешние библиотеки.
 
Posted by Константин Арапов (Участник № / Member № 1998) on :
 
Интересно. Код работает. Возникают два вопроса:

1.Почему именно класс QWidget ? Как Вы определили,
можно поинтересоваться ?
2. Не убьем ли мы таким образом какое нибудь другое приложение, имеющее такой же класс ?
 
Posted by Майборода Алексей (Участник № / Member № 1701) on :
 
1) Определил при помощь Spy++ входит в состам Visual Studio.
2) Если запустите более одного раза то можете и убить, например у меня была запушена среда разработки и профайлер, первым запуском вынесло профайлер а второй запуск вынес среду разработки [Улыбка / Smile] . Это я и имел ввиду говоря о неоптимальности. Просто у меня такая задача не стоит и я с этим не занимался, просто столо интересно и накидал за 5 минут.
Ещё как вариант можно написать программку которая в это окно будет посылать нажатия клавишь (Ctrl+R и т.д.).
Можно узнать какое окно находится под указателем мыши (получим кнопку на которую нажимаем) подняться по иерархии объектов до главного окна и тогда закроется именно то главное окно где был курсор.
Вобщем вариантов море, главное фантазия.
 
Posted by Константин Арапов (Участник № / Member № 1998) on :
 
Наклепал DLL-ку. Вроде как работает. Вот интересно только КАКИЕ ЕЩЕ
приложения эта штука может убить ?
Просто я в этих классах окон не секу... То что IDE выбило - фиг с ним, а вот если какое другое приложение...
У меня вот куча приложений разных открыто, но вроде как ничего не убилось... Но может быть есть такие приложения ? Если есть, то интересно какие, кроме TM6 IDE ?
 
Posted by Майборода Алексей (Участник № / Member № 1701) on :
 
Те приложения графика которых разработана с помощью библииотеки Qt3 (версии могут быть разные). Можно сделать так [Улыбка / Smile] смотреть есть ли процесс rtm.exe и если есть выполнять код, если нету то не выполнять тем самым вы не убъете остальные приложения.
 
Posted by Майборода Алексей (Участник № / Member № 1701) on :
 
Ну вот в общем накидал за 15 минут. Теперь она избавлена от указанных недостатков. Убивает именно процесс rtc.exe и ничего более.
program KillRTM;

uses
Windows,
Tlhelp32;

const
PROCESS_TERMINATE = $0001;

var
hProcessSnap : THandle;
pe32 : PROCESSENTRY32;
temp : string;
PID : cardinal = 0;
ProcessHandle : THandle;

{$R *.res}

begin
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
pe32.dwSize := sizeof(PROCESSENTRY32);

if Process32First(hProcessSnap, pe32) then
temp := pe32.szExeFile;
if Pos('rtc.exe', temp) <> 0 then
begin
PID := pe32.th32ProcessID;
CloseHandle(hProcessSnap);
end
else
begin
pe32.dwSize := sizeof(PROCESSENTRY32);
while Process32Next(hProcessSnap,pe32) do
begin
temp := pe32.szExeFile;
if Pos('rtc.exe', temp) <> 0 then
begin
PID := pe32.th32ProcessID;
CloseHandle(hProcessSnap);
end;
pe32.dwSize := sizeof(PROCESSENTRY32);
end;
end;

if PID <> 0 then
begin
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, PID);
TerminateProcess(ProcessHandle,4);
end;

end.
 
Posted by amber (Участник № / Member № 4553) on :
 
Не появились ли в версии 6.07 штатные (более простые) способы добавить на экран кнопку, по нажатии на которую будет останавливаться / закрываться МРВ?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Не появились.
 
Posted by amber (Участник № / Member № 4553) on :
 
Планируется ли добавление в будущих релизах?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
По вопросам развития системы следует обращаться по sales@adastra.ru.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2