This is topic Завершение работы in forum Мониторы Реального Времени / Real Time Monitors at Форум TRACE MODE: техническая поддержка.


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

Posted by Elias (Участник № / Member № 636) on :
 
Как правильнее произвести выключение компьютера из Профайлера по команде оператора
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Штатной функции нет. Как решение - можно встроить пользовательский FBD на VС++ как DLL, которым можно как локальный, так и удаленный ПК выключать (или перезагружать) по команде оператора. А уж как Вы им управлять будете - можно с графической консоли, можно автоматом в самой программе на FBD.
Если сможете собрать DLL сами - могу привести исходный код на C++.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Всем кто не знаком с С++ думаю будет полезен уже готовый FBD-блок. [fun / веселый]
Данная DLL может быть использована как FBD-блок в программах на FBD в ТМ 5-й версии. Позволяет осуществлять перезагрузку или выключение локального ПК в различных режимах.
Более подробное описание в архиве.
http://www.tracemode.ru/ru/download/tm5/resetfbd.zip
 
Posted by Elias (Участник № / Member № 636) on :
 
Вышлите, пожалуйста, исходный код на VC++.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Держите - это исходник данной DLL на VC++:

code:
 
#include <string.h>
#include <windows.h>

__declspec(dllexport) int FBD_DLL( float*, float*, int*, int* );
__declspec(dllexport) void zFBD_DLL_info( void* );
__declspec(dllexport) void zFBD_DLL_varname( char* );

// Структура описывающая FBD-модуль

typedef struct
{
int q_in; // Количество входов
int q_out; // Количество выходов
int q_int; // Зарезервировано
int type; // Номер в списке функциональных разделов.
// Должно быть равно 17
char name[8]; // Короткое имя для вывода на экран
char fname[8]; // Полное имя
} DO_DEFAULT;

// Тело FBD-модуля
int FBD_DLL( float *in, // Указатель на массив входов
float *out, // Указатель на массив выходов
int *l, int *rl ) // Зарезервировано
{
bool AppClose, Reboot;

if (in[0]==1){
AppClose=FALSE;
Reboot =FALSE;
}
if (in[0]==2){
AppClose=TRUE;
Reboot =TRUE;
}
if (in[0]==3){
AppClose=TRUE;
Reboot =FALSE;
}
if (in[0]==4){
AppClose=FALSE;
Reboot =TRUE;
}
if (in[0]>0){

HANDLE hToken; // handle to process token
TOKEN_PRIVILEGES tkp; // pointer to token structure

BOOL fResult; // system shutdown flag

// Get the current process token handle so we can get shutdown
// privilege.

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
out[0]=1;
//printf("OpenProcessToken failed.\n");

// Get the LUID for shutdown privilege.

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get shutdown privilege for this process.

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);

// Cannot test the return value of AdjustTokenPrivileges.

if (GetLastError() != ERROR_SUCCESS)
out[0]=2;
//printf("AdjustTokenPrivileges enable failed.\n");

// Display the shutdown dialog box and start the time-out countdown.

fResult = InitiateSystemShutdown(
"", // shut down local computer
"This PC will be shutdown now.", // message to user
(unsigned int)in[1], // time-out period
AppClose, // ask user to close apps
Reboot); // reboot after shutdown

if (!fResult)
{
out[0]=3;
//printf("InitiateSystemShutdown failed.\n");
}

// Disable shutdown privilege.

tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
{
out[0]=4;
//printf("AdjustTokenPrivileges disable failed.\n");
}

out[0]=0;

}

return 0;
}
// Формирует указатель на описание FBD-модуля
void zFBD_DLL_info( void *buf )
{
DO_DEFAULT *dd;
dd=(DO_DEFAULT *)buf;

strcpy( dd->name, "Reset" );
strcpy( dd->fname, "Reset" );
dd->q_in = 3;
dd->q_out = 1;
dd->type = 17;
dd->q_int = 0;
}
// Формирует указатель на имена входов и выходов.
// На каждое имя отводится 8 байт
void zFBD_DLL_varname( char *varname )
{
strcpy( varname+0, "RUN" );
strcpy( varname+8, "RCMD" );
strcpy( varname+16, "TM" );
strcpy( varname+24, "RES" );
}


 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2