📄 znet.c
字号:
#define _znet_
#include "..\Inc\includes.h"
/*********************************************************************************************************
* 函数名称:DealUpData_Com1
*
* 功能描述:收到来自上位机的数据和进行响应和处理
*
* 说明:还差历史数据 历史告警 厂家信息 没有做
*
********************************************************************************************************/
void DealUpData_Com1(void)
{
Uint8 Flag=0,adr,cid1,cid2,ver;
ver = Combine(STR1_Rec[1],STR1_Rec[2]); //获取协议版本号
adr = Combine(STR1_Rec[3],STR1_Rec[4]); //获取地址
cid1 = Combine(STR1_Rec[CID1],STR1_Rec[CID1+1]); //获得CID1的信息
cid2 = Combine(STR1_Rec[CID2],STR1_Rec[CID2+1]); //获得CID2的信息
if(adr != ADR) //给智能设备的命令
{
Task |= Com1OrderToCom0;
}
else
{
if(ver != VER) ErrorDeal(0x01,ADR,cid1,COM1); //协议错
Flag = XiaoYan(STR1_Rec,STR1_len);
if(Flag != 0) ErrorDeal(Flag,ADR,cid1,COM1); //校验出错
else
{
if(cid1== 0xB0)
{
Deal_DoorCommand(cid2);
}
else if(cid2 < 0x20) ; //响应信息
else
{
switch(cid2)
{
case 0x42:SendAIDataI(0); break;//获取模拟量(定点)CID2 = 0;响应信息
case 0x43:SendDIData(0); break;//获取开关量输入状态
case 0x44:SendGaoJing(0); break;//获取告警信息
case 0x45:YaoKong(); break;//遥控
case 0x47:SendXiTongData(); break;//上传系统参数(上、下限)
case 0x49:SetXiTongData(); break;//设定系统参数(上、下限)
case 0x4B:SendOldData(); break;//上传历史数据(含开关量)
case 0x4C:SendOldGaoJing(); break;//上传历史告警
case 0x4D:SendTime(); break;//上传时间
case 0x4E:SetTime(); break;//设定时间
case 0x4F:
case 0x50:ErrorDeal(0x0,ADR,CID10,COM1);break;//上传设备地址、协议版本号
case 0x51:SendChangJiaInfo(); break;//上传厂家信息
case 0x80:ErrorDeal(0x0,ADR,CID10,COM1);break;//上传设备地址
case 0x83:SendDefine(0); break;//上传检测量定义表
case 0x85:SetInterval(); break;//设定上传时间间隔
case 0x87:SendAllAdr(0); break;//上传设备地址表(智能设备)
case 0x88:SendBigData(); break;//批量上传数据
default: ErrorDeal(0x04,adr,cid1,COM1);break;//CID2无效
}
}
}
STR1_Re_flag = 0;
}
}
/*********************************************************************************************************
* 函数名称:DealDownData_Com0
*
* 功能描述:收到来自下位机的数据后进行响应和处理
*
* 说明:
*
********************************************************************************************************/
void DealDownData_Com0(void)
{
Uint8 Flag;
Uint16 k;
if(LastBuf == 0) //来自于智能设备
{
Task |= Com0DataToCom1;
}
else if(LastBuf == 1) //来自于门禁
{
Flag = STR0_Rec[0];
for(k=1; k<STR0_len-1; k++) Flag ^= STR0_Rec[k];
if(Flag == STR0_Rec[STR0_len-1])
{
if(STR0_Rec[3]==0x04) //有记录卡号
{
Task |= SendDoorCardNo;
if(Menu_ID==22) //添加卡号记录
{
Set_array[0] = STR0_Rec[4];
Set_array[1] = STR0_Rec[5];
Set_array[2] = STR0_Rec[6];
Set_array[3] = STR0_Rec[7];
Disp_CardNo(Set_array,Set_array_count,1);
Door_Speak(STR0_Rec[2],1,5,2);
}
else
{ //控制开关门
if(ComparaCardNo(&STR0_Rec[4])==1)
{
CtrlDoor(OPEN);
HaveDoorRight = 1;
OpenDoorDelay = OPENDOORDELAY;
Door_Speak(STR0_Rec[2],1,5,2);
if(STR0_Rec[2]==CARD_IN)
{
DoorDir = OUTDOOR;
for(k=0; k<16; k++)
{
if(ADSam_Alarm[k]!=0||DISam_Alarm[k]!=0)
{
DoorAlarm |= 0x10;
DoorAlarm_ID = 0x012; //检查故障是否解除完毕
break;
}
}
}
else DoorDir = INDOOR;
}
else
{
CtrlDoor(CLOSE);
//HaveDoorRight = 0;
CloseDoorDelay = CLOSEDOORDELAY;
Door_Speak(STR0_Rec[2],3,2,2);
DoorAlarm |= 0x04;
DoorAlarm_ID = 0x07; //无访问权限
}
}
}
}
Com0Busy = 0;
STR0_Re_flag = 0;
}
}
/*********************************************************************************************************
* 函数名称:ShangChuanData
*
* 功能描述:定时上传数据,包括模拟量、开关量和告警信息
*
* 说明:
*
********************************************************************************************************/
void ShangChuanData(void)
{
if(STR1_Re_flag==Busy || Com1_flag==Busy) return;
//SendAIDataI(0x42); //上传模拟量(定点)
//SendDIData(0x43); //上传开关量
SendGaoJing(0x44); //上传告警信息
Task &=~ UpSend_Data;
}
/*********************************************************************************************************
* 函数名称: GetDeviceAdr
*
* 功能描述:检察设备地址,从地址1-254循检,如有响应则记录ADR和CID1.
*
* 说明:须保证RS485总线上地址不重复
*
********************************************************************************************************/
void GetDeviceAdr(void)
{
Uint16 i,k;
Adr_sum = 0;
for(k=1; k<255; k++) //从1-254地址搜索设备
{
GetCommandPackage(STR0_Rec,k,0,0x80); //检查设备地址
SendStrlenToCom0(STR0_Rec,Com_Long); //发给智能设备
for(i=0; i<1000; i++) ; //延时、等待响应
if(STR0_Re_flag==Busy)
{
i = Combine(STR0_Rec[3],STR0_Rec[4]); //获取设备地址
if(i == k) //响应的地址和发送的地址一致
{
Adr[Adr_sum][0] = k;
Adr[Adr_sum][1] = Combine(STR0_Rec[CID1],STR0_Rec[CID1+1]); //CID1
Adr_sum += 1;
}
STR0_Re_flag = 0;
}
}
}
/*********************************************************************************************************
* 函数名称:SendAIDataI
*
* 功能描述:将模拟量化后的数据传给上位机
*
* 说明:
*
********************************************************************************************************/
void SendAIDataI(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,4+16*4); //数据长度校验 12
STR1_Rec[13] = ASCII[DATAFLAG>>4]; //DATAFLAG
STR1_Rec[14] = ASCII[DATAFLAG&0x0f];
STR1_Rec[15] = ASCII[16>>4];
STR1_Rec[16] = ASCII[16&0x0f];
for(i=0; i<16; i++)
{
if(ADSam_Code[i]==0) //没有启用该通道 发送0x20
{
STR1_Rec[i*4+17]=0x20; STR1_Rec[i*4+18]=0x20;
STR1_Rec[i*4+19]=0x20; STR1_Rec[i*4+20]=0x20;
}
else
{
STR1_Rec[i*4+17]=ASCII[(ADSam_Value[i]>>12)&0x000f];
STR1_Rec[i*4+18]=ASCII[(ADSam_Value[i]>>8) &0x000f];
STR1_Rec[i*4+19]=ASCII[(ADSam_Value[i]>>4) &0x000f];
STR1_Rec[i*4+20]=ASCII[(ADSam_Value[i]>>0) &0x000f];
}
}
i = 15*4+20;
GetCheckSum(STR1_Rec,i); //数据包和校验
STR1_Rec[i+5]= EOI;
SendStrlenToCom1(STR1_Rec,i+6);
}
/*********************************************************************************************************
* 函数名称:SendDIData
*
* 功能描述:将开关量数据传给上位机
*
* 说明:
*
********************************************************************************************************/
void SendDIData(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,4+16*2); //数据长度校验 12
STR1_Rec[13] = ASCII[DATAFLAG>>4]; //DATAFLAG
STR1_Rec[14] = ASCII[DATAFLAG&0x0f];
STR1_Rec[15] = ASCII[16>>4];
STR1_Rec[16] = ASCII[16&0x0f];
for(i=0; i<16; i++)
{
if(DISam_Code[i]==0) //没有启用该通道 发送0x20
{
STR1_Rec[i*2+17]=0x20; STR1_Rec[i*2+18]=0x20;
}
else
{
STR1_Rec[i*2+17]=ASCII[(DISam_Value[i]>>4)&0x0f];
STR1_Rec[i*2+18]=ASCII[(DISam_Value[i]>>0)&0x0f];
}
}
i = 15*2+18;
GetCheckSum(STR1_Rec,i); //数据包和校验
STR1_Rec[i+5]= EOI;
SendStrlenToCom1(STR1_Rec,i+6);
}
/*********************************************************************************************************
* 函数名称:SendGaoJing
*
* 功能描述:发送当前告警消息
*
* 说明:
*
********************************************************************************************************/
void SendGaoJing(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+16*10+16*6); //数据长度校验 6+16*10+16*6
STR1_Rec[13] = ASCII[DATAFLAG>>4]; //DATAFLAG
STR1_Rec[14] = ASCII[DATAFLAG&0x0f];
STR1_Rec[15] = ASCII[16>>4]; //模拟通道
STR1_Rec[16] = ASCII[16&0x0f];
for(i=0; i<16; i++)
{
STR1_Rec[i*10+17] = ASCII[i>>4];
STR1_Rec[i*10+18] = ASCII[i&0x0f];
STR1_Rec[i*10+19] = ASCII[ADSam_Code[i]>>4];
STR1_Rec[i*10+20] = ASCII[ADSam_Code[i]&0x0f];
if(ADSam_Code[i]==0) //没有启用该通道 发送0x20
{
STR1_Rec[i*10+21]=0x20; STR1_Rec[i*10+22]=0x20;
STR1_Rec[i*10+23]=0x20; STR1_Rec[i*10+24]=0x20;
STR1_Rec[i*10+25]=0x20; STR1_Rec[i*10+26]=0x20;
}
else
{
STR1_Rec[i*10+21]=ASCII[ADSam_Alarm[i]>>4];
STR1_Rec[i*10+22]=ASCII[ADSam_Alarm[i]&0x0f];
STR1_Rec[i*10+23]=ASCII[(ADSam_Value[i]>>12)&0x000f];
STR1_Rec[i*10+24]=ASCII[(ADSam_Value[i]>>8) &0x000f];
STR1_Rec[i*10+25]=ASCII[(ADSam_Value[i]>>4) &0x000f];
STR1_Rec[i*10+26]=ASCII[(ADSam_Value[i]>>0) &0x000f];
}
}
//开关量通道
k = 15*10+26;
STR1_Rec[k+1] = ASCII[16>>4];
STR1_Rec[k+2] = ASCII[16&0x0f];
for(i=0; i<16; i++)
{
STR1_Rec[i*6+3+k] = ASCII[i>>4];
STR1_Rec[i*6+4+k] = ASCII[i&0x0f];
STR1_Rec[i*6+5+k] = ASCII[DISam_Code[i]>>4];
STR1_Rec[i*6+6+k] = ASCII[DISam_Code[i]&0x0f];
if(DISam_Code[i]==0) //没有启用该通道 发送0x20
{
STR1_Rec[i*6+7+k]=0x20; STR1_Rec[i*6+8+k]=0x20;
}
else
{
STR1_Rec[i*6+7+k]=ASCII[(DISam_Alarm[i]>>4)&0x0f];
STR1_Rec[i*6+8+k]=ASCII[(DISam_Alarm[i]>>0)&0x0f];
}
}
i = 15*6+8+k;
GetCheckSum(STR1_Rec,i); //数据包和校验
STR1_Rec[i+5]= EOI;
SendStrlenToCom1(STR1_Rec,i+6);
DATAFLAG &= 0xEE; //上传完告警信息后,将新增告警信息D0 D4位屏蔽
}
/*********************************************************************************************************
* 函数名称:YaoKong
*
* 功能描述:遥控...控制开关量输出
*
* 说明:
*
********************************************************************************************************/
void YaoKong(void)
{
Uint16 tongdao, states;
tongdao = Combine(STR1_Rec[13],STR1_Rec[14]);
states = Combine(STR1_Rec[15],STR1_Rec[16]);
if(tongdao == 0xFF) //对所有的通道
{
if(states==0x10) OutStates = 0x00ff;
else if(states==0x1F) OutStates = 0x0000;
}
else if(tongdao>=1&&tongdao<=8) //指定的通道号
{
tongdao = (1<<(tongdao-1));
if(states==0x10) OutStates = OutStates | tongdao;
else if(states==0x1F) OutStates = OutStates & (~tongdao);
}
ctrl(OutStates);
ErrorDeal(0,ADR,CID10,COM1);
}
/*********************************************************************************************************
* 函数名称:SendXiTongData
*
* 功能描述:上传系统参数,上限、下限
*
* 说明:P15
*
********************************************************************************************************/
void SendXiTongData(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,2+16*8); //数据长度校验 12
STR1_Rec[13] = ASCII[16>>4];
STR1_Rec[14] = ASCII[16&0x0f];
for(i=0; i<16; i++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -