📄 pwm v30.c
字号:
/************************************功能描述:门开时间长报警函数组成:全局变量:输入:返回:************************************/void LongToAlarm(void){ if(RxBuffer[RXB_DATAOFFSET]==1) { if(RxBuffer[RXB_DATAOFFSET+1]==0) { Door1_LongToAlarm=0; LongToAlarm1=0; } else if(RxBuffer[RXB_DATAOFFSET+1]==1) { Door1_LongToAlarm=1; LongToAlarm1=1; } } if(RxBuffer[RXB_DATAOFFSET]==2) { if(RxBuffer[RXB_DATAOFFSET+1]==0) { Door2_LongToAlarm=0; LongToAlarm2=0; } else if(RxBuffer[RXB_DATAOFFSET+1]==1) { Door2_LongToAlarm=1; LongToAlarm2=1; } } KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);}/************************************功能描述:系统复位函数组成:全局变量:输入:返回:************************************/void ResetSystems(void){ byte i; SaveOutOpenDoor1=0; SaveOutOpenDoor2=0; SaveTamper1=0; /*Enable Tamper switch */ SaveTamper2=0; SaveFire1=0; SaveFire2=0; Status=0; BackupStatus=0; inputStatus &=0xFF; FunctionStatus &=0x00; for(i=0;i< 0xA9;i++) { XBYTE[i]=0; if(XBYTE[i])Hardware_Err=1; } i=0; for(;i<97;i++) /*clear timezone*/ { XBYTE[i+OFFSET_TimeZone]=0; } TrigerTime1=5; /*default open door time for 5sec. */ TrigerTime2=5; ShuntTime1=10; ShuntTime2=10; /*default shunt time for 10sec.*/ //MaxCount=1000; /*default max. entry value*/ OutData=0x00; if(Hardware_Err) KSNET_NAK(SlaveADR,RxBuffer[RXB_CMD]); else KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);}/************************************功能描述:设置从机地址函数组成:全局变量:输入:返回:************************************/void SetSlaveAddress(void){ if(!CompareSerialNum()) { SlaveADR= RxBuffer[RXB_ADDR]; SlaveAddress=SlaveADR; SlaveCheckSum=SlaveADR; ADR_LED = 1; KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); } else if(SlaveADR == RxBuffer[RXB_ADDR]) { SlaveAddress=0; SlaveADR=0; SlaveCheckSum=0; ReceivLED=0; /* ON THE FLAG OF TXRX LED */ }}/************************************功能描述:比较序列号函数组成:全局变量:输入:返回: 序列号正确返回0 ,错误返回1************************************/byte CompareSerialNum(void){ if(CBYTE[SerialNo] == RxBuffer[RXB_DATAOFFSET]) { if(CBYTE[SerialNo+1] == RxBuffer[RXB_DATAOFFSET+1]) { if(CBYTE[SerialNo+2] == RxBuffer[RXB_DATAOFFSET+2]) { if(CBYTE[SerialNo+3] == RxBuffer[RXB_DATAOFFSET+3]) { if(CBYTE[SerialNo+4] == RxBuffer[RXB_DATAOFFSET+4]) { if(CBYTE[SerialNo+5] == RxBuffer[RXB_DATAOFFSET+5])return 0; } } } } } return 1;}/************************************功能描述:增加假日函数组成:全局变量:输入:返回:************************************/ void AddHoliday(void){ RxBuffer[RXB_DATAOFFSET] = RxBuffer[RXB_DATAOFFSET] * 4 + RxBuffer[RXB_DATAOFFSET+1]/8; RxBuffer[RXB_DATAOFFSET+1] = RxBuffer[RXB_DATAOFFSET+1] % 8; switch (RxBuffer[RXB_DATAOFFSET+1]) { case 0 : RxBuffer[RXB_DATAOFFSET+1] = 0x01; break; case 1 : RxBuffer[RXB_DATAOFFSET+1] = 0x02; break; case 2 : RxBuffer[RXB_DATAOFFSET+1] = 0x04; break; case 3 : RxBuffer[RXB_DATAOFFSET+1] = 0x08; break; case 4 : RxBuffer[RXB_DATAOFFSET+1] = 0x10; break; case 5 : RxBuffer[RXB_DATAOFFSET+1] = 0x20; break; case 6 : RxBuffer[RXB_DATAOFFSET+1] = 0x40; break; case 7 : RxBuffer[RXB_DATAOFFSET+1] = 0x80; break; default: break; } XBYTE[RxBuffer[RXB_DATAOFFSET]+OFFSET_Holiday]=XBYTE[RxBuffer[RXB_DATAOFFSET]+OFFSET_Holiday]|RxBuffer[RXB_DATAOFFSET+1]; KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); CheckHoliday();}/************************************功能描述:删除假日函数组成:全局变量:输入:返回:************************************/void DelHoliday(void){ RxBuffer[RXB_DATAOFFSET] = RxBuffer[RXB_DATAOFFSET] * 4 + RxBuffer[RXB_DATAOFFSET+1]/8; RxBuffer[RXB_DATAOFFSET+1] = RxBuffer[RXB_DATAOFFSET+1] % 8; switch (RxBuffer[RXB_DATAOFFSET+1]) { case 0 : RxBuffer[RXB_DATAOFFSET+1] = 0x01; break; case 1 : RxBuffer[RXB_DATAOFFSET+1] = 0x02; break; case 2 : RxBuffer[RXB_DATAOFFSET+1] = 0x04; break; case 3 : RxBuffer[RXB_DATAOFFSET+1] = 0x08; break; case 4 : RxBuffer[RXB_DATAOFFSET+1] = 0x10; break; case 5 : RxBuffer[RXB_DATAOFFSET+1] = 0x20; break; case 6 : RxBuffer[RXB_DATAOFFSET+1] = 0x40; break; case 7 : RxBuffer[RXB_DATAOFFSET+1] = 0x80; break; default: break; } RxBuffer[RXB_DATAOFFSET+1] = ~RxBuffer[RXB_DATAOFFSET+1]; XBYTE[OFFSET_Holiday+RxBuffer[RXB_DATAOFFSET]]=XBYTE[OFFSET_Holiday+RxBuffer[RXB_DATAOFFSET]]&RxBuffer[RXB_DATAOFFSET+1]; KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); CheckHoliday();}/************************************功能描述:假日复位函数组成:全局变量:输入:返回:说明: 24个假期************************************/void ResetHoliday(void){ byte i; for(i=0;i<48;i++) XBYTE[OFFSET_Holiday+i]=0; KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]);}/************************************功能描述:设置时区函数组成:全局变量:输入:DoorNum, TimezonNum, Timezone ,Access Status返回说明: DoorNum未使用,两门控制器中需加!************************************/void SetTimezone(void){ bit Door1_IsFreeAccess; bit Door2_IsFreeAccess; byte Door2Size=96; RxBuffer[RXB_DATAOFFSET+1] *=6; /*一个时区6 byte*/ /*[2]=Door, [3]=TimeZone Num, [4]-[8]=Time, [9]=Access Status*/ if(RxBuffer[RXB_DATAOFFSET]==1) { XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone]=RxBuffer[RXB_DATAOFFSET+2]; /*start hour */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+1]=RxBuffer[RXB_DATAOFFSET+3]; /*start minute*/ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+2]=RxBuffer[RXB_DATAOFFSET+4]; /*end hour */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+3]=RxBuffer[RXB_DATAOFFSET+5]; /*end minute */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+4]=RxBuffer[RXB_DATAOFFSET+6]; /*week slect status */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+5]=RxBuffer[RXB_DATAOFFSET+7]; /*access status */ KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); } else if(RxBuffer[RXB_DATAOFFSET]==2) { XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+Door2Size]=RxBuffer[RXB_DATAOFFSET+2]; /*start hour */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+1+Door2Size]=RxBuffer[RXB_DATAOFFSET+3]; /*start minute*/ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+2+Door2Size]=RxBuffer[RXB_DATAOFFSET+4]; /*end hour */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+3+Door2Size]=RxBuffer[RXB_DATAOFFSET+5]; /*end minute */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+4+Door2Size]=RxBuffer[RXB_DATAOFFSET+6]; /*week slect status */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+5+Door2Size]=RxBuffer[RXB_DATAOFFSET+7]; /*access status */ KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); } else KSNET_NAK(SlaveADR,RxBuffer[RXB_CMD]); /*门1是否为无限制通行??*/ Door1_IsFreeAccess = Door1_FreeEgress; Door2_IsFreeAccess = Door2_FreeEgress; Door1CheckFreeEgress(); Door2CheckFreeEgress(); if(Door1_IsFreeAccess && !Door1_FreeEgress) { Door1_LOCK=0; /*关门*/ RD0_LED=0; RD0_BEEP=0; Door1_CloseFlag=0; Door1StatusTime=1;/*设置返回位置恢复时间*/ } /*门2是否为无限制通行*/ if(Door2_IsFreeAccess && !Door2_FreeEgress) { Door2_LOCK=0; /*关门*/ RD1_LED=0; RD1_BEEP=0; Door2_CloseFlag=0; Door2StatusTime=1; }}/************************************功能描述:消除时区函数组成:全局变量:输入:返回:************************************/void ClearTimezone(void){ bit Door1_IsFreeAccess; bit Door2_IsFreeAccess; byte Door2Size=96; RxBuffer[RXB_DATAOFFSET+1] *=6; /*一个时区6 byte*/ /*[2]=Door, [3]=TimeZone Num, [4]-[8]=Time, [9]=Access Status*/ if(RxBuffer[RXB_DATAOFFSET]==1) { XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone]=0; /*start hour */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+1]=0; /*start minute*/ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+2]=0; /*end hour */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+3]=0; /*end minute */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+4]=0; /*week slect status */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+5]=0; /*access status */ KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); } else if(RxBuffer[RXB_DATAOFFSET]==2) { XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+Door2Size]=0; /*start hour */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+1+Door2Size]=0; /*start minute*/ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+2+Door2Size]=0; /*end hour */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+3+Door2Size]=0; /*end minute */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+4+Door2Size]=0; /*week slect status */ XBYTE[RxBuffer[RXB_DATAOFFSET+1]+OFFSET_TimeZone+5+Door2Size]=0; /*access status */ KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); } else KSNET_NAK(SlaveADR,RxBuffer[RXB_CMD]); /*门1是否为无限制通行??*/ Door1_IsFreeAccess = Door1_FreeEgress; Door2_IsFreeAccess = Door2_FreeEgress; Door1CheckFreeEgress(); Door2CheckFreeEgress(); if(Door1_IsFreeAccess && !Door1_FreeEgress) { Door1_LOCK=0; /*关门*/ RD0_LED=0; RD0_BEEP=0; Door1_CloseFlag=0; Door1StatusTime=1;/*设置返回位置恢复时间*/ } /*门2是否为无限制通行*/ if(Door2_IsFreeAccess && !Door2_FreeEgress) { Door2_LOCK=0; /*关门*/ RD1_LED=0; RD1_BEEP=0; Door2_CloseFlag=0; Door2StatusTime=1; }}/************************************功能描述:时区复位函数组成:全局变量:输入:返回:************************************/void ResetTimezone(void){ byte i; bit Door1_IsFreeAccess; bit Door2_IsFreeAccess; for(i=0;i<=192;i++) /*2个门共32个时区*/ XBYTE[i+OFFSET_TimeZone]=0; KSNET_ACK(SlaveADR,RxBuffer[RXB_CMD]); Door1_IsFreeAccess = Door1_FreeEgress; Door2_IsFreeAccess = Door2_FreeEgress; Door1CheckFreeEgress(); Door2CheckFreeEgress(); if(Door1_IsFreeAccess && !Door1_FreeEgress) { Door1_LOCK=0; /*关门*/ RD0_LED=0; RD0_BEEP=0; Door1_CloseFlag=0; Door1StatusTime=1;/*设置返回位置恢复时间*/ } if(Door2_IsFreeAccess && !Door2_FreeEgress) { Door2_LOCK=0; /*关门*/ RD1_LED=0; RD1_BEEP=0; Door2_CloseFlag=0; Door2StatusTime=1; }}/************************************功能描述:卡片查找功能函数组成:全局变量:输入:返回:查到卡片 返回0************************************/bit SearchCardFunc(void){ int i,j=RecordLP; DPL=OFFSET_RecordLSB; DPH=OFFSET_RecordMSB; for(i=0;i<j;i++) { if(!SearchCard()) return 0; } return 1; /* error */}/************************************功能描述:受权卡时区设置函数组成:RxBuffer[RXB_ADDR]=ADDR RxBuffer[RXB_CMD]=Function Code RxBuffer[RXB_DATAOFFSET]-RxBuffer[RXB_DATAOFFSET+3]=CardID RxBuffer[RXB_DATAOFFSET+4]=Door Num RxBuffer[RXB_DATAOFFSET+5]=Time Zone Num 全局变量:输入:返回:设置成功 =0说明: 要区分持卡人两个门的不同分区,需要修改"设持卡人时区"为 SetCardTimeZone(byte TimezoneNum,byte DoorNum) 且持卡人的结构时区改为四个字节,前两个字节记录门1时区, 后两个字节记录门2时区.. 由于软件的时区是单个时区号轮下载,可通过"DoorNum" 来设置 持卡人所属时区.************************************/bit SetCardholderTZ(void) { if(RxBuffer[RXB_DATAOFFSET+5] < 16) { if(!SearchCardFunc()) { if(RxBuffer[RXB_DATAOFFSET+4]==1) { SetCardTimeZone(RxBuffer[RXB_DATAOFFSET+5],1); return 0; } else if(RxBuffer[RXB_DATAOFFSET+4]==2) { SetCardTimeZone(RxBuffer[RXB_DATAOFFSET+5],2); return 0; } else return 0; } } return 1; }/************************************功能描述:消除受权卡时区函数组成:全局变量:输入:返回:成功则返回0************************************/bit ClearCardholderTZ(void){ if(RxBuffer[RXB_DATAOFFSET+5] < 16) { if(!SearchCardFunc()) { /* ClearCardTimeZone(RxBuffer[RXB_DATAOFFSET+5]); return 0; */ if(RxBuffer[RXB_DATAOFFSET+4]==1) { ClearCardTimeZone(RxBuffer[RXB_DATAOFFSET+5],1); return 0; } else if(RxBuffer[RXB_DATAOFFSET+4]==2) { ClearCardTimeZone(RxBuffer[RXB_DATAOFFSET+5],2); return 0; } else return 0; } } return 1; /*error */}/************************************功能描述:获取受权卡时区函数组成:全局变量:输入:返回:成功则返回0************************************//*bit GetCardholderValidTZ(void){ if(!SearchCardFunc()) { GetCardTimeZone(); return 0; } return 1; }*//************************************功能描述:受权卡有效时区设置函数组成:全局变量:输入:返回:设置成功 =0************************************/bit SetCardholderValidTZ(void){ if(!SearchCardFunc()) { SetCardTimeZoneValid(); return 0; /*successful */ } return 1; /*error */}/************************************功能描述:增加受权卡函
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -