📄 cjq.h
字号:
// 全部: 测试全部,特征字序号从零开始,表序号加1,继续下个
//抄表任务: 可能对单只,也可能对全部
// 单只: 一只电表测试完成后开始此电表的单只抄读任务
// 即使有连续多只电表也没有关系,但是必须保证抄表任务优先级高于测试任务
// 全部: 到达抄表时间
#define c_TaskAllStart 0x31 //全部电表任务
#define c_TaskOneStart 0x32 //单表任务
//...Task.Sta 自动任务状态
#define c_TaskRun 0x41 //任务开始
//2。常数数组定义
//用来判断存储器是否初始化,长度不能大于7
const unsigned char RomFMMark[] = "CJQ_50";
#define l_FMMark 6u
//广播地址
const unsigned char RomBroadID[] = {0x99,0x99,0x99,0x99,0x99,0x99};
//存储器内空表号
//const unsigned char RomFreeID[] = {0xff,0xff,0xff,0xff,0xff,0xff};
//;[]-------------------------------------
//; 电表特征字表
//; 7 对901F的支持, 1:表示支持, 0:不支持
//; 6 支持分量抄读9010
//; 5 9011 需要测试才能确定
//; 4 9012 需要测试才能确定
//; 3 9013 需要测试才能确定
//; 2 9014 需要测试才能确定
//; 1,0 支持前导符的个数 00:不需要 01:需要一个 10需要两个
//;[]-------------------------------------
#define bsf_901f 0b10000000 //设置时用
#define bsf_9010 0b01000000
#define bsf_9011 0b00100000
#define bsf_9012 0b00010000
#define bsf_9013 0b00001000
#define bsf_9014 0b00000100
#define bcf_901f 0b01111111 //判断用
#define bcf_9010 0b10111111
#define bcf_9011 0b11011111
#define bcf_9012 0b11101111
#define bcf_9013 0b11110111
#define bcf_9014 0b11111011
#define bsf_9011_4 0b00111100 //获取11~14支持项
// const unsigned char RomMeterMark[] = {
// 0b10000010, //2FE, 901F
// 0b10000000, //0FE, 901F
// 0b01111110, //2FE, 9010
// 0b01111100, //0FE, 9010
// 0b01111101, //1FE, 9010
// 0b10000001}; //1FE, 901F //必须放到最后!!
// #define c_DefaltMark 0b100000010
// #define c_MarkAmount 0x06u
const unsigned char RomMeterMark[] = {
0b10000010, //2FE, 901F
0b01111110 //2FE, 9010
};
#define c_DefaltMark 0b100000010
#define c_MarkAmount 0x02u
//3. 常量定义
//645规约常量定义
#define c_Offset68_1 0x00u
#define c_Offset68_2 0x07u
#define c_OffsetC 0x08u
#define c_OffsetL 0x09u
#define c_OffsetDI0 0x0au
#define c_OffsetDI1 0x0bu
#define c_OffsetData 0x0cu
#define c_DefaltLen 12u //645规约除了数据域以外所有字节长度,包括CS 16
//68 ID 68 C L (DI0 DI1 data) CS 16
//普通常量
#define c_Baud_9600 0x11 //11.0592M,标准串口波特率
#define c_Baud_4800 0x23 //
#define c_Baud_2400 0x47 //
#define c_Baud_1200 0x8F //
#define c_BaudMark12 0x00 //485口波特率标志, 1200
#define c_BaudMark24 0x10 //2400
#define c_BaudMark48 0x20 //4800
#define _frame_97 0x00 //97版645规约
#define _frame_07 0x55 //07版645规约
#define c_SimBaud 0x47 //11.0592M模拟波特率,配合T2CON 实现1200和9600
#define c_Port_Plc 0x11
#define c_Port_485 0x22
#define c_Port_Irf 0x33
#define c_10MsTimeH 0x94 //用于10ms定时,Timer1定时器
#define c_RTCSlaveAddr 0b01100101 //最后一位0:写, 1:读
#define c_RTCINTA1Hz 0b00100011 //INTA 输出1Hz, 24小时制
#define c_RTCINTAOFF 0b00100000 //INTA 无输出, 24小时制
#define c_RTCINTB 0b10100000 //1.3V复位
#define _TRUE 0x01u
#define _FALSE 0x00u
//5. 程序运行标识
#define c_putStrFM 0x01
#define c_FMInit 0x02
#define c_FMSet 0x03
#define c_putStrRTC 0x04
//6. 寄存器初始化常量
#define c_Pcon 0x03
#define c_ADcon0 0x00
#define c_ADcon1 0x06
#define c_TrisA 0x04
#define c_TrisB 0x38
#define c_TrisC 0xA0
#define c_TrisD 0x00
#define c_Option 0x0F //分频器分配给WDT,最大分频。128*18ms
#define c_INTcon 0xc8 //使能B口电平变化中断
#define c_Pie1 0x01 //使能timer1中断,10ms一次
#define c_Pie2 0x00
#define c_T1con 0x01 //使能timer1, 10ms基数计数用
#define c_T2con9600 0x01 //00000001=1:4(9600, used PLCI36M)
#define c_T2con1200 0x0A //00001010=0AH=1:32(1200 used PLCI36C, infrared)
#define c_T2con38kHz 0x04 //pwm 38kHz 输出用到
#define c_SSPcon 0x00
#define c_SSPcon2 0x00
#define c_CCP2con 0x00
#define c_TXsta 0x62
#define c_RCsta 0xD0
#define c_CCP1con 0x3C //pwm out PORTC2
#define c_PR2 0x47 //pwm 38KHz
#define c_CCPR1L 0x23 //50%
//7. 内存划分
#define c_BuffMax 57 //帧最大长度,数据域长度要小于57-18=39字节
//所有通信数据都放在高两BANK
bank1 unsigned char BuffPLC[c_BuffMax]; //载波通信
bank1 unsigned char lastCommBack[10]; //只备份DI0 DI1 ID(6),每次485通信不成功必须清零!!
bank2 unsigned char TestMeterID[6]; //测试表类型存放表号
bank2 unsigned char MeterID[6]; //指令处理中使用表号
bank2 unsigned char RtMeterID[6]; //实时抄表使用表号
bank2 unsigned char AmrMeterID[6]; //自动抄表流程中存放表号
bank2 unsigned char CollectorID[6]; //采集器号
bank2 unsigned char Consume[21]; //暂存电量
bank2 unsigned char tempBuff[24]; //不能设置小于24
bank3 unsigned char Buff485[c_BuffMax-10];//抄读485表
bank3 unsigned char timerBuff[7]; //ss mm hh dd ww mm yy => s m h d m y
#define ss 0
#define min 1
#define hh 2
#define dd 3
#define mon 4
#define yy 5
bank3 unsigned char tempBuff1[6]; //临时缓冲区
bank3 unsigned char RtData[24]; //透传指令数据域,并作为上次通信返回数据的备份
//从DI0,DI1开始备份
#define c_DownData 0x55 //数据下发标志
#define c_UpData 0xaa //数据上传标志
//8. 外存划分,使用AT24C64共8K字节
#define a_FMMark 0x0000 //7,标识铁电是否初始化
#define a_AmrSpace 0x0007 //1,抄表间隔
#define a_CollecterID 0x0008 //6,采集器地址, 6字节
#define a_FreezeTime 0x000e //2,冻结日时,(时在低位)
#define a_24ConMark 0x0010 //2,两块24点电量区域对应日期
#define a_OnOffSta 0x0012 //7,时间+状态
#define a_baud 0x0020 //1, 485通信速率标示
#define a_MeterID 0x0040 //连续存储32只电表表号,共192字节(0x0040~0x00FF)
//0x0100开始存放每只电表相关信息
#define c_OneSize 248 //每只表占用248字节存储空间
#define a_FalseNO 0x0100 //1,第一只表失败次数,
#define a_protocol_mark a_FalseNO+1 //_frame_97 or _frame_07
#define a_MeterMark a_protocol_mark+1 //1,
#define a_Consume a_MeterMark+1 //21,第一只表电量起始地址,21字节,首字节为长度
#define a_FzConsume a_Consume+21 //22,第一只表冻结电量起始地址,首字节日期,次字节长度
// 日期可作有效判断
#define a_24Consume0 a_FzConsume+22 //4*24=96,24点电量
#define a_24Consume1 a_24Consume0+96 //4*24=96,必须相连!!
#define c_24ConLen 96 //重点数据长度
//常数数组定义
#define Reset() asm("goto $")
#define ClrWdt() asm("clrwdt")
#define Nop() asm("nop")
#define uc unsigned char
#define ui unsigned int
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -