📄 stipulparse.c
字号:
day1 = BCD2HEX(Rcv_Q[num].buf[3]);
hour1 = BCD2HEX(Rcv_Q[num].buf[4]);
min1 = BCD2HEX(Rcv_Q[num].buf[5]);
times1= CalculateTime(&year1, &mon1, &day1, &hour1, &min1);
if ((times0>=times1)&&
(ProgramLog[next].mp_num == tn))
{
*pt = next; // 返回符合条件的记录的序号
count ++;
pt ++;
next ++;
if (count>=Rcv_Q[num].buf[6])
{
break;
}
}
else
{
next ++;
continue;
}
}
if (count>=Rcv_Q[num].buf[6])
{
break;
}
}
}
else // 查询某一测量点
{
tn = Rcv_Q[num].buf[0];
next = 0;
while (next<60) // 找出符合条件的记录
{
year0 = BCD2HEX(ProgramLog[next].time[0]);
mon0 = BCD2HEX(ProgramLog[next].time[1]);
day0 = BCD2HEX(ProgramLog[next].time[2]);
hour0 = BCD2HEX(ProgramLog[next].time[3]);
min0 = BCD2HEX(ProgramLog[next].time[4]);
times0= CalculateTime(&year0, &mon0, &day0, &hour0, &min0);
year1 = BCD2HEX(Rcv_Q[num].buf[1]);
mon1 = BCD2HEX(Rcv_Q[num].buf[2]);
day1 = BCD2HEX(Rcv_Q[num].buf[3]);
hour1 = BCD2HEX(Rcv_Q[num].buf[4]);
min1 = BCD2HEX(Rcv_Q[num].buf[5]);
times1= CalculateTime(&year1, &mon1, &day1, &hour1, &min1);
if ((times0>=times1)&&
(ProgramLog[next].mp_num == tn))
{
*pt = next;
pt ++; // 返回符合条件的记录的序号
count ++;
next ++;
if (count>=Rcv_Q[num].buf[6])
{
break;
}
}
else
{
next ++;
continue;
}
//next ++;
}
}
return(count);
}
/*********************************************************************************************************
** 函数名称: ReadParam()
** 功能描述: 读某一项参数
**
** 输 入: *cp 测量点号
** *pbuf 保存数据的指针
**
** 输 出: 数据长度
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 ReadParam(uint8 cp,uint8 *di, uint8 *pbuf)
{
uint32 i;
uint32 offset; // 保存该数据项在数据结构中的偏移地址
uint8 attr; // 保存该数据项的属性
uint8 bnum;
uint8 *p,*pt;
uint32 len;
pt = pbuf; // 保存该数据项的长度
len = ParamIndex(cp, di, &offset, &attr, &bnum); // 读出该数据项的长度
//pt = &ParamInSram.Mp_Par[0].X8902[0]; // 测试用
p = &ParamInSram.Term_Par.X8010[0] + offset;
for (i=0;i<len;i++)
{
*pt = *p;
p ++;
pt ++;
}
return(len);
}
/*********************************************************************************************************
** 函数名称: ReadRelay()
** 功能描述: 读中继
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 0:成功 1:失败
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
typedef struct { // 接收队列数据结构
uint8 state; // 0:为空 1:有数据待处理
//uint8 *read;
//uint8 *write;
uint8 chtype; // 01:短信 02:GPRS 05:红外 06:RS232
uint8 addr[6]; // 主站通讯地址
uint8 concode; // 控制码
uint8 datalen[2]; // 数据长度
//uint16 bufsize; // 缓冲区尺寸
uint8 buf[1024]; // 数据区
//uint8 chkcode[2]; // 校验码
} RCV_QUE; // 说明:在POWERRAM.C中定义一个16的结构数组
typedef struct {
uint8 state;
uint8 count;
uint8 ch;
uint8 len;
uint8 buf[1024];
} SEND_QUE;
*/
uint8 ReadRelay(uint8 *pnum)
{
uint32 i,j;
uint32 len; // 保存该数据项的长度
uint32 len1; // 保存队列中为处理数据项及内容的长度
//uint8 *pt,*p,*pp; // 记录当前处理接收队列中位置指针
uint8 port; // 端口号
uint16 uart_bps; // 波特率
uint8 odd_even; //
uint8 stop_bit; //
uint8 datbit_len; //
uint8 buf[1024];
uint8 sendbuf[1024]; // 保存返回的数据内容及长度
uint32 sendlen;
uint32 overtime; // 超时时间
uint8 di[2];
static uint8 num;
//uint8 err;
num = *pnum;
sendlen = 0;
port = Rcv_Q[num].buf[0];
di[0] = 0x87;
di[1] = port<<4;
di[1] = di[1]&0xF0;
ReadParam(0, di, buf); // 读出波特率
uart_bps = buf[0]*300;
di[1] = di[1]|0x01;
ReadParam(0, di, buf); // 读出校验位
odd_even = buf[0];
di[1] = di[1]|0x02;
ReadParam(0, di, buf); // 读出数据位长度
datbit_len = buf[0];
di[1] = di[1]|0x03;
ReadParam(0, di, buf); // 读出停止位
stop_bit = buf[0];
CloseComm(COMM3);
OpenComm(COMM3,uart_bps,odd_even,stop_bit,datbit_len);
len = Rcv_Q[num].datalen[1];
len = len<<8;
len = len + Rcv_Q[num].datalen[0]; // 计算命令长度
len = len - 7; //
CommFlush(COMM3);
//OSMutexPend(Comm_Sem, 0, &err);
WriteComm(COMM3, &Rcv_Q[num].buf[7], len); // 发送中继命令
//OSMutexPost(Comm_Sem);
overtime = Rcv_Q[num].buf[1];
overtime = overtime*1000/5;
OSTimeDly(overtime);
len = 0;
len1= 0;
j = 0;
//OSMutexPend(Comm_Sem, 0, &err);
while(1)
{
len1 = ReadCommMs(COMM3,sendbuf,1024,40, 1000);
if (len1!=0)
{
len = len + len1;
for (i=0;i<len1;i++) // 将读到的数据放到本地接收缓冲区
{
buf[j] = sendbuf[i];
waitms(20);
}
}
else
{
break;
}
}
//OSMutexPost(Comm_Sem);
if (len==0) // 如果读到的字节数为0,返回失败
{
sendbuf[0] = 0x68; // 填写发送缓冲区
sendlen = 1;
for (i=0;i<5;i++)
{
sendbuf[i+1] = Rcv_Q[num].addr[i];
sendlen ++;
}
sendbuf[6] = Rcv_Q[num].addr[5];
sendlen ++;
sendbuf[7] = 0x68;
sendlen ++;
sendbuf[8] = Rcv_Q[num].concode | 0x80;
sendlen ++;
sendbuf[11] = Rcv_Q[num].buf[0]; // 端口号
sendlen ++;
sendbuf[12] = 0x01;
sendlen ++;
len = sendlen - 8;
sendbuf[9] = (uint8)(len);
sendbuf[10] = (uint8)(len>>8);
sendlen = sendlen + 2;
sendbuf[sendlen] = AddData(sendbuf, sendlen);
sendbuf[sendlen+1] = 0x16;
sendlen = sendlen + 2;
PushSendQue(sendbuf,sendlen, Rcv_Q[num].chtype);
return(1);
}
else
{
sendbuf[0] = 0x68; // 填写发送缓冲区
sendlen = 1;
for (i=0;i<5;i++)
{
sendbuf[i+1] = Rcv_Q[num].addr[i];
sendlen ++;
}
sendbuf[6] = Rcv_Q[num].addr[5];
sendlen ++;
sendbuf[7] = 0x68;
sendlen ++;
sendbuf[8] = Rcv_Q[num].concode | 0x80;
sendlen ++;
sendbuf[11] = Rcv_Q[num].buf[0]; // 端口号
sendlen ++;
if (Rcv_Q[num].buf[2]==0) // 不截取
{
for (i=0;i<len;i++)
{
sendbuf[sendlen] = buf[i];
sendlen ++;
}
}
else // 截取处理
{
j = 0;
for (i=0;i<len;i++)
{
if (Rcv_Q[num].buf[2]==buf[i]) // 查找与特征字节相同字节
{
len1 = Rcv_Q[num].buf[4];
len1 = len1<<8;
len1 = len1 + Rcv_Q[num].buf[3];
j = j + len1; // 计算从特征字节后多少字节开始截取
len1 = Rcv_Q[num].buf[6];
len1 = len1<<8;
len1 = len1 + Rcv_Q[num].buf[5];
for (i=0;i<len1;i++)
{
sendbuf[sendlen] = buf[j];
sendlen ++;
j ++;
}
break;
}
else
{
j ++;
}
}
}
len = sendlen - 8;
sendbuf[9] = (uint8)(len);
sendbuf[10] = (uint8)(len>>8);
sendlen = sendlen + 2;
sendbuf[sendlen] = AddData(sendbuf, sendlen);
sendbuf[sendlen+1] = 0x16;
sendlen = sendlen + 2;
PushSendQue(sendbuf,sendlen, Rcv_Q[num].chtype);
}
return(0);
}
/*****************************************************/
uint32 CalculateTime(uint8 *pyear, uint8 *pmon, uint8 *pday, uint8 *phour, uint8 *pmin)
{
uint32 times;
uint16 year;
uint8 mon;
uint8 day;
uint8 hour;
uint8 min;
uint8 i;
uint16 data;
/*year = BCD2HEX(*pyear);
mon = BCD2HEX(*pmon);
day = BCD2HEX(*pday);
hour = BCD2HEX(*phour);
min = BCD2HEX(*pmin);*/
year = (*pyear);
mon = (*pmon);
day = (*pday);
hour = (*phour);
min = (*pmin);
times = 0;
for (i=0;i<year;i++)
{
data = 2000+i;
if ((data%4)==0)
{
if ((data%100)==0)
{
if ((data%400)==0)
{
times += 366;
}
else
{
times += 365;
}
}
else
{
times += 366;
}
}
else
{
times += 365;
}
}
data = 2000+year;
if ((data%4)==0)
{
if ((data%100)==0)
{
if ((data%400)==0)
{
if (mon>2)
{
times += 29;
}
}
else
{
if (mon>2)
{
times += 28;
}
}
}
else
{
if (mon>2)
{
times += 29;
}
}
}
else
{
if (mon>2)
{
times += 28;
}
}
if (mon == 1)
{
if (mon>2)
{
times += 31;
}
}
for (i=3;i<mon;i++)
{
if ((i==4)||(i==6)||(i==9)||(i==0x0B))
{
times += 30;
}
else if ((i==3)||(i==5)||(i==7)||(i==8)||(i==0x0A)||(i==0x0C))
{
times += 31;
}
else;
}
times = times + day - 1;
times = times*24;
times = times + hour;
times = times*60;
times = times + min;
return(times);
}
unsigned int HEX2BCD(unsigned char hex_data)
{
unsigned int bcd_data;
unsigned char temp;
temp=hex_data%100;
bcd_data=((unsigned int)hex_data)/100<<8;
bcd_data=bcd_data|temp/10<<4;
bcd_data=bcd_data|temp%10;
return bcd_data;
}
unsigned int BCD2HEX(unsigned int bcd_data)
{
unsigned char temp;
temp=((bcd_data>>8)*100) + ((bcd_data>>4)*10) + (bcd_data&0x0F);
return(temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -