📄 znet.c
字号:
STR1_Rec[i*8+15]=ASCII[(ADAlarm_para[0][i]>>12)&0x000f];
STR1_Rec[i*8+16]=ASCII[(ADAlarm_para[0][i]>>8) &0x000f];
STR1_Rec[i*8+17]=ASCII[(ADAlarm_para[0][i]>>4) &0x000f];
STR1_Rec[i*8+18]=ASCII[(ADAlarm_para[0][i]>>0) &0x000f];
STR1_Rec[i*8+19]=ASCII[(ADAlarm_para[1][i]>>12)&0x000f];
STR1_Rec[i*8+20]=ASCII[(ADAlarm_para[1][i]>>8) &0x000f];
STR1_Rec[i*8+21]=ASCII[(ADAlarm_para[1][i]>>4) &0x000f];
STR1_Rec[i*8+22]=ASCII[(ADAlarm_para[1][i]>>0) &0x000f];
}
i = 15*8+22;
GetCheckSum(STR1_Rec,i); //数据包和校验
STR1_Rec[i+5]= EOI;
SendStrlenToCom1(STR1_Rec,i+6);
}
/*********************************************************************************************************
* 函数名称:SetXiTongData
*
* 功能描述:设置系统参数,上限、下限
*
* 说明:
*
********************************************************************************************************/
void SetXiTongData(void)
{
Uint16 tongdao, command, data,i,x1;
tongdao = Combine(STR1_Rec[13],STR1_Rec[14]);
command = Combine(STR1_Rec[15],STR1_Rec[16]);
data = (Combine(STR1_Rec[17],STR1_Rec[18]))>>8;
data = data + Combine(STR1_Rec[19],STR1_Rec[20]);
if(tongdao>=1 && tongdao<=16) //通道有效
{
i = 0;
if(command==0x80) ADAlarm_para[0][tongdao-1] = data;//设置上限
else if(command==0x81) ADAlarm_para[1][tongdao-1] = data;//设置下限
else i = 0x06;
if(i==0)
{
x1 = I2C_UP+32*(command-0x80)+(tongdao-1)*2;
II3WR(AT24C256,x1,data>>8);
II3WR(AT24C256,x1+1,data&0x00ff);
}
}
else i = 0x06;
ErrorDeal(i,ADR,CID10,COM1);
}
/*********************************************************************************************************
* 函数名称:SendOldData
*
* 功能描述:上传历史数据
*
* 说明:
*
********************************************************************************************************/
void SendOldData(void)
{
static Uint16 OldData_count=1;
Uint16 i,count,sum=0;
i = Combine(STR1_Rec[13],STR1_Rec[14]); //COMMAND TYPE
if(i==0x00)
{
if(OldData_Now==OldData_Sum)
OldData_count = 1; //发送第一条历史数据
else OldData_count = OldData_Now+1;
}
else if(i==0x01)
{
OldData_count +=1; //接收正确,发送下一条历史数据
}
else if(i==0x02) ; //接受错误,重发.
else {ErrorDeal(0x06,ADR,CID10,COM1);return;}
if(OldData_Now==OldData_Sum)
{
if(OldData_count>=OldData_Sum) {OldData_count = OldData_Sum;i=1;}else i=0;
}
else
{
if(OldData_count>OldData_Sum) OldData_count = 1;
i = 0;
if(OldData_count==OldData_Now) i=1;
}
count = I2C_OldDataByte*2;
ReadOldData(&STR1_Rec[380],OldData_count-1);
if(i==1) OldData_count -= 1;
STR1_Rec[0] = SOI;
STR1_Rec[1] = ASCII[VER>>4];
STR1_Rec[2] = ASCII[VER&0x0f];
STR1_Rec[3] = ASCII[ADR>>4];
STR1_Rec[4] = ASCII[ADR&0x0f];
STR1_Rec[5] = ASCII[CID10>>4];
STR1_Rec[6] = ASCII[CID10&0x0f];
STR1_Rec[7] = ASCII[0]; //正常响应
STR1_Rec[8] = ASCII[0];
GetCheckLength(STR1_Rec,count+4); //数据长度校验
STR1_Rec[13] = ASCII[0];
STR1_Rec[14] = ASCII[i&0x0f];
STR1_Rec[15] = ASCII[DATAFLAG>>4];
STR1_Rec[16] = ASCII[DATAFLAG&0x0f];
for(i=1; i<17; i++) sum += STR1_Rec[i];
for(i=0; i<count; i++)
{
STR1_Rec[17+i] = ASCII[STR1_Rec[380+i]>>4];
STR1_Rec[18+i] = ASCII[STR1_Rec[381+i]&0x0f];
sum = sum + STR1_Rec[17+i] + STR1_Rec[18+i];
}
sum = ((~sum)+1);
STR1_Rec[count+18] = ASCII[sum>>12];
STR1_Rec[count+19] = ASCII[(sum>>8)&0x000f];
STR1_Rec[count+20] = ASCII[(sum>>4)&0x000f];
STR1_Rec[count+21] = ASCII[sum&0x000f];
STR1_Rec[count+22] = EOI;
SendStrlenToCom1(STR1_Rec,count+23);
}
/*********************************************************************************************************
* 函数名称:SendOldGaoJing
*
* 功能描述:上传历史告警
*
* 说明:
*
********************************************************************************************************/
void SendOldGaoJing(void)
{
static Uint16 OldGaoJing_count=1;
Uint16 i,count,sum=0;
i = Combine(STR1_Rec[13],STR1_Rec[14]); //COMMAND TYPE
if(i==0x00)
{
if(Alarm_Now==Alarm_Sum) OldGaoJing_count = 1; //发送第一条告警数据
else OldGaoJing_count = Alarm_Now+1;
}
else if(i==0x01)
{
OldGaoJing_count +=1; //接收正确,发送下一条历史告警
}
else if(i==0x02) ; //接受错误,重发.
else {ErrorDeal(0x06,ADR,CID10,COM1);return;}
if(Alarm_Sum == Alarm_Now)
{
if(OldGaoJing_count>=Alarm_Sum) {OldGaoJing_count=Alarm_Sum;i=1;}else i=0;
}
else
{
if(OldGaoJing_count>Alarm_Sum) OldGaoJing_count = 1;
i=0;
if(OldGaoJing_count==Alarm_Now) i=1;
}
count = I2C_GaoJingByte*2;
ReadOldAlarm(&STR1_Rec[380],OldGaoJing_count-1);
if(i==1) OldGaoJing_count -= 1;
STR1_Rec[0] = SOI;
STR1_Rec[1] = ASCII[VER>>4];
STR1_Rec[2] = ASCII[VER&0x0f];
STR1_Rec[3] = ASCII[ADR>>4];
STR1_Rec[4] = ASCII[ADR&0x0f];
STR1_Rec[5] = ASCII[CID10>>4];
STR1_Rec[6] = ASCII[CID10&0x0f];
STR1_Rec[7] = ASCII[0]; //正常响应
STR1_Rec[8] = ASCII[0];
GetCheckLength(STR1_Rec,count+4); //数据长度校验
STR1_Rec[13] = ASCII[0];
STR1_Rec[14] = ASCII[i&0x0f];
STR1_Rec[15] = ASCII[DATAFLAG>>4];
STR1_Rec[16] = ASCII[DATAFLAG&0x0f];
for(i=1; i<17; i++) sum += STR1_Rec[i];
for(i=0; i<count; i++)
{
STR1_Rec[17+i] = ASCII[STR1_Rec[380+i]>>4];
STR1_Rec[18+i] = ASCII[STR1_Rec[381+i]&0x0f];
sum = sum + STR1_Rec[17+i] + STR1_Rec[18+i];
}
sum = ((~sum)+1);
STR1_Rec[count+18] = ASCII[sum>>12];
STR1_Rec[count+19] = ASCII[(sum>>8)&0x000f];
STR1_Rec[count+20] = ASCII[(sum>>4)&0x000f];
STR1_Rec[count+21] = ASCII[sum&0x000f];
STR1_Rec[count+22] = EOI;
SendStrlenToCom1(STR1_Rec,count+23);
}
/*********************************************************************************************************
* 函数名称:SendTime
*
* 功能描述:发送系统时间
*
* 说明:
*
********************************************************************************************************/
void SendTime(void)
{
Uint16 i;
STR1_Rec[0] = SOI;
STR1_Rec[1] = ASCII[VER>>4];
STR1_Rec[2] = ASCII[VER&0x0f];
STR1_Rec[3] = ASCII[ADR>>4];
STR1_Rec[4] = ASCII[ADR&0x0f];
STR1_Rec[5] = ASCII[CID10>>4];
STR1_Rec[6] = ASCII[CID10&0x0f];
STR1_Rec[7] = ASCII[0]; //正常响应
STR1_Rec[8] = ASCII[0];
GetCheckLength(STR1_Rec,14); //数据长度校验 12
STR1_Rec[13] = ASCII[2];
STR1_Rec[14] = ASCII[0];
for(i=0; i<6; i++)
{
STR1_Rec[i*2+15]=ASCII[(Time_now[i]>>4)];
STR1_Rec[i*2+16]=ASCII[(Time_now[i]&0x0f)];
}
i = 5*2+16;
GetCheckSum(STR1_Rec,i); //数据包和校验
STR1_Rec[i+5]= EOI;
SendStrlenToCom1(STR1_Rec,i+6);
}
/*********************************************************************************************************
* 函数名称:SetTime
*
* 功能描述:设置系统时间
*
* 说明:
*
********************************************************************************************************/
void SetTime(void)
{
Uint8 temp[6];
Uint8 timeformat[6][2]={{0,99},{1,12},{1,31},{0,23,},{0,59},{0,59}};
Uint16 i,flag;
for(i=0; i<6; i++)
{
temp[i] = Combine(STR1_Rec[i*2+15],STR1_Rec[i*2+16]);
if(temp[i]>=timeformat[i][0]&&temp[i]<=timeformat[i][1]) flag = 0x0;
else {flag = 0x06;break;}
}
if(flag==0x0)
{
for(i=0; i<6; i++) Time_now[i] = temp[i];
NowTime_wr_data(Time_now);
}
ErrorDeal(flag,ADR,CID10,COM1);
}
/*********************************************************************************************************
* 函数名称:SendChangJiaInfo
*
* 功能描述:上传厂家信息
*
* 说明:
*
********************************************************************************************************/
void SendChangJiaInfo(void)
{
ErrorDeal(0x04,ADR,CID10,COM1);
}
/*********************************************************************************************************
* 函数名称:SendDefine
*
* 功能描述:上传检测量定义表
*
* 说明:
*
********************************************************************************************************/
void SendDefine(Uint16 k)
{
Uint16 i;
STR1_Rec[0] = SOI;
STR1_Rec[1] = ASCII[VER>>4];
STR1_Rec[2] = ASCII[VER&0x0f];
STR1_Rec[3] = ASCII[ADR>>4];
STR1_Rec[4] = ASCII[ADR&0x0f];
STR1_Rec[5] = ASCII[CID10>>4];
STR1_Rec[6] = ASCII[CID10&0x0f];
STR1_Rec[7] = ASCII[k>>4]; //用K区分是获取还是主动上传
STR1_Rec[8] = ASCII[k&0x0f];
GetCheckLength(STR1_Rec,6+40*4); //数据长度校验 12
STR1_Rec[13] = ASCII[16>>4]; //模拟量输入定义
STR1_Rec[14] = ASCII[16&0x0f];
for(i=0; i<16; i++)
{
STR1_Rec[i*4+15]=ASCII[(i+1)>>4];
STR1_Rec[i*4+16]=ASCII[(i+1)&0x0f];
STR1_Rec[i*4+17]=ASCII[ADSam_Code[i]>>4];
STR1_Rec[i*4+18]=ASCII[ADSam_Code[i]&0x0f];
}
STR1_Rec[15*4+19] = ASCII[16>>4]; //开关量输入定义
STR1_Rec[15*4+20] = ASCII[16&0x0f];
for(i=0; i<16; i++)
{
STR1_Rec[(15+i)*4+21]=ASCII[(i+1)>>4];
STR1_Rec[(15+i)*4+22]=ASCII[(i+1)&0x0f];
STR1_Rec[(15+i)*4+23]=ASCII[DISam_Code[i]>>4];
STR1_Rec[(15+i)*4+24]=ASCII[DISam_Code[i]&0x0f];
}
STR1_Rec[30*4+25] = ASCII[8>>4]; //开关量输出定义
STR1_Rec[30*4+26] = ASCII[8&0x0f];
for(i=0; i<8; i++)
{
STR1_Rec[(30+i)*4+27]=ASCII[(i+1)>>4];
STR1_Rec[(30+i)*4+28]=ASCII[(i+1)&0x0f];
STR1_Rec[(30+i)*4+29]=ASCII[DOSam_Code[i]>>4];
STR1_Rec[(30+i)*4+30]=ASCII[DOSam_Code[i]&0x0f];
}
i = 37*4+30;
GetCheckSum(STR1_Rec,i); //数据包和校验
STR1_Rec[i+5]= EOI;
SendStrlenToCom1(STR1_Rec,i+6);
}
/*********************************************************************************************************
* 函数名称:SetInterval
*
* 功能描述:设定监控主机上传数据时间间隔
*
* 说明:
*
********************************************************************************************************/
void SetInterval(void)
{
Time_interval = (Combine(STR1_Rec[13],STR1_Rec[14])<<8) + Combine(STR1_Rec[15],STR1_Rec[16]);
ErrorDeal(0,ADR,CID10,COM1);
}
/*********************************************************************************************************
* 函数名称:SendAllAdr
*
* 功能描述:上传所有智能设备的地址 ADR 和设备类型 CID1
*
* 说明:
*
********************************************************************************************************/
void SendAllAdr(Uint16 k)
{
Uint16 i;
STR1_Rec[0] = SOI;
STR1_Rec[1] = ASCII[VER>>4];
STR1_Rec[2] = ASCII[VER&0x0f];
STR1_Rec[3] = ASCII[ADR>>4];
STR1_Rec[4] = ASCII[ADR&0x0f];
STR1_Rec[5] = ASCII[CID10>>4];
STR1_Rec[6] = ASCII[CID10&0x0f];
STR1_Rec[7] = ASCII[k>>4]; //用K区分是获取还是主动上传
STR1_Rec[8] = ASCII[k&0x0f];
GetCheckLength(STR1_Rec,2+Adr_sum*4); //数据长度校验 12
STR1_Rec[13] = ASCII[Adr_sum>>4]; //模拟量输入定义
STR1_Rec[14] = ASCII[Adr_sum&0x0f];
for(i=0; i<Adr_sum; i++)
{
STR1_Rec[i*4+15]=ASCII[Adr[i][0]>>4];
STR1_Rec[i*4+16]=ASCII[Adr[i][0]&0x0f];
STR1_Rec[i*4+17]=ASCII[Adr[i][1]>>4];
STR1_Rec[i*4+18]=ASCII[Adr[i][1]&0x0f];
}
i = (Adr_sum-1)*4+18;
GetCheckSum(STR1_Rec,i); //数据包和校验
STR1_Rec[i+5]= EOI;
SendStrlenToCom1(STR1_Rec,i+6);
}
/*********************************************************************************************************
* 函数名称:SendBigData
*
* 功能描述:批量上传数据
*
* 说明:(未完成)
*
********************************************************************************************************/
void SendBigData(void)
{
ErrorDeal(0x04,ADR,CID10,COM1);
}
/*********************************************************************************************************
* 函数名称:ErrorDeal
*
* 功能描述:错误消息响应
*
* 说明:
*
********************************************************************************************************/
void ErrorDeal(Uint8 Rtn,Uint8 adr,Uint8 cid1,Uint8 dir)
{
Uint8 *p;
if(dir==COM1) p=STR1_Rec; else p=STR0_Rec;
GetCommandPackage(p,adr,cid1,Rtn); //发送本机地址
if(COM1==1) SendStrlenToCom1(p,Com_Long); //发给计算机
else SendStrlenToCom0(p,Com_Long); //发给智能设备
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -