📄 stipulparse.c
字号:
static uint8 par[2]; // 用来保存临时参数
uint8 uc_data;
//uint8 buf[256];
uint8 sendbuf[1024]; // 保存返回的数据内容及长度
uint32 sendlen;
uint16 mp_flag,mp; // 测量点标志
uint8 iseq; // 帧内序号
static uint8 num;
static uint32 ii;
num = *pnum;
sendlen = 0;
iseq = 0;
mp_flag = Rcv_Q[num].buf[1]; // 取测量点标志
mp_flag = mp_flag << 8;
mp_flag = mp_flag + Rcv_Q[num].buf[0];
if ((mp_flag&0x01FF)==0)
{
return(1);
}
for (ii=0;ii<9;ii++) // 查询9个测量点
{//*
mp = mp_flag;
mp_flag = mp_flag >> 1;
len1 = Rcv_Q[num].datalen[1];
len1 = len1<<8;
len1 = len1 + Rcv_Q[num].datalen[0]; // 计算数据项及内容长度
len1 = len1 - 8; // 计算数据项及内容长度
pt = &Rcv_Q[num].buf[8]; // 把接收队列中第一个数据项的位置付给该指针
if ((mp&0x01) == 1) // 测量点有效,进行处理
{//**
while (len1>=2)
{//***
//----------------------------------------------
len1 = len1 - 2;
par[1] = *pt;
pt ++;
par[0] = *pt;
pt ++;
if ((par[0]>=0x80) && (par[0]<=0x89)) // 读参数
{
len = ParamIndex(ii, par,
&offset, &attr, &bnum); // 读出该数据项的长度
}
else if ((par[0]>=0x90) && (par[0]<=0xC3) // 读测量点数据
|| (par[0]==0x8E))
{
len = CurDataIndex(par, &offset); // 读出该数据项的长度;
}
else // 读极值类数据
{
len = ExtrDataIndex(par, &offset); // 读极值类数据长度
}
//-----------------------------------------------
if (len>0) // 有该数据项
{//****
if (Rcv_Q[num].chtype == 0x01) // 如果是短信通道
{
if ((sendlen+len)>(140-13-8))
{
iseq = 1;
WriteSendBuf(&num, sendbuf, &sendlen, &iseq);
iseq ++;
}
}
else // 其他通道
{
if ((sendlen+len)>(1024-13-8))
{
iseq = 1;
WriteSendBuf(&num, sendbuf, &sendlen, &iseq);
iseq ++;
}
}
if ((par[0]>=0x80) && (par[0]<=0x89)) // 读参数要判断属性
{//*****
uc_data = attr & 0x0F; // 读写权限判断
if (uc_data==0x01) // 只写数据项
{
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
for (j=0;j<len;j++) // 返回0xFF
{
sendbuf[sendlen] = 0xFF;
sendlen ++;
}
}
else
{
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
p = &ParamIn.Term_Par.X8010[0] + offset;
if ((par[0]==0x81) && (par[1]>=0x01) && (par[1]<=32)) // 如果是读任务参数,特殊处理
{
pp = &sendbuf[sendlen];
for (j=0;j<len;j++) // 返回任务参数
{
*pp = *p;
sendlen ++;
p ++;
pp ++;
}
}
else
{
pp = &sendbuf[sendlen] + len - 1;
for (j=0;j<len;j++) // 返回正常内容
{
*pp = *p;
sendlen ++;
p ++;
pp --;
}
}
}
}//*****
else if ((par[0]>=0x90) && (par[0]<=0xC3) // 读测量点数据
|| (par[0]==0x8E)) // 读的不是参数不判断属性
{
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
p = &cur_data[ii].X9010[0] + offset;
pp = &sendbuf[sendlen];
for (j=0;j<len;j++) // 返回内容正常
{
*pp = *p;
//*p = 0x89;
sendlen ++;
p ++;
pp ++;
}
}
else // 读极值类数据
{
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
p = &extremdata.X8C00[0] + offset;
pp = &sendbuf[sendlen] + len - 1;
for (j=0;j<len;j++) // 返回内容正常
{
*pp = *p;
sendlen ++;
p ++;
pp --;
}
}
}//****
else // 无该数据项,不再继续处理剩余的数据
{
//sendbuf[sendlen] = par[1];
//sendlen ++;
//sendbuf[sendlen] = par[0];
//sendlen ++;
//sendbuf[sendlen] = 0x04;
//sendlen ++;
//WriteSendBuf(&num, sendbuf, &sendlen, &iseq);
return (1);
}
}//***
}//**
else // 测量点无效,继续查询下一个测量点
{
continue;
}
}//*
WriteSendBuf(&num, sendbuf, &sendlen, &iseq);
return(0);
}
/*********************************************************************************************************
** 函数名称: WriteSendBuf()
** 功能描述: 读当前数据时,用来写发送数据
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void WriteSendBuf(uint8 *pnum, uint8 *psendbuf, uint32 *psendlen, uint8 *piseq)
{
uint32 i;
uint32 sendlen;
uint8 num;
uint8 iseq;
uint8 buf[1024];
uint8 data;
num = *pnum;
sendlen = *psendlen;
iseq = *piseq;
buf[0] = 0x68; // 填写发送缓冲区
//iseq ++; // 分帧标识
iseq = iseq << 5;
data = Rcv_Q[num].addr[5];
data |= iseq;
for (i=0;i<5;i++)
{
buf[i+1] = Rcv_Q[num].addr[i];
}
buf[6] = data;
buf[7] = 0x68;
buf[8] = Rcv_Q[num].concode | 0x80;
for (i=0;i<8;i++)
{
buf[11+i]= Rcv_Q[num].buf[i];
}
//buf[11]= Rcv_Q[num].buf[0];
for (i=0;i<sendlen;i++)
{
buf[19+i] = *psendbuf;
psendbuf ++;
}
sendlen = sendlen + 8;
buf[9] = (uint8)(sendlen);
buf[10] = (uint8)(sendlen>>8);
sendlen = sendlen - 8;
buf[19+sendlen]= AddData(buf, sendlen+8+11);
buf[20+sendlen]= 0x16;
PushSendQue(buf,sendlen+8+13, Rcv_Q[num].chtype);
}
/*********************************************************************************************************
** 函数名称: ReadProgrmLog()
** 功能描述: 读编程日志
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ReadProgrmLog(uint8 *pnum)
{
uint8 i,j;
uint8 num;
uint8 buf[60];
uint8 count;
uint8 sendbuf[1024];
uint32 len,sendlen;
uint8 iseq,iseq1;
static uint8 data;
num = *pnum;
count = DealReadProgrmLog(&num, buf);
if (count>1)
{
iseq = 1;
}
else
{
iseq = 0;
}
//if (count>Rcv_Q[num].buf[6])
//{
// count = Rcv_Q[num].buf[6];
//}
for (j=0;j<count;j++)
{
sendbuf[0] = 0x68; // 填写发送缓冲区
sendlen = 1;
if (iseq>=7)
{
iseq = 1;
}
for (i=0;i<5;i++)
{
sendbuf[i+1] = Rcv_Q[num].addr[i];
sendlen ++;
}
iseq1 = iseq << 5; // 分帧标识
data = Rcv_Q[num].addr[5];
data |= iseq1;
iseq ++;
sendbuf[6] = data;
sendlen ++;
sendbuf[7] = 0x68;
sendlen ++;
sendbuf[8] = Rcv_Q[num].concode | 0x80;
sendlen ++;
data = buf[j];
sendbuf[11] = ProgramLog[data].mp_num; // 测量点号
sendlen ++;
sendbuf[12] = ProgramLog[data].time[0]; // 时间
sendlen ++;
sendbuf[13] = ProgramLog[data].time[1];
sendlen ++;
sendbuf[14] = ProgramLog[data].time[2];
sendlen ++;
sendbuf[15] = ProgramLog[data].time[3];
sendlen ++;
sendbuf[16] = ProgramLog[data].time[4];
sendlen ++;
for (i=0;i<9;i++) // 通讯通道
{
sendbuf[17+i] = ProgramLog[data].dac[i];
sendlen ++;
}
for (i=0;i< ProgramLog[data].len;i++) // 编程内容
{
sendbuf[26+i] = ProgramLog[data].buf[i];
sendlen ++;
}
len = sendlen - 8 - 1;
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);
// 无符合条件的记录如何处理?加一个找到记录的标志
}
/*********************************************************************************************************
** 函数名称: DealReadProgrmLog()
** 功能描述: 处理读编程日志
**
** 输 入: *pnum 当前处理的接收队列号
** *buf 记录符合条件的记录的序号
**
** 输 出: count记录符合条件的记录的数目
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 DealReadProgrmLog(uint8 *pnum, uint8 *pbuf)
{
uint8 i;
static uint8 num;
//uint8 buf[8];
uint8 *pt;
uint8 count;
static uint8 next;
uint8 tn;
uint8 year0,year1;
uint8 mon0,mon1;
uint8 day0,day1;
uint8 hour0,hour1;
uint8 min0,min1;
uint32 times0,times1;
num = *pnum;
pt = pbuf;
count = 0;
//uint32 CalculateTime(uint8 *pyear, uint8 *pmon, uint8 *pday, uint8 *phour, uint8 *pmin)
if (Rcv_Q[num].buf[0] == 0xFE) // 查询除0以外的测量点
{
for (i=1;i<9;i++)
{
tn = i;
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 ++;
}
if (count>=Rcv_Q[num].buf[6])
{
break;
}
}
}
else if (Rcv_Q[num].buf[0] == 0xFF) // 查询所有测量点
{
for (i=0;i<9;i++)
{
tn = i;
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]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -