📄 phonerecord.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,°ree,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 + -