📄 stipulparse.c
字号:
{
ParamLock += 1;
}
}
else
{
ParamLock += 1;
}
if (ParamLock==3)
{
DateTimeRead(&year, &mon, &day, &week, // 读时钟
&hour, &min, &sec);
Param_Lock_time[0] = (uint8)(year%100); // 保存锁定时间
Param_Lock_time[1] = (uint8)mon;
Param_Lock_time[2] = (uint8)day;
Param_Lock_time[3] = (uint8)hour;
Param_Lock_time[4] = (uint8)min;
ParamLock ++;
}
RetCodeErr(&num); // 返回密码权限不足
return(0);
}
/*********************************************************************************************************
** 函数名称: DealSetParam()
** 功能描述: 密码正确后的处理
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DealSetParam(uint8 *pnum)
{
uint32 i;
uint32 offset; // 保存该数据项在数据结构中的偏移地址
uint8 attr; // 保存该数据项的属性
uint8 bnum; // 保存该数据项块序号
uint32 len; // 保存该数据项的长度
static uint32 len1,len2; // 保存队列中为处理数据项及内容的长度
uint8 *pt,*p,*pp; // 记录当前处理接收队列中位置指针
uint8 par[2]; // 用来保存临时参数
uint8 uc_data;
uint8 buf[256];
static uint8 sendbuf[256],sendlen; // 保存返回的数据内容及长度
uint8 err;
static uint8 num;
num = *pnum;
sendlen = 0;
len1 = Rcv_Q[num].datalen[1];
len1 = len1<<8;
len1 = len1 + Rcv_Q[num].datalen[0]; // 计算数据项及内容长度
len1 = len1 - 5; // 计算数据项及内容长度
len2 = len1 - 2;
pt = &Rcv_Q[num].buf[5]; // 把接收队列中第一个数据项的位置付给该指针
while ((len1>2)&&(len1<1030))
{//*
par[1] = *pt;
pt ++;
par[0] = *pt;
pt ++;
len = ParamIndex(Rcv_Q[num].buf[0], par, &offset, &attr, &bnum); // 读出该数据项的长度
if (len>0) // 有该数据项
{//**
//pt = pt + len;
len1 = len1 - len - 2;
uc_data = attr>>4;
if (((Rcv_Q[num].buf[1]&0x0F)+1)>=uc_data) // 密码权限判断
{//***
uc_data = attr & 0x0F; // 读写权限判断
if (uc_data==0x00)
{
err = 0x02; // 返回设置内容非法
}
else
{
err = 0x00; // 返回设置内容正常
}
if (par[0]==0x80 &&
((par[1]<0x16) || (par[1]==0x1F))) // 判断与GPRS相关的参数是否有变
{
GprsManagPar.flag = 0x01; // 如果有变,置标志位,由GPRS管理任务处理
}
if ((par[0]==0x80) && (par[1]==0x16)) // 判断终端地市区县码
{
TermAddr[0] = *pt;//Rcv_Q[num].buf[7];
TermAddr[1] = *(pt + 1);//Rcv_Q[num].buf[8];
}
if ((par[0]==0x80) && (par[1]==0x17)) // 判断终端地址
{
TermAddr[2] = *pt;//Rcv_Q[num].buf[7];
TermAddr[3] = *(pt + 1);//Rcv_Q[num].buf[8];
}
if ((par[0]==0x80) && (par[1]==0x21)) // 判断低级权限密码
{
UserCode[0] = *pt;//Rcv_Q[num].buf[7];
UserCode[1] = *(pt + 1);//Rcv_Q[num].buf[8];
UserCode[2] = *(pt + 1);////Rcv_Q[num].buf[9];
}
if ((par[0]==0x80) && (par[1]==0x22)) // 判断高级权限密码
{
AdminCode[0] = *pt;// Rcv_Q[num].buf[7];
AdminCode[1] = *(pt + 1);//Rcv_Q[num].buf[8];
AdminCode[2] = *(pt + 1);//Rcv_Q[num].buf[9];
}
if ((par[0]==0x80) && (par[1]==0x30)) // 判断时间设置
{
buf[5] = *pt;//Rcv_Q[num].buf[7];
buf[4] = *(pt + 1);//Rcv_Q[num].buf[8];
buf[3] = *(pt + 2);//Rcv_Q[num].buf[9];
buf[2] = *(pt + 3);//Rcv_Q[num].buf[10];
buf[1] = *(pt + 4);//Rcv_Q[num].buf[11];
buf[0] = *(pt + 5);//Rcv_Q[num].buf[12];
DateTimeWrite((uint16)(2000|(BCD2HEX(buf[0]))),
(uint16)(BCD2HEX(buf[1])),
(uint16)(BCD2HEX(buf[2])),
(uint16)(BCD2HEX(buf[3])),
(uint16)(BCD2HEX(buf[4])),
(uint16)(BCD2HEX(buf[5])));
}
//else
//{
// GprsManagPar.flag = 0x00;
//}
if (par[0]==0x81) // 判断任务参数是否改变
{
ReadData(offset, len2, buf); // 读参数区数据
for (i=0;i<len2;i++)
{
if (*pp!=buf[i]) // 比较任务参数是否有变化
{
Task_Set_Flag = 0x01;
break;
}
else
{
pp ++;
}
}
}
if ((par[0]==0x81)&&(par[1]>0x00)&&(par[1]<=32)) // 保存任务参数
{
p = &ParamInSram.Term_Par.X8010[0] + offset;
pp = pt;
writeData1(p, len2, pp);
writeparamchk(&ParamInSram.Term_Par.X8010[0], &bnum); //处理参数区校验码
p = &ParamIn.Term_Par.X8010[0] + offset;
pp = pt;// - len;
writeData1(p, len2, pp);
writeparamchk(&ParamIn.Term_Par.X8010[0], &bnum);
}
else
{
p = &ParamInSram.Term_Par.X8010[0] + offset; // 保存参数
pp = pt;
writeData(p, len, pp);
writeparamchk(&ParamInSram.Term_Par.X8010[0], &bnum); //处理参数区校验码
p = &ParamIn.Term_Par.X8010[0] + offset;
pp = pt;// - len;
writeData(p, len, pp);
writeparamchk(&ParamIn.Term_Par.X8010[0], &bnum);
}
if ((Rcv_Q[num].buf[0]==0)&& // 心跳间隔处理
(par[0]==0x89)&&(par[1]==0x02)) // 把测量点参数中0号测量点的低字节作为心跳间隔
{
//uc_heartp = ParamInSram.Mp_Par[0].X8902[5];
uc_heartp = (uint8)BCD2HEX(Rcv_Q[num].buf[7]);
}
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
sendbuf[sendlen] = err;
sendlen ++;
pt = pt + len;
continue;
}//***
else // 返回密码权限不足
{
pt = pt + len;
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
sendbuf[sendlen] = 0x03;
sendlen ++;
continue;
}
}//**
else // 无该数据项,不再继续处理剩余的数据
{
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
sendbuf[sendlen] = 0x04;
sendlen ++;
break;
}
}//*
buf[0] = 0x68; // 填写发送缓冲区
for (i=0;i<6;i++)
{
buf[i+1] = Rcv_Q[num].addr[i];
}
buf[7] = 0x68;
buf[8] = Rcv_Q[num].concode | 0x80;
sendlen = sendlen + 1;
buf[9] = sendlen;
buf[10] = 0x00;
buf[11]= Rcv_Q[num].buf[0];
for (i=0;i<sendlen;i++)
{
buf[12+i] = sendbuf[i];
}
buf[11+sendlen]= AddData(buf, sendlen+11);
buf[12+sendlen]= 0x16;
PushSendQue(buf,sendlen+13, Rcv_Q[num].chtype);
ProgrmNote(&num); // 填写编程记录
}
/*********************************************************************************************************
** 函数名称: ProgrmNote(uint8 *pnum)
** 功能描述: 编程记录
**
** 输 入: *pnum 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ProgrmNote(uint8 *pnum)
{
uint16 year;
uint16 mon;
uint16 day;
uint16 week;
uint16 hour;
uint16 min;
uint16 sec;
uint8 num;
uint8 len,len1;
uint8 i,j;
/*year = 2007;
mon=9;day=18;hour=17;min=5;sec=30;
DateTimeWrite(year, mon, day, hour, min, sec);*/
DateTimeRead(&year, &mon, &day, &week, // 读时钟
&hour, &min, &sec);
DateTimeRead(&year, &mon, &day, &week, // 读时钟
&hour, &min, &sec);
//p_ProgramLog = 0;
num = *pnum;
if (p_ProgramLog>59) // 如果记录超过60条,第一条被挤掉
{
for (i=0;i<60;i++)
{
ProgramLog[i].len = ProgramLog[i+1].len;
ProgramLog[i].mp_num = ProgramLog[i+1].mp_num;
for (j=0;j<5;j++)
{
ProgramLog[i].time[j] = ProgramLog[i+1].time[j];
}
for (j=0;j<9;j++)
{
ProgramLog[i].dac[j] = ProgramLog[i+1].dac[j];
}
for (j=0;j<238;j++)
{
ProgramLog[i].buf[j] = ProgramLog[i+1].buf[j];
}
}
p_ProgramLog = 59;
}
ProgramLog[p_ProgramLog].mp_num = Rcv_Q[num].buf[0];
//len = 1;
ProgramLog[p_ProgramLog].time[0] = HEX2BCD(year%100);
ProgramLog[p_ProgramLog].time[1] = HEX2BCD((uint8)(mon));
ProgramLog[p_ProgramLog].time[2] = HEX2BCD((uint8)(day));
ProgramLog[p_ProgramLog].time[3] = HEX2BCD((uint8)(hour));
ProgramLog[p_ProgramLog].time[4] = HEX2BCD((uint8)(min));
//ProgramLog[p_ProgramLog].time[5] = (uint8)(sec);
//len += 5;
len1 = Rcv_Q[num].datalen[1];
len1 = len1<<8;
len1 = len1 + Rcv_Q[num].datalen[0]; // 计算数据项及内容长度
len1 = len1 - 5;
ProgramLog[p_ProgramLog].dac[8] = Rcv_Q[num].chtype;
//len += 1;
for (i=0;i<8;i++)
{
ProgramLog[p_ProgramLog].dac[7-i] = i;
//len ++;
}
len = 0;
for (i=0;i<len1;i++)
{
ProgramLog[p_ProgramLog].buf[i] = Rcv_Q[num].buf[5+i];
len ++;
}
ProgramLog[p_ProgramLog].len = len;
p_ProgramLog += 1;
}
/*********************************************************************************************************
** 函数名称: SetParamOVT()
** 功能描述: 写实时对象超时的处理
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SetParamOVT(uint8 *pnum)
{
uint32 i;
uint32 offset; // 保存该数据项在数据结构中的偏移地址
uint8 attr; // 保存该数据项的属性
uint8 bnum; // 保存该数据项块序号
uint32 len; // 保存该数据项的长度
uint32 len1; // 保存队列中为处理数据项及内容的长度
uint8 *pt; // 记录当前处理接收队列中位置指针
uint8 par[2]; // 用来保存临时参数
uint8 buf[256];
uint8 sendbuf[256],sendlen; // 保存返回的数据内容及长度
static uint8 num;
num = *pnum;
sendlen = 0;
len1 = Rcv_Q[num].datalen[1];
len1 = len1<<8;
len1 = len1 + Rcv_Q[num].datalen[0]; // 计算数据项及内容长度
len1 = len1 - 5; // 计算数据项及内容长度
pt = &Rcv_Q[num].buf[5]; // 把接收队列中第一个数据项的位置付给该指针
while (len1>2)
{//*
par[1] = *pt;
pt ++;
par[0] = *pt;
pt ++;
len = ParamIndex(Rcv_Q[num].buf[0], par, &offset, &attr, &bnum); // 读出该数据项的长度
if (len>0) // 有该数据项
{//**
//pt = pt + len;
len1 = len1 - len - 2;
pt = pt + len;
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
sendbuf[sendlen] = 0x05;
sendlen ++;
continue;
}//**
else // 无该数据项,不再继续处理剩余的数据
{
sendbuf[sendlen] = par[1];
sendlen ++;
sendbuf[sendlen] = par[0];
sendlen ++;
sendbuf[sendlen] = 0x04;
sendlen ++;
break;
}
}//*
buf[0] = 0x68; // 填写发送缓冲区
for (i=0;i<6;i++)
{
buf[i+1] = Rcv_Q[num].addr[i];
}
buf[7] = 0x68;
buf[8] = Rcv_Q[num].concode | 0x80;
sendlen = sendlen + 1;
buf[9] = sendlen;
buf[10] = 0x00;
buf[11]= Rcv_Q[num].buf[0];
for (i=0;i<sendlen;i++)
{
buf[12+i] = sendbuf[i];
}
buf[11+sendlen]= AddData(buf, sendlen+11);
buf[12+sendlen]= 0x16;
PushSendQue(buf,sendlen+13, Rcv_Q[num].chtype);
}
/*********************************************************************************************************
** 函数名称: ReadCurData()
** 功能描述: 读当前数据
**
** 输 入: num 当前处理的接收队列号
**
** 输 出: 无
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ReadCurData(uint8 *pnum)
{
uint32 j;
static uint32 offset; // 保存该数据项在数据结构中的偏移地址
static uint8 attr; // 保存该数据项的属性
static uint8 bnum; // 保存该数据项块序号
static uint32 len; // 保存该数据项的长度
static uint32 len1; // 保存队列中为处理数据项及内容的长度
uint8 *pt,*p,*pp; // 记录当前处理接收队列中位置指针
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -