串口通信代码
串口通信代码
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); } };