串口通信代码

串口通信代码
串口通信代码

串口通信代码

TMSCOMN::~TMSCOMN()

{

if(hComs != INVALID_HANDLE_VALUE)

{

CloseHandle(hComs);

hComs = INVALID_HANDLE_VALUE;

}

};

void TMSCOMN::CloseComs()

{

if(hComs != INVALID_HANDLE_VALUE)

{

CloseHandle(hComs);

hComs = INVALID_HANDLE_VALUE;

}

};

AnsiString TMSCOMN::GetComError()

{

AnsiString Errors;

if(ComReg==0) Errors = AnsiString("串口设备与串口工作良好"); else if(ComReg==1) Errors = AnsiString("串口未打开");

else Errors = AnsiString(" 串口设备与串口未连接上");

return Errors;

};

void TMSCOMN::SetRs232Coms(int NoComs,int Bps)

{

AnsiString ComNo;

DCB dcb;

COMMTIMEOUTS TimeOuts;

char str[100];

ComErr = AnsiString("");

if(hComs != INVALID_HANDLE_VALUE)

{

CloseHandle(hComs);

hComs = INVALID_HANDLE_VALUE;

}

ComNo = AnsiString("COM")+AnsiString(NoComs+1);

hComs=CreateFile(ComNo.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,0);

if(hComs == INVALID_HANDLE_VALUE)

{

ComReg = 1; ComErr = AnsiString("串口RS232未打开");

Application->MessageBoxA("串口RS232打开出错!","错误",MB_OK|MB_ICONERROR); }

else

{

GetCommState(hComs,&dcb);

if(Bps==0) dcb.BaudRate = CBR_300;

else if(Bps==1) dcb.BaudRate = CBR_1200;

else if(Bps==2) dcb.BaudRate = CBR_2400;

else if(Bps==3) dcb.BaudRate = CBR_4800;

else if(Bps==4) dcb.BaudRate = CBR_9600;

else if(Bps==5) dcb.BaudRate = CBR_19200;

else if(Bps==6) dcb.BaudRate = CBR_38400;

dcb.ByteSize = 8;

dcb.Parity = NOPARITY;

dcb.StopBits = ONESTOPBIT;

SetCommState(hComs,&dcb);

TimeOuts.ReadIntervalTimeout=0; //读间隔超时

TimeOuts.ReadTotalTimeoutMultiplier=10; //读时间系数

TimeOuts.ReadTotalTimeoutConstant=100; //读时间常量

TimeOuts.WriteTotalTimeoutMultiplier=10; //写时间系数

TimeOuts.WriteTotalTimeoutConstant=100; //写时间常数

SetCommTimeouts(hComs, &TimeOuts); // 保存设置值生效

lpOverlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

ComReg = 0;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)==0)

{

ComReg = 2;

sprintf(str,"串口%d 与设备PM300未连接上!",(NoComs+1));

ComErr = AnsiString(str);

Application->MessageBoxA(str,"错误",MB_OK|MB_ICONERROR);

}

}

};

void TMSCOMN::SetRs485Coms(int NoComs,int Bps)

AnsiString ComNo;

DCB dcb;

COMMTIMEOUTS TimeOuts;

char str[100];

ComErr = AnsiString("");

if(hComs != INVALID_HANDLE_VALUE)

{

CloseHandle(hComs);

hComs = INVALID_HANDLE_VALUE;

}

ComNo = AnsiString("COM")+AnsiString(NoComs+1);

hComs=CreateFile(ComNo.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,0);

if(hComs == INVALID_HANDLE_VALUE)

{

ComReg = 1; ComErr = AnsiString("串口RS485未打开");

Application->MessageBoxA("串口RS485打开出错!","错误",MB_OK|MB_ICONERROR); }

else

{

GetCommState(hComs,&dcb);

if(Bps==0) dcb.BaudRate = CBR_300;

else if(Bps==1) dcb.BaudRate = CBR_1200;

else if(Bps==2) dcb.BaudRate = CBR_2400;

else if(Bps==3) dcb.BaudRate = CBR_4800;

else if(Bps==4) dcb.BaudRate = CBR_9600;

else if(Bps==5) dcb.BaudRate = CBR_19200;

else if(Bps==6) dcb.BaudRate = CBR_38400;

dcb.ByteSize = 8;

dcb.Parity = NOPARITY; //MARKPARITY

dcb.StopBits = ONESTOPBIT;

SetCommState(hComs,&dcb);

TimeOuts.ReadIntervalTimeout=0; //读间隔超时

TimeOuts.ReadTotalTimeoutMultiplier=10; //读时间系数

TimeOuts.ReadTotalTimeoutConstant=100; //读时间常量

TimeOuts.WriteTotalTimeoutMultiplier=10; //写时间系数

TimeOuts.WriteTotalTimeoutConstant=100; //写时间常数

SetCommTimeouts(hComs, &TimeOuts); // 保存设置值生效

lpOverlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

ComReg = 0;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)==0)

{

ComReg = 2;

sprintf(str,"串口%d 与485设备未连接上!",(NoComs+1));

ComErr = AnsiString(str);

Application->MessageBoxA(str,"错误",MB_OK|MB_ICONERROR);

}

}

};

void TMSCOMN::SendData(char *str,int Len)

{

unsigned long lrc;

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,Len,&lrc,&lpOverlapped);

};

void TMSCOMN::GetData(char *str,int &Len)

{

COMSTAT cs;

DWORD dwError;

ClearCommError(hComs,&dwError,&cs);

dwError = cs.cbInQue;

if(cs.cbInQue>0) ReadFile(hComs,str,cs.cbInQue,&dwError,&lpOverlapped); str[dwError]=0;

Len = dwError;

};

float TMSCOMN::StrToFloat(unsigned char *Datas)

{

union{float f;unsigned char c[4];}covf;

covf.c[0] = Datas[3];

covf.c[1] = Datas[2];

covf.c[2] = Datas[1];

covf.c[3] = Datas[0];

return covf.f;

};

void TMSCOMN::GetPm300dks(int &dIks , float &dUks)

{

if(SysData.DadoNo==14 && SysData.R1Irang==0) dIks = 2000 /5;

else if(SysData.DadoNo==14 && SysData.R1Irang==1) dIks = 1500 /5;

else if(SysData.DadoNo==14 && SysData.R1Irang==2) dIks = 1000 /5;

else if(SysData.DadoNo==14 && SysData.R1Irang==3) dIks = 500 /5;

else if(SysData.DadoNo==14 && SysData.R1Irang==4) dIks = 250 /5;

else if(SysData.DadoNo==14 && SysData.R1Irang==5) dIks = 100 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==0) dIks = 4000 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==1) dIks = 3000 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==2) dIks = 2500 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==3) dIks = 2000 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==4) dIks = 1500 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==5) dIks = 1000 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==6) dIks = 500 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==7) dIks = 250 /5;

else if(SysData.DadoNo==15 && SysData.R1Irang==8) dIks = 100 /5;

else if(SysData.DadoNo==16 && SysData.R1Irang==0 && SysData.R1Way==0) dIks = 3000 /5;

else if(SysData.DadoNo==16 && SysData.R1Irang==1 && SysData.R1Way==0) dIks = 2000 /5;

else if(SysData.DadoNo==16 && SysData.R1Irang==2 && SysData.R1Way==0) dIks = 1000 /5;

else if(SysData.DadoNo==16 && SysData.R1Irang==3 && SysData.R1Way==0) dIks = 500 /5;

else if(SysData.DadoNo==16 && SysData.R1Irang==4 && SysData.R1Way==0) dIks = 250 /5;

else if(SysData.DadoNo==16 && SysData.R1Irang==5 && SysData.R1Way==0) dIks = 100 /5;

else if(SysData.DadoNo==16 && SysData.R1Irang==0 && SysData.R1Way==1) dIks = 200 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==0 && SysData.R1Way==0) dIks = 4000 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==1 && SysData.R1Way==0) dIks = 3000 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==2 && SysData.R1Way==0) dIks = 2500 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==3 && SysData.R1Way==0) dIks = 2000 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==4 && SysData.R1Way==0) dIks = 1500 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==5 && SysData.R1Way==0) dIks = 1000 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==6 && SysData.R1Way==0) dIks = 500

/5;

else if(SysData.DadoNo==17 && SysData.R1Irang==7 && SysData.R1Way==0) dIks = 250 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==8 && SysData.R1Way==0) dIks = 100 /5;

else if(SysData.DadoNo==17 && SysData.R1Irang==0 && SysData.R1Way==1) dIks = 200 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==0) dIks = 4000 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==1) dIks = 3000 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==2) dIks = 2500 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==3) dIks = 2000 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==4) dIks = 1500 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==5) dIks = 1000 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==6) dIks = 500 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==7) dIks = 250 /5;

else if(SysData.DadoNo==18 && SysData.R1Irang==8) dIks = 100 /5;

else if(SysData.DadoNo==19 && SysData.R1Irang==0) dIks = 2500 /5;

else if(SysData.DadoNo==19 && SysData.R1Irang==1) dIks = 1500 /5;

else if(SysData.DadoNo==19 && SysData.R1Irang==2) dIks = 1000 /5;

else if(SysData.DadoNo==19 && SysData.R1Irang==3) dIks = 500 /5;

else if(SysData.DadoNo==19 && SysData.R1Irang==4) dIks = 250 /5;

else if(SysData.DadoNo==19 && SysData.R1Irang==5) dIks = 100 /5;

else dIks = 1;

if(SysData.DadoNo==14) dUks =1;

else if(SysData.DadoNo==15) dUks =1;

else if(SysData.DadoNo==16 && SysData.R1Urang==0 && SysData.R1Way==0) dUks = 1; else if(SysData.DadoNo==16 && SysData.R1Urang==1 && SysData.R1Way==0) dUks = 1; else if(SysData.DadoNo==16 && SysData.R1Urang==2 && SysData.R1Way==0) dUks = 607.4/209;

else if(SysData.DadoNo==16 && SysData.R1Urang==0 && SysData.R1Way==1) dUks = 10000/100;

else if(SysData.DadoNo==16 && SysData.R1Urang==1 && SysData.R1Way==1) dUks = 6000 /600;

else if(SysData.DadoNo==17 && SysData.R1Urang==0 && SysData.R1Way==0) dUks = 1; else if(SysData.DadoNo==17 && SysData.R1Urang==1 && SysData.R1Way==0) dUks = 1; else if(SysData.DadoNo==17 && SysData.R1Urang==2 && SysData.R1Way==0) dUks = 607.4/209;

else if(SysData.DadoNo==17 && SysData.R1Urang==0 && SysData.R1Way==1) dUks = 10000/100;

else if(SysData.DadoNo==17 && SysData.R1Urang==1 && SysData.R1Way==1) dUks = 6000 /600;

else if(SysData.DadoNo==18) dUks =1;

else if(SysData.DadoNo==19) dUks =1;

else dUks =1;

};

void TMSCOMN::SetPM300UI()

{

int dIks;

float dUks;

unsigned long fbl;

COMSTAT cs;

DWORD dwError;

GetCommModemStatus(hComs,&Stats);

if(Stats&16)

{

GetPm300dks(dIks,dUks);

PurgeComm(hComs,PURGE_RXCLEAR);

strcpy(FileBuffer,":SEL:CLR\r");

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped); strcpy(FileBuffer,":SEL:CH1;:SEL:CH2;:SEL:CH3\r");

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped); strcpy(FileBuffer,":SEL:VLT;:SEL:AMP;:SEL:WAT;:SEL:FRQ\r");

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped); strcpy(FileBuffer,":CFG1,4\r");

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped); sprintf(FileBuffer,":CFG38,%.3f\r",dUks);

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped); sprintf(FileBuffer,":CFG39,%d\r",dIks);

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped); strcpy(FileBuffer,"*TRG\r");

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped); }

};

void TMSCOMN::BegPM300Data()

{

unsigned long fbl;

COMSTAT cs;

DWORD dwError;

GetCommModemStatus(hComs,&Stats);

if(ComReg==0 && (Stats&16))

{

strcpy(FileBuffer,":FRD?\r");

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped);

ComRs = 1;

}

};

void TMSCOMN::GetPM300UI(double *RData,int RsUu)

{

static int Counts;

static char str[1025],StrData[100];

int i,j,Len;

double dtemp;

COMSTAT cs;

DWORD dwError;

ZeroMemory(str,sizeof(char)*1025);

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)&&(hComs != INVALID_HANDLE_VALUE)&& ComReg==0 && ComRs == 1) {

ClearCommError(hComs,&dwError,&cs);

for(;(dwError==0)&&((Stats)&16);)

{

if(cs.cbInQue>0)

{

Counts = 0;

Len = cs.cbInQue;

for(i=0;i

{

ReadFile(hComs,&(FileBuffer[i]),1,&dwError,&lpOverlapped);

if(FileBuffer[i]=='\r') { FileBuffer[i+1]=0; break; }

}

FileBuffer[Len] = 0;

strcat(str,FileBuffer);

if(FileBuffer[i]=='\r') break;

}

else

{

Sleep(50);

Counts++;

if(Counts > 69) {ResetPm300(); SetPM300UI(); Counts =0; return;}

}

ClearCommError(hComs,&dwError,&cs);

GetCommModemStatus(hComs,&Stats);

}

ComReg=0;

ComErr = AnsiString("");

}

else if(ComReg==0 )

{

ComReg=2;

ComErr = AnsiString("串口Rs232与Pm300断开连接");

MainF->DisplayHint(NULL);

}

//RData[0] = 230; RData[4] = 230; RData[8] = 230; RData[15] = 230; RData[12] = 50; //RData[3] = 0.9; RData[7] = 0.9; RData[11]= 0.9; RData[14] = 0.9;

if(ComReg!=0 ) return;

Len=strlen(str);

for(i=0,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[2] = atof(StrData)/1000.0;// * SysData.AcLa / 5000;

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[6] = atof(StrData)/1000.0;// * SysData.AcLb / 5000;

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[10] = atof(StrData)/1000.0;// * SysData.AcLc / 5000;

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[0] = atof(StrData);

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[4] = atof(StrData);

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[8] = atof(StrData);

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[1] = atof(StrData);// * SysData.AcLa / 5;

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[5] = atof(StrData);// * SysData.AcLb / 5;

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

RData[9] = atof(StrData);// * SysData.AcLc / 5;

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

if(RsUu==1 || RsUu==4) RData[12] = atof(StrData);

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

if(RsUu==2) RData[12] = atof(StrData);

if(RsUu==4) RData[12] = RData[12] + atof(StrData);

for(i++,j=0;i

if(str[i]!='\r'&&str[i]!=',') StrData[j++]=str[i]; else break;

StrData[j]=0;

if(RsUu==3) RData[12] = atof(StrData);

if(RsUu==4) RData[12] = (RData[12] + atof(StrData))/3.0;

dtemp = RData[0]*RData[1];

if(dtemp>0.0001) RData[3] = RData[2]*1000/dtemp;

else RData[3] = 1;

dtemp = RData[4]*RData[5];

if(dtemp>0.0001) RData[7] = RData[6]*1000/dtemp;

else RData[7] = 1;

dtemp = RData[8]*RData[9];

if(dtemp>0.0001) RData[11] = RData[10]*1000/dtemp;

else RData[11] = 1;

if(RData[3] > 1) RData[3] =1; else if(RData[3] < -1) RData[3] =-1;

if(RData[7] > 1) RData[7] =1; else if(RData[7] < -1) RData[7] =-1;

if(RData[11]> 1) RData[11]=1; else if(RData[11]< -1) RData[11]=-1;

if(SysData.R1Udx == 2)

{

if(RsUu==1) {RData[17]=RData[0]*RData[1]/1000.0; RData[13]=RData[2]; RData[14]=RData[3]; RData[15]=RData[0];}

else if(RsUu==2) {RData[17]=RData[4]*RData[5]/1000.0; RData[13]=RData[6]; RData[14]=RData[7]; RData[15]=RData[4];}

else if(RsUu==3) {RData[17]=RData[8]*RData[9]/1000.0; RData[13]=RData[10]; RData[14]=RData[11]; RData[15]=RData[8];}

else if(RsUu==4) {RData[17]=RData[0]*RData[1]/1000.0; RData[13]=RData[2];

RData[14]=RData[3]; RData[15]=RData[0];}

}

else

{

RData[13] = RData[2] + RData[6] + RData[10];

RData[14] = (RData[3] + RData[7] + RData[11])/3.0;

RData[15] = (RData[0] + RData[4] + RData[8] )/3.0;

RData[17] = (RData[0]*RData[1] + RData[4]*RData[5] + RData[8]*RData[9])/1000.0; }

RData[28] = sqrt(fabs(RData[17]*RData[17] - RData[13]*RData[13]));

RData[24] = SysData.R1Ux; RData[25] = SysData.R1Fr;

RData[26] = SysData.R1Ur; RData[27] = SysData.R1Pr;

RData[31] = SysData.R1PF;

};

void TMSCOMN::ClearPm300Data(double *RData)

{

RData[0] = 0; RData[1] = 0; RData[2] = 0; RData[3] = 1;

RData[4] = 0; RData[5] = 0; RData[6] = 0; RData[7] = 1;

RData[8] = 0; RData[9] = 0; RData[10]= 0; RData[11]= 1;

RData[12]= 0; RData[13]= 0; RData[14]= 1; RData[15]= 0;

RData[17]= 0; RData[28]= 0;

};

void TMSCOMN::ResetPm300()

{

int dIks;

float dUks;

unsigned long fbl;

COMSTAT cs;

DWORD dwError;

GetCommModemStatus(hComs,&Stats);

if(Stats&16)

{

PurgeComm(hComs,PURGE_TXCLEAR);

PurgeComm(hComs,PURGE_RXCLEAR);

PurgeComm(hComs,PURGE_TXABORT);

PurgeComm(hComs,PURGE_RXABORT);

Sleep(100);

strcpy(FileBuffer,":DVC\r");

WriteFile(hComs,FileBuffer,strlen(FileBuffer),&fbl,&lpOverlapped);

Sleep(3000);

}

};

bool TMSCOMN::SetZW1401dUk(unsigned char Base,float dUK)

{

unsigned char str[102];

unsigned long lrc;

COMSTAT cs;

DWORD dwError;

union{unsigned short i;unsigned char c[2];}cov;

union{float f;unsigned char c[4];}covf;

bool BoolT = false;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)&&(hComs != INVALID_HANDLE_VALUE)&& ComReg==0) { ///设置电压倍率系数 0x1f00 str[0] = Base; str[1] = 0x16;

str[2] = 0x1F; str[3] = 0x00; //寄存器地址

str[4] = 0x00; str[5] = 0x02; //寄存器个数

str[6] = 0x04; //寄存器字节个数

covf.f = dUK;

str[7] = covf.c[3];

str[8] = covf.c[2];

str[9] = covf.c[1];

str[10]= covf.c[0];

cov.i=CRC16(str,11);

str[11] = cov.c[1]; str[12] = cov.c[0];

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,13,&lrc,&lpOverlapped);

Sleep(100);

ZeroMemory(str,100);

ClearCommError(hComs,&dwError,&cs);

ReadFile(hComs,str,cs.cbInQue,&dwError,&lpOverlapped);

if(cs.cbInQue == 8 && str[0]==Base && str[1]==0x16)

{

cov.i=CRC16(str,6);

if(str[6] == cov.c[1] && str[7] == cov.c[0]) BoolT = true; }

}

return BoolT;

};

bool TMSCOMN::GetZW1401dUV(unsigned char Base, double &dUs) {

unsigned char str[102];

unsigned long lrc;

COMSTAT cs;

DWORD dwError;

union{unsigned short i;unsigned char c[2];}cov;

double dtemp;

bool BoolT = false;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)&&(hComs != INVALID_HANDLE_VALUE)&& ComReg==0) {

str[0] = Base; str[1] = 0x03;

str[2] = 0x10; str[3] = 0x00;

str[4] = 0x00; str[5] = 0x02;

cov.i=CRC16(str,6);

str[6] = cov.c[1]; str[7] = cov.c[0];

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,8,&lrc,&lpOverlapped);

Sleep(100);

ZeroMemory(str,100);

ClearCommError(hComs,&dwError,&cs);

ReadFile(hComs,str,cs.cbInQue,&dwError,&lpOverlapped);

if(cs.cbInQue == 9 && str[0]== Base && str[1]==0x03)

{

cov.i=CRC16(str,7);

if(str[7] == cov.c[1] && str[8] == cov.c[0])

{

dUs = StrToFloat(&(str[3])); // 线电压

BoolT = true;

}

}

}

return BoolT;

};

bool TMSCOMN::SetZW1402dIk(unsigned char Base,float dIK)

{

unsigned char str[102];

unsigned long lrc;

COMSTAT cs;

DWORD dwError;

union{unsigned short i;unsigned char c[2];}cov;

union{float f;unsigned char c[4];}covf;

bool BoolT = false;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)&&(hComs != INVALID_HANDLE_VALUE)&& ComReg==0) { ///设置电流倍率系数 0x1f02 str[0] = Base; str[1] = 0x16;

str[2] = 0x1F; str[3] = 0x02; //寄存器地址

str[4] = 0x00; str[5] = 0x02; //寄存器个数

str[6] = 0x04; //寄存器字节个数

covf.f = dIK;

str[7] = covf.c[3];

str[8] = covf.c[2];

str[9] = covf.c[1];

str[10]= covf.c[0];

cov.i=CRC16(str,11);

str[11] = cov.c[1]; str[12] = cov.c[0];

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,13,&lrc,&lpOverlapped);

Sleep(100);

ZeroMemory(str,100);

ClearCommError(hComs,&dwError,&cs);

ReadFile(hComs,str,cs.cbInQue,&dwError,&lpOverlapped);

if(cs.cbInQue == 8 && str[0]==Base && str[1]==0x16)

{

cov.i=CRC16(str,6);

if(str[6] == cov.c[1] && str[7] == cov.c[0]) BoolT = true; }

}

return BoolT;

};

bool TMSCOMN::GetZW1402dIA(unsigned char Base, double &dIs) {

unsigned char str[102];

unsigned long lrc;

COMSTAT cs;

DWORD dwError;

union{unsigned short i;unsigned char c[2];}cov;

double dtemp;

bool BoolT = false;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)&&(hComs != INVALID_HANDLE_VALUE)&& ComReg==0)

{

str[0] = Base; str[1] = 0x03;

str[2] = 0x10; str[3] = 0x02;

str[4] = 0x00; str[5] = 0x02;

cov.i=CRC16(str,6);

str[6] = cov.c[1]; str[7] = cov.c[0];

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,8,&lrc,&lpOverlapped);

Sleep(100);

ZeroMemory(str,100);

ClearCommError(hComs,&dwError,&cs);

ReadFile(hComs,str,cs.cbInQue,&dwError,&lpOverlapped);

if(cs.cbInQue == 9 && str[0]== Base && str[1]==0x03)

{

cov.i=CRC16(str,7);

if(str[7] == cov.c[1] && str[8] == cov.c[0])

{

dIs = StrToFloat(&(str[3])); // 中线电流

BoolT = true;

}

}

}

return BoolT;

};

bool TMSCOMN::SetZW5433dUIk(unsigned char Base, float dUk, float dIk)

{

unsigned char str[102];

unsigned long lrc;

COMSTAT cs;

DWORD dwError;

union{unsigned short i;unsigned char c[2];}cov;

union{float f;unsigned char c[4];}covf;

bool BoolT1 = false , BoolT2 = false;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)&&(hComs != INVALID_HANDLE_VALUE)&& ComReg==0)

{ ///设置电压与电流倍率系数 0x1f00 0x1f02 str[0] = Base; str[1] = 0x16;

str[2] = 0x1F; str[3] = 0x00; //寄存器地址

str[4] = 0x00; str[5] = 0x02; //寄存器个数

str[6] = 0x04; //寄存器字节个数

covf.f = dUk; //设置电压倍率系数 0x1f00

str[7] = covf.c[3];

str[8] = covf.c[2];

str[9] = covf.c[1];

str[10]= covf.c[0];

cov.i=CRC16(str,11);

str[11] = cov.c[1]; str[12] = cov.c[0];

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,13,&lrc,&lpOverlapped);

Sleep(100);

ZeroMemory(str,100);

ClearCommError(hComs,&dwError,&cs);

ReadFile(hComs,str,cs.cbInQue,&dwError,&lpOverlapped);

if(cs.cbInQue == 8 && str[0]==Base && str[1]==0x16)

{

cov.i=CRC16(str,6);

if(str[6] == cov.c[1] && str[7] == cov.c[0]) BoolT1 = true; }

str[0] = Base; str[1] = 0x16;

str[2] = 0x1F; str[3] = 0x02; //寄存器地址

str[4] = 0x00; str[5] = 0x02; //寄存器个数

str[6] = 0x04; //寄存器字节个数

covf.f = dIk; //设置电流倍率系数 0x1f02

str[7] = covf.c[3];

str[8] = covf.c[2];

str[9] = covf.c[1];

str[10]= covf.c[0];

cov.i=CRC16(str,11);

str[11] = cov.c[1]; str[12] = cov.c[0];

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,13,&lrc,&lpOverlapped);

Sleep(100);

ZeroMemory(str,100);

ClearCommError(hComs,&dwError,&cs);

ReadFile(hComs,str,cs.cbInQue,&dwError,&lpOverlapped);

if(cs.cbInQue == 8 && str[0]==Base && str[1]==0x16)

{

cov.i=CRC16(str,6);

if(str[6] == cov.c[1] && str[7] == cov.c[0]) BoolT2 = true; }

}

return (BoolT1 && BoolT2);

};

bool TMSCOMN::GetZW5433dPQ(unsigned char Base, double &dPs, double &dQs) {

unsigned char str[102];

unsigned long lrc;

COMSTAT cs;

DWORD dwError;

union{unsigned short i;unsigned char c[2];}cov;

double dtemp;

bool BoolT = false;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)&&(hComs != INVALID_HANDLE_VALUE)&& ComReg==0)

{

str[0] = Base; str[1] = 0x03;

str[2] = 0x16; str[3] = 0x14;

str[4] = 0x00; str[5] = 0x06;

cov.i=CRC16(str,6);

str[6] = cov.c[1]; str[7] = cov.c[0];

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,8,&lrc,&lpOverlapped);

Sleep(100);

ZeroMemory(str,100);

ClearCommError(hComs,&dwError,&cs);

ReadFile(hComs,str,cs.cbInQue,&dwError,&lpOverlapped);

if(cs.cbInQue == 17 && str[0]==Base && str[1]==0x03)

{

cov.i=CRC16(str,15);

if(str[15] == cov.c[1] && str[16] == cov.c[0])

{

dPs = StrToFloat(&(str[3])) /1000.0; // 并联总有功

dQs = StrToFloat(&(str[11]))/1000.0; // 并联总无功

BoolT = true;

}

}

}

return BoolT;

};

void TMSCOMN::OutSideSend(double dU,double dI,double df,double dP)

{

int i,IdU,IdF,IdA,IdP;

unsigned char str[255];

unsigned long lrc;

GetCommModemStatus(hComs,&Stats);

if(((Stats)&16)&&(hComs != INVALID_HANDLE_VALUE)&& ComReg==0)

{

if(dU>999.9) IdU = dU/100.0;

else IdU = dU*10;

IdA = dI;

IdF = df*10;

IdP = dP;

if((dU*10 - IdU)>0.5) IdU++;

if((dI - IdA)>0.5) IdA++;

if((df*10 - IdF)>0.5) IdF++;

if((dP - IdP)>0.5) IdP++;

if(IdU<0 || IdU>9999) IdU = 0;

if(IdA<0 || IdA>9999) IdA = 0;

if(IdF<0 || IdF>9999) IdF = 0;

if(IdP<0 || IdP>9999) IdP = 0;

ZeroMemory(str,sizeof(char)*250);

sprintf(str,":%04d%04d%04d%04d;",IdF,IdU,IdA,IdP);

str[0] = 0xFF;

for(i=1;i<17;i++) str[i]= str[i] - 0x30;

str[1] = (str[1]<<4) + (str[2] & 0x0F);

str[2] = (str[3]<<4) + (str[4] & 0x0F);

str[3] = (str[5]<<4) + (str[6] & 0x0F);

str[4] = (str[7]<<4) + (str[8] & 0x0F);

str[5] = (str[9]<<4) + (str[10] & 0x0F);

str[6] = (str[11]<<4)+ (str[12] & 0x0F);

str[7] = (str[13]<<4)+ (str[14] & 0x0F);

str[8] = (str[15]<<4)+ (str[16] & 0x0F);

str[9] = (str[1]+str[2] + str[3]+str[4] + str[5]+str[6] + str[7]+str[8]) & 0x7F;

PurgeComm(hComs,PURGE_RXCLEAR);

WriteFile(hComs,str,10,&lrc,&lpOverlapped);

Sleep(50);

} };

相关主题
相关文档
最新文档