📄 cmdproc.cpp
字号:
EndQueryTime[0] = (CmdDataBuf[13]-48)*10 + CmdDataBuf[14]-48;
EndQueryTime[1] = (CmdDataBuf[15]-48)*10 + CmdDataBuf[16]-48;
EndQueryTime[2] = (CmdDataBuf[17]-48)*10 + CmdDataBuf[18]-48;
EndQueryTime[3] = 0x17; //把截至时间的小时数设为23
EndQueryTime[4] = 0x3B; //把截至时间的分钟数设为59
EndQueryTime[5] = '\0';
////////////////////////////////////////////////////////////////////////////////////////////////////
while(1)
{
//从文件中读取满足要求的数据
//i==-1: Cannot open file
//i==-2: no match data
//i==-3: This file has no data
value_of_return = ReadOldWaterLevelData( "Water.dat", StartQueryTime, EndQueryTime );
//if(GetKPState==LOCK) printf(" value_of_return = %d\n", value_of_return);
//if(GetKPState==LOCK) printf(" readfilecnt = %d\n", readfilecnt);
if(value_of_return==0) readfilecnt++;
else if(value_of_return==-2)
{
if(readfilecnt>=1)
{
if(GetKPState==LOCK) printf("readfilecnt=%d\n",readfilecnt);
break; //至少有一条满足要求的记录,并且找到文件的末尾
}
else
{
Ack_single_center_command(CmdDataBuf[3], 0x84, center);
return 0;
}
}
else
{
Ack_Wrong_ReadHistroyData( CmdDataBuf[3], center );
return 0;
}
///////////////////////////////////////在应答历史数据中添加时间信息
GetTmpTimeInfo( PutOutTemBuff, 0x02, sum_datalen );
/////////////////////////////////////////////添加时间结束
PutOutTemBuff[17+sum_datalen]= 0x20; //添加空格符
//////////////////////////添加水情数据种类标识符
type_byte_len = Add_data_type_flag( PutOutTemBuff, CmdDataBuf[3], Ivtime[1], sum_datalen );
////////////////添加水情数据种类标识符结束
PutOutTemBuff[18+sum_datalen+type_byte_len]= 0x20; //添加空格符
//////////////////////////////////
history_data_len = strlen(OutWaterLevelregdata.water_level);
TemDataBuff = OutWaterLevelregdata.water_level;
for(j=0; j<history_data_len; j++)
{
//存放采集的数值,字符型数据格式
PutOutTemBuff[19+sum_datalen+type_byte_len+j]= TemDataBuff[j];
}
PutOutTemBuff[19 + sum_datalen + type_byte_len + history_data_len]= 0x20; //添加空格符
PutOutTemBuff[20 + sum_datalen + type_byte_len + history_data_len]= 0x4E; //添加固定格式的数据域结束字符
PutOutTemBuff[21 + sum_datalen + type_byte_len + history_data_len]= 0x4E; //添加固定格式的数据域结束字符
datalen = 21-7+1 + type_byte_len + history_data_len; //每小段完整的数据包的长度
sum_datalen += datalen;
if(sum_datalen>976)
{
Ifdataoverflg = -1;
PutOutTemBuff[5]= 0xA4; //上报历史数据的功能码,表示有后续帧
break;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//数据域的长度为PutOutTemBuff[6]*8个字节(包括0x00填充字节)
if((sum_datalen%8)==0) PutOutTemBuff[6] = sum_datalen/8;
else PutOutTemBuff[6] = sum_datalen/8 + 1;
num_of_fill_byte = PutOutTemBuff[6]*8 - sum_datalen;
for(i=0; i<num_of_fill_byte;i++)
PutOutTemBuff[7 + sum_datalen + i] = 0x00; //填充0x00字节
/////////////////////////////计算校验和
cs_bytecount = PutOutTemBuff[6]*8 + 7;
for( k=0; k < cs_bytecount; k++ )
checksum += PutOutTemBuff[k];
PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR; //帧结束标志
//////////////////////////////招测数据打包结束
PutOutTemBuff[cs_bytecount+2]= '\0';
i = Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
if(i<0) Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
return Ifdataoverflg;
}
//加报数据
int Up_Alarm_transfer_data( unsigned char *GetInDataBuff, unsigned char typeofdata, unsigned char center, int rfivtime )
{
int r;
int num,len;
unsigned char checksum = 0;
unsigned char cs_bytecount;
unsigned char i,j,k;
int type_byte_len=0;
unsigned char real_len_of_data_region;
unsigned char num_of_fill_byte;
unsigned char *PutOutTemBuff;
PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
/////////////////////////加报数据的固定格式
PutOutTemBuff[0]= 0x68;
PutOutTemBuff[1]= DTUAddress[0];
PutOutTemBuff[2]= DTUAddress[1];
PutOutTemBuff[3]= typeofdata;
PutOutTemBuff[4]= 0x68;
PutOutTemBuff[5]= 0x94; //加报数据的功能码
GetTmpTimeInfo( PutOutTemBuff, typeofdata, 0 );
PutOutTemBuff[17]= 0x20; //添加空格符
////////////////////////////////添加水情数据种类标识符
type_byte_len = Add_data_type_flag( PutOutTemBuff, typeofdata, rfivtime, 0 );
////////////////////////添加水情数据种类标识符结束
PutOutTemBuff[18+type_byte_len]= 0x20; //添加空格符
//////////////////////////////////
len = strlen(GetInDataBuff);
//if(GetKPState==LOCK) printf("len = %d\n", len);
for(j=0; j<len; j++)
{
//存放采集的数值,字符型数据格式
PutOutTemBuff[19+type_byte_len+j]= GetInDataBuff[j];
}
PutOutTemBuff[19+type_byte_len+len]= 0x20; //添加空格符
PutOutTemBuff[20+type_byte_len+len]= 0x4E; //添加固定格式的数据域结束字符
PutOutTemBuff[21+type_byte_len+len]= 0x4E; //添加固定格式的数据域结束字符
real_len_of_data_region = 15+type_byte_len+len; //数据域的长度,<=24个字节
PutOutTemBuff[6] = 3; //数据域的长度3*8个字节
num_of_fill_byte = 24-real_len_of_data_region;
for(k=0; k<num_of_fill_byte; k++)
PutOutTemBuff[7 + real_len_of_data_region + k]= 0x00;
/////////////////////////////计算校验和
cs_bytecount = PutOutTemBuff[6]*8 + 7;
for( i=0; i < cs_bytecount; i++ )
checksum += PutOutTemBuff[i];
PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR; //帧结束标志
//////////////////////////////加报数据打包结束
PutOutTemBuff[cs_bytecount+2]= '\0';
r = Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
return r;
}
char AlarmTimeBuff[6];
void GetTmpTimeInfo(unsigned char *PutOutTemBuff, unsigned char typeofdata, int offset )
{
int i;
unsigned char timebuff[10];
char string[10];
if(0x01==(typeofdata&0x0f))
{
for(i=0; i<6; i++)
timebuff[i] = OutRainfallregdata.time[i];
}
else if(0x02==(typeofdata&0xf))
{
for(i=0; i<6; i++)
timebuff[i] = OutWaterLevelregdata.time[i];
}
else
{
for(i=0; i<6; i++)
timebuff[i] = AlarmTimeBuff[i];
}
///////////////////////////////////////在应答历史数据中添加时间信息
//添加年
itoa(timebuff[0],string,10); //把整型转换成十进制字符型,存放在string字符串中
if(strlen(string)<2)
{
PutOutTemBuff[7+offset]='0'; //月份少于两个字节前面补零
PutOutTemBuff[8+offset]= string[0];
}
else
{
PutOutTemBuff[7+offset]= string[0];
PutOutTemBuff[8+offset]= string[1];
}
//添加月份
itoa(timebuff[1],string,10); //把整型转换成十进制字符型,存放在string字符串中
if(strlen(string)<2)
{
PutOutTemBuff[9+offset]='0'; //月份少于两个字节前面补零
PutOutTemBuff[10+offset]= string[0];
}
else
{
PutOutTemBuff[9+offset]= string[0];
PutOutTemBuff[10+offset]= string[1];
}
//添加日期
itoa(timebuff[2],string,10); //把整型转换成十进制字符型,存放在string字符串中
if(strlen(string)<2)
{
PutOutTemBuff[11+offset]='0'; //日期少于两个字节前面补零
PutOutTemBuff[12+offset]= string[0];
}
else
{
PutOutTemBuff[11+offset]= string[0];
PutOutTemBuff[12+offset]= string[1];
}
//添加小时
itoa(timebuff[3],string,10); //把整型转换成十进制字符型,存放在string字符串中
if(strlen(string)<2)
{
PutOutTemBuff[13+offset]='0'; //小时数少于两个字节前面补零
PutOutTemBuff[14+offset]= string[0];
}
else
{
PutOutTemBuff[13+offset]= string[0];
PutOutTemBuff[14+offset]= string[1];
}
//添加分钟
itoa(timebuff[4],string,10); //把整型转换成十进制字符型,存放在string字符串中
if(strlen(string)<2)
{
PutOutTemBuff[15+offset]='0'; //分钟数少于两个字节前面补零
PutOutTemBuff[16+offset]= string[0];
}
else
{
PutOutTemBuff[15+offset]= string[0];
PutOutTemBuff[16+offset]= string[1];
}
/////////////////////////////////////////////添加时间结束
}
//void SaveTmpTime( unsigned char *TmpTimeBuff )
void GetSystemTime( unsigned char *TmpTimeBuff )
{
struct time t;
struct date d;
getdate( &d ); //取系统的时间
gettime( &t );
TmpTimeBuff[0] = d.da_year-2000; //把当前年的值赋值给time成员的第1个元素
TmpTimeBuff[1] = d.da_mon; //把当前月的值赋值给time成员的第2个元素
TmpTimeBuff[2] = d.da_day; //把当前天的值赋值给time成员的第3个元素
TmpTimeBuff[3] = t.ti_hour; //把当前小时的值赋值给time成员的第4个元素
TmpTimeBuff[4] = t.ti_min; //把当前分钟的值赋值给time成员的第5个元素
TmpTimeBuff[5] = '\0'; //把字符串结束符的值赋值给time成员的第6个元素
}
int FunctionAlarm( int alarmtype, int typeofdata )
{
unsigned char checksum = 0;
unsigned char cs_bytecount;
unsigned char i;
unsigned char *PutOutTemBuff;
unsigned char len;
char string[10];
PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
/////////////////////////加报数据的固定格式
PutOutTemBuff[0]= 0x68;
PutOutTemBuff[1]= DTUAddress[0];
PutOutTemBuff[2]= DTUAddress[1];
PutOutTemBuff[3]= 0x00;
PutOutTemBuff[4]= 0x68;
PutOutTemBuff[5]= 0x95; //加报数据的功能码
PutOutTemBuff[6] = 2; //数据域的长度2*8个字节
GetTmpTimeInfo( PutOutTemBuff, typeofdata, 0 );
PutOutTemBuff[17]= 0x30;
itoa(alarmtype,string,10); //把整型转换成十进制字符型,存放在string字符串中
len = strlen(string);
if(len<2)
{
PutOutTemBuff[18]= 0x30;
PutOutTemBuff[19]= string[0];
}
else
{
PutOutTemBuff[18]= string[0];
PutOutTemBuff[19]= string[1];
}
PutOutTemBuff[20]= 0x00; //添加空格符
PutOutTemBuff[21]= 0x00; //添加空格符
PutOutTemBuff[22]= 0x00; //添加空格符
/////////////////////////////计算校验和
cs_bytecount = PutOutTemBuff[6]*8 + 7;
for( i=0; i < cs_bytecount; i++ )
checksum += PutOutTemBuff[i];
PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR; //帧结束标志
//////////////////////////////加报数据打包结束
PutOutTemBuff[cs_bytecount+2]= '\0';
//Send_to_Svr(PutOutTemBuff,cs_bytecount+2); //向应用端发送数据
if(TCPManager[0]->GetConnState( )==OPEN)
Send_to_Single_Svr( PutOutTemBuff, APPSERVER1, cs_bytecount+2 );
if(TCPManager[1]->GetConnState( )==OPEN)
Send_to_Single_Svr( PutOutTemBuff, APPSERVER2, cs_bytecount+2 );
return 1;
}
int Modify_DC_para( unsigned char *CmdDataBuf )
{
unsigned char i;
unsigned char GetInBuf[30];
for(i=0; i<20; i++)
GetInBuf[i]=CmdDataBuf[7+i];
GetInBuf[20]='\0';
strcpy( CenterName, GetInBuf );
for(i=0; i<20; i++)
GetInBuf[i]=CmdDataBuf[27+i];
GetInBuf[20]='\0';
strcpy( StationName, GetInBuf );
for(i=0; i<11; i++)
GetInBuf[i]=CmdDataBuf[47+i];
GetInBuf[11]='\0';
strcpy( SIMNum, GetInBuf );
return 1;
}
int Save_DC_para( )
{
int i1,i2,i3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -