📄 gwmain.cpp
字号:
/******************************************************************
** Copyright (c) 2004-2005, 许继日立公司
** All rights reserved.
**
** 文件名称:gwmain.cpp
** 文件标识:
** 摘 要:许继日立陶乐变网关程序主程序及全局函数实现。主要负责初始
** 一些变量和建立必要的线程及通道,本程序最大线程不超过16个
**
** 当前版本:1.0
** 作 者:李龙伟 <lilongwei1@hotmail.com>
** 完成日期:2004年11月03日
**
** 取代版本:1.0
** 原作者 :李龙伟
** 完成日期:2004年11月03日
******************************************************************/
#include <stdio.h>
#include <windows.h>
#include "gwmain.h"
#include "sysvar.h"
#pragma comment(lib,"wsock32.lib")
HANDLE InstanceMutex=NULL;
int nArg[MAX_RULE];
/*====================================================================================
*
* Subroutine : main()//InitSock()
*
* Parameters :
*
*
* Called from : //CManngeApp::InitInstance()
*
* Description : 处理SOCKET的初始工作,并调用服务程序。
*
* Return :
*
* Modification:
* 2004-05-28:
*
*====================================================================================*/
int main(int argc, char* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
InstanceMutex=CreateMutex(NULL,FALSE,"RunPrtInstance");
if(InstanceMutex==NULL||ERROR_ALREADY_EXISTS==::GetLastError())
{
printf("程序已经启动!\n");
exit(0);
}
wVersionRequested = MAKEWORD( 2, 2 );
//完成Windows Sockets DLL的初始化;协商版本支持,分配必要的资源
err = WSAStartup( wVersionRequested, (LPWSADATA)&wsaData );
if ( err != 0 )
{
// Tell the user that we could not find a usable WinSock DLL.
printf("Cannot startup winsock DLL\n");
exit(1);
}
GW_Scada();
//从Windows Sockets实现中注销自己,并允许实现释放为其分配的任何资源
WSACleanup();
return 0;
}
/*====================================================================================
*
* Subroutine : GW_Scada()
*
* Parameters :
*
*
* Called from : main()
*
* Description : 调用初始化各种参数函数,启动规约线程函数
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
void GW_Scada()
{
char szStr[20];
//初始化变量
init_var();
//初始化通道变量和规约变量
Init_Channels();
Thread_func();
do
{
printf("保护管理机程序正在运行,请勿关闭此窗口程序!!!\n");
gets(szStr);
Sleep(1000);
}
while( strcmp(szStr,"quit") != 0 );
free_sys();
}
/*====================================================================================
*
* Subroutine : init_var()
*
* Parameters :
*
*
* Called from : GW_Scada()
*
* Description : 初始化变量
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
void init_var()
{
// pComm = NULL;
// pTcp103 = NULL;
for (int i=0; i<MAX_RULE; ++i)
{
pRule[i] = NULL;
}
g_bSysStop = false;
// sem_init(&sem_data,0,1);
// memset(&YX_Value, 0x00, sizeof(YX_Value));
// memset(&YC_Value, 0x00, sizeof(YC_Value));
}
/*====================================================================================
*
* Subroutine : Init_Channels()
*
* Parameters :
*
*
* Called from : GW_Scada()
*
* Description : 初始化通道变量和规约变量
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
void Init_Channels()
{
}
/*====================================================================================
*
* Subroutine : Thread_func()
*
* Parameters :
*
*
* Called from : GW_Scada()
*
* Description : 工作子线程的建立(规约线程、LonWorks读写线程等)
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
void Thread_func()
{
int i = 0;
// int i_num = 0;
unsigned long lpRule[16];
// unsigned long lpOther[16];
memset(&lpRule,0,sizeof(lpRule));
// memset(&lpOther,0,sizeof(lpOther));
for(i=0; i<MAX_RULE; i++)
{
nArg[i] = i;
hThsys[i] = CreateThread(NULL, 0, Rule_Data, &nArg[i], 0, &lpRule[i]);
}
// hThsys[0] = CreateThread (NULL, 0, NARI_Data, NULL, 0, &lpRule[0]);
// hThsys[1] = CreateThread (NULL, 0, XJ_Data104, NULL, 0, &lpOther[0]);
// hThsys[2] = CreateThread (NULL, 0, XJ_DataTCP103, NULL, 0, &lpOther[1]);
}
/*====================================================================================
*
* Subroutine : free_sys()
*
* Parameters :
*
*
* Called from : GW_Scada()
*
* Description :释放系统信息
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
void free_sys()
{
g_bSysStop = true;
// sem_destroy(&sem_data);
}
/*====================================================================================
*
* Subroutine : Rule_Data()
*
* Parameters :
*
*
* Called from : Thread_func()
*
* Description : 规约线程函数
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
DWORD WINAPI Rule_Data(LPVOID arg)
{
int facno;
int *tmp;
tmp = (int *) arg;
facno = *tmp;
if (pRule[facno] !=NULL)
{
delete pRule[facno];
pRule[facno] = NULL;
}
//创建并添加新的线程
switch(facno)
{
case RULE_CDT: //CDT规约
pRule[facno] = new CCDT(facno, 512, 512);
pRule[facno] -> RuleLoop();
break;
case RULE_ENGINEER: //103规约
pRule[facno] = new CTcp103(facno, 512, 512);
pRule[facno] -> RuleLoop();
break;
case RULE_REMOTE: //104规约
case RULE_OPERATER: //104规约
pRule[facno] = new CIEC104(facno, 512, 512);
pRule[facno] -> RuleLoop();
break;
default:
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -