⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phonerecord.cpp

📁 大唐SDH设备协议解析程序.获得设备当前状态.
💻 CPP
字号:
#include "stdafx.h"
#include "Afxmt.h"
#include "PlugIn.h"
#include "PhoneRecord.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//接收数据格式类型
#define YCTYPE 1
#define YXTYPE 2
#define YKTYPE 3

CPhoneRecord::CPhoneRecord()
{
	m_hcomm = INVALID_HANDLE_VALUE;
	m_ref = 1;
	m_tunnel = -1;
	m_RtuNum=0;
	m_time=0;
	m_dalay=60000;
	InitRtuInfo();    //初始化设备信息信息
	InitDb();         //初始化数据库
}

CPhoneRecord::~CPhoneRecord()
{
	
	if (m_hcomm!=INVALID_HANDLE_VALUE)
		CloseHandle(m_hcomm);
	SQLDisconnect(m_hdbc);
	SQLFreeHandle(SQL_HANDLE_DBC,m_hdbc); 
	SQLFreeHandle(SQL_HANDLE_ENV,m_henv);
	delete []alarmlist;
	delete []rtuinfo;

}

void CPhoneRecord::GetDriverVersion(char* str)
{
	strcpy(str,"DTT_SCT2500-Ver1.0");
}

void CPhoneRecord::AddRef()
{
	m_ref++;
}

void CPhoneRecord::ExcuteCmd(PRTUTASK ptask)
{
	if (m_hcomm == INVALID_HANDLE_VALUE)
		return;
}

void CPhoneRecord::SetCommHandle(HANDLE handle,DWORD tun)
{
	if (handle!=INVALID_HANDLE_VALUE) {
		m_hcomm = handle;
		}
	else {
		m_hcomm = INVALID_HANDLE_VALUE;
		}
	 
}

void CPhoneRecord::Release()
{
	m_ref--;
	if (m_ref==0)
		delete this;
}

DWORD CPhoneRecord::GetData(RTUDATA* lrtu,int numrtu,int type,BWBUFFER* bwbuf,int buflen,int& bwp,CPtrList& taskout,CPtrList& taskin)
{
	  //int serial;        //设备在初始化列表中的序列号
	  int realserial;
	  int alarmserial;   //警报序列
	  int alarmlistpos=0;
	  int rtuno;
	  int i;
	  
	  TCHAR ne[5];
	  TCHAR neid[5];      //设备ID
	  TCHAR bay[4];        
	  TCHAR card[2];
	  TCHAR content[2];
	  TCHAR yxtype[1];
	  TCHAR degree[1];
	  TCHAR card_type[2];
	  TCHAR temp[10];
	  int yxserial;
	  int loopnum=0;
	  RETCODE retcode;
	  SDWORD cbrtnum;
	  char sqlqry[200];  
	  
	  if(m_time+m_dalay<GetTickCount()){
		  m_time=GetTickCount();
		  
		  AllocStmt(); 
		  
		   sprintf(sqlqry,"select a.ne_id,a.bay,a.card,a.content,a.type,a.degree,b.card_type from fm_cur as a,mco_dev_conf as b where a.ne_id=b.ne_id and a.bay=b.subrac_addr and a.card=b.card_addr");    //进行查询
           retcode=SQLExecDirect(m_hstmt,(UCHAR *)sqlqry,SQL_NTS);
		   if(retcode!=SQL_SUCCESS&&retcode!=SQL_SUCCESS_WITH_INFO){
               SQLFreeHandle(SQL_HANDLE_STMT,m_hstmt);
			   return 0xaa;
		   }

		   for(loopnum=0;loopnum<m_RtuNum;loopnum++){
			  realserial=GetRealRtuSerial(lrtu,rtuinfo[loopnum].rtu_no);
		      for(i=0;i<lrtu[realserial].yx_count;i++){
//		          if((lrtu[realserial].yxdata[i].yx_status==1)&&(lrtu[realserial].yxdata[i].lockflag==0)){
		          if(lrtu[realserial].yxdata[i].lockflag==0){
				     lrtu[realserial].yxdata[i].yx_status=0;
                     lrtu[realserial].yxdata[i].chgflag=3;
				  }
			  } 
		   }

	       while(TRUE){
		        retcode=SQLFetch(m_hstmt);
		    	if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){
                     SQLGetData(m_hstmt,1,SQL_C_CHAR,&neid,6,&cbrtnum);
					 strcpy(ne,neid);
				     SQLGetData(m_hstmt,2,SQL_C_CHAR,&bay,5,&cbrtnum);
			         SQLGetData(m_hstmt,3,SQL_C_CHAR,&card,3,&cbrtnum);
                     SQLGetData(m_hstmt,4,SQL_C_CHAR,&content,3,&cbrtnum);
				     SQLGetData(m_hstmt,5,SQL_C_CHAR,&yxtype,2,&cbrtnum);
				     SQLGetData(m_hstmt,6,SQL_C_CHAR,&degree,2,&cbrtnum);
                     SQLGetData(m_hstmt,7,SQL_C_CHAR,&card_type,3,&cbrtnum);
				     //得到设备RTU号
				     rtuno=GetRtuno(ne);  //得到设备rtuno
					 realserial=GetRealRtuSerial(lrtu,rtuno);
                     //serial=GetRtuSerial(rtuno);   //设备在遥信数组中的位置
			         //处理看到遥信号
					 yxserial=((bay[3]-0x30)-1)*180+(((card[0]-0x30)*10+(card[1]-0x30))-1)*10;
                     
				     strcpy(temp,yxtype);               
				     strcat(temp,content);
                     alarmlistpos=GetAlarmListPos(card_type);
                     alarmserial=GetAlarmSerial(alarmlistpos,temp,degree);                          //得到警报序列
				     if(lrtu[realserial].yxdata[yxserial+9].lockflag==0){
                              lrtu[realserial].yxdata[yxserial+9].yx_status=1;
                              lrtu[realserial].yxdata[yxserial+9].chgflag=3;
					 }
					 yxserial+=alarmserial;
					 /*if(cardserial==-1||alarmserial==-1)
					     continue;*/
					 if(yxserial<lrtu[realserial].yx_count){
			              if(lrtu[realserial].yxdata[yxserial].lockflag==0){
                              lrtu[realserial].yxdata[yxserial].yx_status=1;
                              lrtu[realserial].yxdata[yxserial].chgflag=3;
						  }
					 }
				}
	            else{
					SQLFreeHandle(SQL_HANDLE_STMT,m_hstmt);
			        break;
				}
		   }
	  }
      else{
		  for(loopnum=0;loopnum<lrtu[numrtu].yx_count;loopnum++){
			  if(lrtu[numrtu].yxdata[loopnum].chgflag==3)
				  return 0xaa|YXCHANGE;
		  }
	  }

      return 0xaa;
}

BYTE CPhoneRecord::InitRtuInfo(void)    
{
    int loopnum;    //临时变量
	int i=0;
	char temp[10];
	char tmp[10];
	char serial[10];
    m_CardType=GetPrivateProfileInt("盘符信息","盘符种类",0,".\\配置文件\\alarm_table.ini");   //得到盘符种类多少
	if((!m_CardType)||(m_CardType>ALARM_NUM)){
       MessageBox(NULL,"DTT配置文件错误","Warning",MB_OK);
	   return 0;
	}

    alarmlist=new ALARMLIST[m_CardType];
	
	for(i=0;i<m_CardType;i++){
		strcpy(serial,"号盘信息");
	    wsprintf(tmp,"%d",i);
		strcat(tmp,serial);
		GetPrivateProfileString(tmp,"盘符ID","",alarmlist[i].card_id,4,".\\配置文件\\alarm_table.ini");
		//初始化告警列表
        for(loopnum=0;loopnum<8;loopnum++){
			strcpy(serial,"号告警ID");
		    wsprintf(temp,"%d",loopnum);
		    strcat(temp,serial);
            GetPrivateProfileString(tmp,temp,"",alarmlist[i].alarmflag[loopnum],4,".\\配置文件\\alarm_table.ini");
		}
	}
    //初始化站内设备列表
    
	m_RtuNum=GetPrivateProfileInt("站点","站点数量",0,".\\配置文件\\stt-2500.ini");
    rtuinfo=new RTUINFO[m_RtuNum];
    for(loopnum=0;loopnum<m_RtuNum;loopnum++){
        wsprintf(serial,"%d",loopnum);
		strcpy(temp,"站点");
		strcat(temp,serial);
		rtuinfo[loopnum].rtu_no=GetPrivateProfileInt(temp,"RTU",-1,".\\配置文件\\stt-2500.ini");
		GetPrivateProfileString(temp,"NEID","",rtuinfo[loopnum].rtu_id,6,".\\配置文件\\stt-2500.ini");
	}
	return 1;
}

void CPhoneRecord::InitDb()
{
	SQLRETURN retcode;
    //分配及设计环境句柄

	if(SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&m_henv)!=SQL_SUCCESS)
    {
		MessageBox(NULL,"分配环境句柄失败","Warning",MB_OK);
		return;
	}

	retcode = SQLSetEnvAttr(m_henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
	{
		MessageBox(NULL,"设计环境句柄出错","Warning",MB_OK);
		return;
	}
   //分配连接句柄
    retcode=SQLAllocHandle(SQL_HANDLE_DBC,m_henv,&m_hdbc);
	if(retcode!=SQL_SUCCESS && retcode!=SQL_SUCCESS_WITH_INFO)
	{
		MessageBox(NULL,"申请连接句柄出错","Warning",MB_OK);
		return;
	}
   //建立与数据源的连接
	retcode=SQLConnect(m_hdbc,(SQLCHAR*)"DTT",SQL_NTS,(SQLCHAR*)"SA",SQL_NTS,(SQLCHAR*)"",SQL_NTS);
	if(!(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)){
		MessageBox(NULL,"连接数据源失败","Warning",MB_OK);
		return;
	}
}
 
void CPhoneRecord::AllocStmt()
{
    RETCODE rtcode;
	rtcode=SQLAllocHandle(SQL_HANDLE_STMT,m_hdbc,&m_hstmt);
	if(rtcode!=SQL_SUCCESS){
		MessageBox(NULL,"申请语句句柄出错","Warning",MB_OK);
	}
}

int CPhoneRecord::GetRtuno(char* ne_id)
{
   int loopnum;
   for(loopnum=0;loopnum<m_RtuNum;loopnum++){
	   if(strcmp(rtuinfo[loopnum].rtu_id,ne_id)==0)
		   return rtuinfo[loopnum].rtu_no;
   }
   return NULL;
}

int CPhoneRecord::GetRtuSerial(int rtuno)  //设备在遥信数组中的位置
{
   int loopnum;
   for(loopnum=0;loopnum<m_RtuNum;loopnum++){
	   if(rtuinfo[loopnum].rtu_no==rtuno)
		   return loopnum;
   }
   return -1;
}


int CPhoneRecord::GetAlarmSerial(int serial,char* alarmid,char* degree)
{
    int retcode;
	int loopnum;
	
	for(loopnum=0;loopnum<8;loopnum++){
		retcode=strcmp(alarmlist[serial].alarmflag[loopnum],alarmid);
		if(retcode==0)
			return loopnum;
	}
	char a[2]={'2','\0'};
    retcode=strcmp(degree,a);
	if(retcode>0)
		return 9;   //直接返回一般告警
	return 8;     //返回其它严重告警
}

int CPhoneRecord::GetAlarmListPos(char* card_type)
{
	int loopnum;
	int retcode;
	for(loopnum=0;loopnum<m_CardType;loopnum++){
	    retcode=strcmp(alarmlist[loopnum].card_id,card_type);
        if(retcode==0)
			return loopnum;
	}
	return -1;
}

int CPhoneRecord::GetRealRtuSerial(RTUDATA* rtulist,int RtuNo)
{
    int loopnum;
	for(loopnum=0;loopnum<MAX_RTU;loopnum++){
		if(rtulist[loopnum].rtu_no==RtuNo)
			return loopnum;
	}
	return -1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -