📄 baserule.cpp
字号:
DWORD C_Rtimeout = 3000;
DWORD C_RtimeMilti = 20;
memcpy(&portname, m_szComm, 0); //m_szComm在config.txt中配置
ret = CommCheck(portname);
if (ret!=0)
{
return true;
}
sprintf(cportname,"\\\\.\\%s",portname);
if ((m_ComInfo[m_bComIndex].hcom =
CreateFile(cportname,
GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL))
== INVALID_HANDLE_VALUE)
{
derr = GetLastError();
return false;
}
ClearCommError(m_ComInfo[m_bComIndex].hcom,&dwerr,NULL);
derr=GetLastError();
if(derr!=0)
{
return false;
}
SetCommMask(m_ComInfo[m_bComIndex].hcom, EV_RXCHAR);
SetupComm(m_ComInfo[m_bComIndex].hcom, 1024, 1024);
derr=GetLastError();
if(derr!=0)
{
CloseHandle( m_ComInfo[m_bComIndex].hcom );
return false;
}
///////////////////////////////////////
//{
m_hCom = m_ComInfo[m_bComIndex].hcom;
m_ComInfo[m_bComIndex].flag = 1;
//}
///////////////////////////////////////
GetCommState(m_ComInfo[m_bComIndex].hcom,&dcb);
dcb.BaudRate = m_dbBaudRate; //波特率baud;
dcb.ByteSize = m_bByteSize; //数据位number of bits/byte, 4-8
dcb.Parity = m_bParity; //校验位0-4=no,odd,even,mark,space
dcb.StopBits = m_bStopBits; //停止位0,1,2 = 1, 1.5, 2
SetCommState(m_ComInfo[m_bComIndex].hcom, &dcb);
derr=GetLastError();
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0x100;
CommTimeOuts.ReadTotalTimeoutMultiplier = C_RtimeMilti;
CommTimeOuts.ReadTotalTimeoutConstant = C_Rtimeout;
CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
CommTimeOuts.WriteTotalTimeoutConstant =3000;
SetCommTimeouts(m_ComInfo[m_bComIndex].hcom, &CommTimeOuts);
derr=GetLastError();
PurgeComm(m_ComInfo[m_bComIndex].hcom,PURGE_TXCLEAR|PURGE_RXCLEAR);
return true;
}
/*====================================================================================
*
* Subroutine : CommCheck()
*
* Parameters :
*
*
* Called from : CommConnect()
*
* Description : 串口检测
*
* Return :
*
* Modification:
* 2004-11-10:
*
*====================================================================================*/
int BaseRule::CommCheck(char *sysname)
{
int i = 0;
int ret = false;
if (m_bComIndex > 0)
{//更换
m_ComInfo[m_bComIndex].flag--;
if (m_ComInfo[m_bComIndex].flag <= 0)
{
CloseHandle(m_ComInfo[m_bComIndex].hcom);
m_ComInfo[m_bComIndex].hcom = NULL;
}
m_bComIndex = 0;
}
if (m_bComIndex <= 0)
{
for (i=0; i<MAXCOMCOUNT; i++)
{
if (!strcmp(m_ComInfo[i].name, sysname))
{
m_bComIndex = i;
if (m_ComInfo[i].flag > 0)break;
}
}
if (i < MAXCOMCOUNT)
{
m_hCom = m_ComInfo[i].hcom;
m_ComInfo[i].flag ++;
ret = true;
}
}
return ret;
}
/*====================================================================================
*
* Subroutine : RS232Send()
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 写串口发送数据
*
* Return :
*
* Modification:
* 2004-11-10:
*
*====================================================================================*/
int BaseRule::RS232Send()
{
OVERLAPPED OlWRtu;
DWORD byte1,byte2=0;
BOOL waitflag;
memset(&OlWRtu,0,sizeof(OlWRtu));
OlWRtu.hEvent=NULL;
if (m_ComInfo[m_bComIndex].hcom != NULL)
{
WriteFile(m_ComInfo[m_bComIndex].hcom, m_bSendBuf, m_wSendLen, &byte1, &OlWRtu);
waitflag = GetOverlappedResult(m_ComInfo[m_bComIndex].hcom, &OlWRtu, &byte2, TRUE);
}
if( (int) byte2!=m_wSendLen)
{
byte2 = -1;
}
return byte2;
}
/*====================================================================================
*
* Subroutine : RS232Read()
*
* Parameters : nLength 读取的最大长度
*
*
* Called from : RuleLoop()
*
* Description : 读串口接收数据
*
* Return :
*
* Modification:
* 2004-11-10:
*
*====================================================================================*/
int BaseRule::RS232Read(int n)
{
OVERLAPPED OlWRtu;
DWORD byte1,byte2=0;
BOOL waitflag=FALSE;
memset(&OlWRtu,0,sizeof(OlWRtu));
OlWRtu.hEvent=NULL;
if(m_ComInfo[m_bComIndex].hcom != NULL)
{
ReadFile(m_ComInfo[m_bComIndex].hcom, m_bRevBuf, n, &byte1, &OlWRtu);
waitflag = GetOverlappedResult(m_ComInfo[m_bComIndex].hcom, &OlWRtu, &byte2, TRUE);
}
if(waitflag && byte2>0 )
{
m_wSendLen = (short)byte2;
byte2 = -1;
}
return byte2;
}
/*====================================================================================
*
* Subroutine : SetNetState()
*
* Parameters : state: 通道的状态
*
*
* Called from :
*
* Description : 设置网络状态
*
* Return :
*
* Modification:
* 2004-12-09:
*
*====================================================================================*/
void BaseRule::SetNetState(enum GateDevStatus state)
{
GateNetAddr n_addr;
g_glonet.GetNetAddr(n_addr);
switch(m_nPortNo)
{
case RULE_CDT: //CDT规约
{
break;
}
case RULE_ENGINEER: //103规约,工程师站
{
n_addr.ENGINEERNet.eNetState = state;
break;
}
case RULE_REMOTE: //104规约,远动站
{
n_addr.REMOTENet.eNetState = state;
break;
}
case RULE_OPERATER: //104规约,操作员站
{
n_addr.OPERATERNet.eNetState = state;
break;
}
default:
break;
}
g_glonet.InsNetAddr(n_addr);
}
/*====================================================================================
*
* Subroutine : GetNetAddr()
*
* Parameters : netaddr: IP和端口号对
*
*
* Called from :
*
* Description : 读取网络状态
*
* Return :
*
* Modification:
* 2004-12-11:
*
*====================================================================================*/
void BaseRule::GetNetAddr(GateIpPort &netaddr)
{
GateNetAddr n_addr;
g_glonet.GetNetAddr(n_addr);
switch(m_nPortNo)
{
case RULE_CDT: //CDT规约
{
break;
}
case RULE_ENGINEER: //103规约,工程师站
{
memcpy(&netaddr, &n_addr.ENGINEERNet, sizeof(GateIpPort));//确认OPERATENet??
break;
}
case RULE_REMOTE: //104规约,远动站
{
memcpy(&netaddr, &n_addr.REMOTENet, sizeof(GateIpPort));//确认OPERATENet??
break;
}
case RULE_OPERATER: //104规约,操作员站
{
memcpy(&netaddr, &n_addr.OPERATERNet, sizeof(GateIpPort));//确认OPERATENet??
break;
}
default:
break;
}
return;
}
/*====================================================================================
*
* Subroutine : GetGateStation()
*
* Parameters : eStation: 站类型
*
*
* Called from :
*
* Description : 读取站类型
*
* Return :
*
* Modification:
* 2004-12-24:
*
*====================================================================================*/
void BaseRule::GetGateStation(enum GateStation &eStation)
{
switch(m_nPortNo)
{
case RULE_CDT: //CDT规约
{
break;
}
case RULE_ENGINEER: //103规约,工程师站
{
eStation = GATE_ENGINEERSTATION;
break;
}
case RULE_REMOTE: //104规约,远动站
{
eStation = GATE_REMOTESTATION;
break;
}
case RULE_OPERATER: //104规约,操作员站
{
eStation = GATE_OPERATERSTATION;
break;
}
default:
break;
}
}
/*====================================================================================
*
* Subroutine : ReadConfig()
*
* Parameters :
*
*
*
* Called from : BaseRule()
*
* Description : 读取103遥信信息表
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void BaseRule::ReadConfig()
{
FILE* fp = NULL;
m_iAddress = 0;
m_iPort = 0;
memset(m_szIPAddress, 0, sizeof(char)*20);
memset(m_szComm, 0, sizeof(char)*20);
m_dbBaudRate = 9600; //波特率baud;
m_bByteSize = 8; //数据位number of bits/byte, 4-8
m_bParity = 0; //校验位0-4=no,odd,even,mark,space
m_bStopBits = 0; //停止位0,1,2 = 1, 1.5, 2
fp = fopen("config.txt", "r");
if (fp == NULL)
{
strcpy(m_szIPAddress, "10.100.100.7");
m_iAddress = 1;
m_iPort = 2403;
}
else
{
//地址
m_iAddress = GetFileValue(fp);
//IP地址
GetFileChar(fp, m_szIPAddress);
//IP端口号
m_iPort = GetFileValue(fp);
//串口地址
GetFileChar(fp, &m_szComm[0]);
//波特率baud
m_dbBaudRate = GetFileValue(fp);
//数据位number of bits/byte, 4-8
m_bByteSize = GetFileValue(fp);
//校验位0-4=no,odd,even,mark,space
m_bParity = GetFileValue(fp);
//停止位0,1,2 = 1, 1.5, 2
m_bStopBits = GetFileValue(fp);
if (fp != NULL)
{
fclose(fp);
}
}
}
/*====================================================================================
*
* Subroutine : GetFileValue()
*
* Parameters :
*
*
*
* Called from : ReadConfig()
*
* Description : 读文件数据
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
DWORD BaseRule::GetFileValue(FILE *fp)
{
int val,idx;
char szStr[80];
char szNum[20];
string s;
fscanf(fp, "%s\n", szStr); //position year
s = szStr;
idx = s.find('=');
memcpy(szNum, &szStr[idx+1], 20);
val = atoi(szNum);
return val;
}
/*====================================================================================
*
* Subroutine : GetFileChar()
*
* Parameters : FILE *fp : 读取的文件
* char* pcRead : 读到的字符内容首地址
*
*
* Called from : ReadConfig()
*
* Description : 读文件字符串
*
* Return :
*
*
* Modification:
* 2004-07-29:
*
*====================================================================================*/
void BaseRule::GetFileChar(FILE *fp, char pcRead[])
{
int idx;
char szStr[80];
string s;
fscanf(fp, "%s\n", szStr);
s = szStr;
idx = s.find('=');
memcpy(pcRead, &szStr[idx+1], 20);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -