⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlt645pri.h

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 H
字号:
/*------------------------------------------------------------------*/
/*模块名称:DL/T645.h                                           		*/
/*模块功能:DL/T 645-1997 多功能电能表通讯规约											*/
/*编写日期:2006年11月                                         			*/
/*编写者:  zhangxiaodan																								*/
/*------------------------------------------------------------------*/
#ifndef	_PRI645_H
#define _PRI645_H


#define BIT0		0x0001
#define BIT1		0x0002
#define BIT2		0x0004
#define BIT3		0x0008
#define BIT4		0x0010
#define BIT5		0x0020
#define BIT6		0x0040
#define BIT7		0x0080
#define BIT8		0x0100
#define BIT9		0x0200
#define BIT10		0x0400
#define BIT11		0x0800
#define BIT12 	0x1000
#define BIT13		0x2000
#define BIT14		0x4000
#define BIT15		0x8000

#define	ALLDATA	0x0001	//全数据标志,定时器提供
#define	KWHDATA	0x0002	//电度标志,定时器提供
#define	TIMERCLOCK	0x0004	//对钟标志,定时器提供


#define PosiKWH 	0x9010
#define NegaKWH  	0x9020
#define PosiKVAR	0x9110
#define NegaKVAR	0x9120
#define RTUData		0xb621
#define ALLRTUData	0xb660

#define PosiKWHDB 	0x901F
#define NegaKWHDB  	0x902F
#define PosiKVARDB	0x911F
#define NegaKVARDB	0x912F


#define READCOM		0x1				//读数据
#define READNEXTCOM	0x2			//读后续数据
#define RE_READCOM	0x3			//重读数据
#define WRITECOM	0x4				//写数据
#define SETCLOCK	0x8				//广播校时
#define WRITEADD	0xa				//写设备地址
#define SETBAND		0xc				//更改通讯波特率
#define SETPASSINT16U	0xf		//修改密码
#define CLEAR		0x10				//最大需量清零
#define NEXTFRAME	0x20			//有后续帧
#define ERRACK		0x40			//异常应答
#define SUBSTATIONACK		0x80			//从站发出应答

#define ALLDATATIMER	2//minite
#define CLOCKTIMER	10//minite
#define COUNTERTIMER	1//minite

#define	ALLDATAFLAG	0x0010
#define	CLOCKFLAG	0x0020
#define	KWHFLAG		0x0040
#define	BROADCAST	0x0080
#define	APPTIMEFLAG	0x0008

#define MAXCOMERROR 3

#define RXBUFLEN  sizeof(struct LPDUFRAME)+6
#define TXBUFLEN		100

#define STARTCODE68		0x68		//起始码
#define ENDCODE			0x16		//停止码

#define	MAXERRORNUM	20

enum READKWHSTATUS{READPOSIKWH=0,READNEGAKWH,READPOSIKVAR,READNEGAKVAR};
enum WHMETERSTATUS{BUSY=0,CANUSE};
enum TDLRxdStatus{SEARCHFRAMEHEAD=0,FRAMEPROC};	

struct PDevData{
  	INT16U AINum;
  	INT16U BINum;
		INT16U CounterNum;
};

		
struct PDevInfo{
  	INT16U 		DevID;
  	INT8U 		Addr[6];
  	INT16U 		MAddr;
		INT16U		ComError;
		INT16U		FactDelayTime;
  	struct 		PDevData DevData;
  	enum 			WHMETERSTATUS MeterStatus;
  	INT16U		ReadDataFlag;
  	enum 			READKWHSTATUS	ReadKwhSta;
  
};  


struct LPDUFRAME{
	INT8U StartField1; 	//起始字节
	INT8U A0;	        //站地址
	INT8U A1;	        //站地址
	INT8U A2;	        //站地址	
	INT8U A3;	        //站地址	
	INT8U A4;	        //站地址
	INT8U A5;	        //站地址
	INT8U StartField2; 	//起始字节
  	INT8U Control;
  	INT8U FramLength;
	INT8U LPDU[255];	//数据
	INT8U CheckCode;	       //校验码
	INT8U EndField;	       //结束字符
};

struct LinkInfo
{
	INT16U	Port;
	INT16U	Attr;					//规约
	
	INT16U	RTSONDelay;		//发送等待时间
	INT8U		Medium;				//通道介质	0 1 3 7 9
	INT32U	Baudrate;
	
	INT16U 	MeterCount;
  struct 	MeterAddr *DMeterAddr;
  
  INT16U	RxdHead;	//处理数据的头指针
	INT16U	RxdTail;		
	INT16U	RxdLength;
	INT8U	RxdBuf[RXBUFLEN];	//接收缓冲区
	INT8U	TxdBuf[TXBUFLEN];		//发送缓冲区
	INT8U TxdBufBak[TXBUFLEN];
	INT8U BAKBUFLENGTH;
	BOOL	SUBSTATIONSTATUS;
	BOOL	SUBNEXTFRAME;
	INT8U ERRORWORD;
};


struct AppInfo
 {
  INT16U ProtocolId;
  BOOL	 EnSetClock;
  BOOL	 TimeAllData;
  BOOL	 TimeCounter;
  BOOL	 BroadCastClock;
  INT16U KWHStatus;

	INT32U AllData;  			//召唤全数据间隔 单位:分(minute) 
	INT32U SetClock; 			//对钟间隔 单位:分(minute) 
	INT32U Counter;  			//召唤电度间隔 单位:分(minute) 
	
	INT32U AllDataCount;
	INT32U SetClockCount;
	INT32U DDCounter;
	
	INT16U DelayVal;   		//超时值 单位:10ms
	INT16U DevNum;
	struct PDevInfo	*AppDevs;
	INT8U  CurDevNo;
};

struct AllData
{
	INT16U	Ua;
	INT16U	Ub;
	INT16U	Uc;
	
	INT16U	Ia;
	INT16U	Ib;
	INT16U	Ic;
	
	INT16U	Ptotal;					//这个字段为三个字节,减少一个字节
	INT16U	Pa;
	INT16U	Pb;
	INT16U	Pc;
	
	INT16U	Qtotal;
	INT16U	Qa;
	INT16U	Qb;
	INT16U	Qc;
};

struct DDdata
{
	INT32U 	DDtotal;			//电能总
	INT32U 	DDtine;				//尖费率
	INT32U	DDapex;				//峰费率
	INT32U	DDflat;				//平费率
	INT32U	DDvale;				//谷费率
};

#define MINIFRAMELEN 14//最小帧长度
#define CHECKSUMPOS  10//校验字节位置
#define LASTFLAGOPOS 11//结束字符位置

void DLT645_1997PriTask(struct SysPort *Info, struct PortAppInfo* PortCfg);
BOOL DLT645InitPriLink(INT8U Port, struct PortAppInfo* PortCfg);
BOOL DLT645InitPriApp(INT8U Port, struct PortAppInfo* PortCfg);
INT16U GetDevIDByAddr(INT8U Port,INT8U *Addr);
INT16U GetActDevNoByDevID(INT8U Port,INT16U DevID);
INT16U GetNextActDevNo(INT8U Port,INT16U DevNo);
INT16U BcdToBin(INT16U BCD);
INT32U BcdToBin8(unsigned char *BCD);
INT16U  BinToBcd(INT16U i);
BOOL DevDispatch(INT8U Port);
void DLT645RecMISIData(INT8U Port, BOOL Flag);
BOOL DLT645HeadFun68(INT8U Port);
INT8U DLT6465CheckSum(INT8U *Buf,INT8U Num);
void DLT645APP(INT8U Port);
void DLT645SearchFrame(INT8U Port);
void READDATA(INT8U Port,INT16U FuntionCode);
void BROADCASTCLOCK(INT8U Port);
INT16U DELAYTIME(INT8U Port,INT16U DataLength);
BOOL PRI645SCHEDULE(INT8U Port);

void SetAllDataFlag(INT8U Port);
void SetClockFlag(INT8U Port);
void ClrClockFlag(INT8U Port);
void SetKWHFlag(INT8U Port);
void SendBakData(INT8U Port);
void SetComYxStatus(INT8U Port,BOOL Flag);
void RecAllData(INT8U Port,INT8U *Buf);
void RecKWH(INT8U Port,INT8U *Buf);
BOOL ReadComYxStatus(INT8U Port);
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -