亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dlt645pri.c

?? 詳細介紹了arm7-at91r40008,的開發(fā)全過程
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*------------------------------------------------------------------*/
/*模塊名稱:DL/T645.c                                            		*/
/*模塊功能:DL/T 645-1997 多功能電能表通訊規(guī)約											*/
/*編寫日期:2006年11月                                         			*/
/*編寫者:  zhangxiaodan																						*/
/*------------------------------------------------------------------*/

#include "includes.h"
#include "dlt645pri.h"

extern struct DBConfig		*DBCfgs;
extern struct LinkInfo* ComLink[PORTNUM];
extern struct AppInfo* ComApp[PORTNUM];
extern struct SysPort*	ComDb[PORTNUM];

/*------------------------------------------------------------------*/
/*函數(shù)名稱:DLT645_1997PriTask()																				*/
/*函數(shù)功能:DL/T 645-1997 多功能電能表規(guī)約主站方任務(wù)								*/
/*------------------------------------------------------------------*/
void DLT645_1997PriTask(struct SysPort *Info, struct PortAppInfo* PortCfg)
{
	BOOL	flag;
	INT8U	i, err;
	INT16U	events;

	i = Info->PortID - 1;
	
	//初始化
	ComLink[i] = (void*) malloc (sizeof (struct LinkInfo));
	ComApp[i] = (void*) malloc (sizeof (struct AppInfo));
	if ((ComLink[i] == NULL) || (ComApp[i] == NULL))
		return ;
	else
	{
		memset (ComLink[i], 0, sizeof (struct LinkInfo));
		memset (ComApp[i], 0, sizeof (struct AppInfo));
	}
	
	ComDb[i] = Info;
	flag = DLT645InitPriLink(i+1, PortCfg);
	if (!flag)
	{
		free (ComLink[i]);
		ComDb[i] = NULL;
		return ;
	}
	flag = DLT645InitPriApp(i+1, PortCfg);
	if (!flag)
	{
		free (ComApp[i]);
		ComDb[i] = NULL;
		return ;
	}
	
	DLT645RecMISIData(Info->PortID,FALSE);
	
	OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
	while (1)
	{
		events = OSFlagPend(Info->Event, TIME100MS+FTXNEXT,
			OS_FLAG_WAIT_SET_ANY+OS_FLAG_CONSUME, 0, &err);
		
		if (events & FTXNEXT)	//繼續(xù)處理
		{
			PRI645SCHEDULE(Info->PortID);
		}		
		//定時處理區(qū)(100MS)
		if(events & TIME100MS)
		{
			if(ComApp[i]->AppDevs[ComApp[i]->CurDevNo].FactDelayTime)
			{
				ComApp[i]->AppDevs[ComApp[i]->CurDevNo].FactDelayTime--;
				if(!ComApp[i]->AppDevs[ComApp[i]->CurDevNo].FactDelayTime)
				{
					if(ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError > MAXCOMERROR)
					{
						if(ReadComYxStatus(i+1))
							SetComYxStatus(i+1,FALSE);						//寫通訊狀態(tài) 分
						ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError = 0;
						ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ReadDataFlag = 0;
						OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
					}
					else
					{
						ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError++;
						SendBakData(i+1);//發(fā)重復(fù)幀
					}
				}
			}
			
			ComApp[i]->AllDataCount++;
			if(ComApp[i]->AllDataCount >= ComApp[i]->AllData)
			{
				SetAllDataFlag(i+1);//置全數(shù)據(jù)標志
				ComApp[i]->AllDataCount = 0;
				OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
			}
			
			ComApp[i]->SetClockCount++;
			if(ComApp[i]->SetClockCount >= ComApp[i]->SetClock)
			{
				SetClockFlag(i+1);//置對鐘標志
				ComApp[i]->SetClockCount = 0;
				OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
			}
			
			ComApp[i]->DDCounter++;
			if(ComApp[i]->DDCounter >= ComApp[i]->Counter)
			{
				SetKWHFlag(i+1);//置讀電度標志
				ComApp[i]->DDCounter = 0;
				OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
			}
			
			DLT645RecMISIData(Info->PortID,TRUE);
		}	
		
	}
}
BOOL DLT645InitPriLink(INT8U Port, struct PortAppInfo* PortCfg)
{
	INT8U	i;
	struct PPri645Pad *pPad;
	
	i = Port - 1;
	pPad = (struct PPri645Pad*)(PortCfg->pPad);
	
	ComLink[i]->Port = PortCfg->Port;
	ComLink[i]->Attr = PortCfg->Attr;
	ComLink[i]->RTSONDelay = PortCfg->RTSONDelay;
	ComLink[i]->Medium = PortCfg->Medium;
	ComLink[i]->Baudrate = PortCfg->Baudrate;
	ComLink[i]->MeterCount = pPad->MeterCount;
	ComLink[i]->DMeterAddr = (struct MeterAddr*)malloc(sizeof(struct MeterAddr)*ComLink[i]->MeterCount);
	if(ComLink[i]->DMeterAddr == NULL)
			return FALSE;

	ComLink[i]->RxdHead = 0;
	ComLink[i]->RxdTail = 0;
	ComLink[i]->RxdLength = 0;
	return TRUE;
}
BOOL DLT645InitPriApp(INT8U Port, struct PortAppInfo* PortCfg)
{
	INT8U	i, j, k;
	INT16U xuhao;
	struct PPri645Pad *pPad;
	
	i = Port - 1;
	pPad = (struct PPri645Pad*)(PortCfg->pPad);
	

	if((pPad->CmdControl&BIT0) != FALSE)				//對鐘使能
		ComApp[i]->EnSetClock = TRUE;
		
	if((pPad->CmdControl&BIT1) != FALSE)				//定時召喚全數(shù)據(jù)
		ComApp[i]->TimeAllData = TRUE;

	if((pPad->CmdControl&BIT2) != FALSE)				//定時召喚電度
		ComApp[i]->TimeCounter = TRUE;

	if((pPad->CmdControl&BIT3) != FALSE)				//廣播對鐘
		ComApp[i]->BroadCastClock = TRUE;

	if(pPad->AllData < 1)
		pPad->AllData = 1;
	if(pPad->SetClock < 1440)
		pPad->SetClock = 1440;
	if(pPad->Counter < 1)
		pPad->Counter = 1;
	
	ComApp[i]->AllData = pPad->AllData*60*10;
	ComApp[i]->SetClock = pPad->SetClock*60*10;
	ComApp[i]->Counter = pPad->Counter*60*10;

	ComApp[i]->AllDataCount = 0;
	ComApp[i]->SetClockCount = 0;
	ComApp[i]->DDCounter = 0;
	
	ComApp[i]->DelayVal = pPad->DelayVal;
	ComApp[i]->DevNum = pPad->MeterCount;
	
	ComApp[i]->AppDevs = (struct PDevInfo*)malloc(sizeof(struct PDevInfo)*ComApp[i]->DevNum);
	if(ComApp[i]->AppDevs == NULL)
		return FALSE;

	for(j = 0;j < ComApp[i]->DevNum; j++)
	{
		ComApp[i]->AppDevs[j].DevID = GetDevIDOfName(pPad->AddrList[j].UserName);
		for(k = 0;k < 6;k++)
			ComApp[i]->AppDevs[j].Addr[k] = pPad->AddrList[j].ADDR[k];
		xuhao = GetActDevNoByDevID(i+1,ComApp[i]->AppDevs[j].DevID);
		ComApp[i]->AppDevs[j].MAddr = ComDb[i]->DBCfgs[xuhao].MAddress;
		ComApp[i]->AppDevs[j].ComError = 0;
		ComApp[i]->AppDevs[j].FactDelayTime = 0;
		ComApp[i]->AppDevs[j].DevData.AINum = ComDb[i]->DBCfgs[xuhao].YCNum;
		ComApp[i]->AppDevs[j].DevData.BINum = ComDb[i]->DBCfgs[xuhao].YXNum;
		ComApp[i]->AppDevs[j].DevData.CounterNum = ComDb[i]->DBCfgs[xuhao].DDNum;
		if(ComApp[i]->TimeAllData)
			ComApp[i]->AppDevs[j].ReadDataFlag |= ALLDATAFLAG;
		if(ComApp[i]->TimeCounter)
		{
			ComApp[i]->AppDevs[j].ReadDataFlag |= KWHFLAG;
			ComApp[i]->KWHStatus = PosiKWHDB;
		}
		if(ComApp[i]->EnSetClock)
			ComApp[i]->AppDevs[j].ReadDataFlag |= CLOCKFLAG;
		if(ComApp[i]->BroadCastClock)
			ComApp[i]->AppDevs[j].ReadDataFlag |=BROADCAST;
	}
	return TRUE;

}

//設(shè)備調(diào)度函數(shù)
BOOL DevDispatch(INT8U Port)
{
		INT8U i = 0,j = 0;
    INT16U DevNo,OldDevNo;
    INT32U zxd,zxd1;
 		i = Port - 1;   
    DevNo=ComApp[i]->CurDevNo;
    OldDevNo = DevNo;
    zxd = ComApp[i]->AppDevs[DevNo].ReadDataFlag;
    zxd1 = (~(ALLDATAFLAG|KWHFLAG));
    while((ComApp[i]->AppDevs[DevNo].ReadDataFlag & (ALLDATAFLAG|KWHFLAG))== 0)
    {
      DevNo=GetNextActDevNo(Port,DevNo);
      j++;
      ComApp[i]->KWHStatus = PosiKWHDB;
      if(j>=ComApp[i]->DevNum)
              return FALSE;
    }
    ComApp[i]->CurDevNo=DevNo;
    return TRUE;
}

/*----------------------------------------------------------------------------------*/
/*函數(shù)名稱:GetDevIDByAddr(INT8U Port,INT8U *Addr)																	*/
/*函數(shù)功能:通過電能表地址獲得設(shè)備的ID號																						*/
/*----------------------------------------------------------------------------------*/
INT16U GetDevIDByAddr(INT8U Port,INT8U *Addr)
{
	INT8U i,j;
	i = Port - 1;
	for(j = 0;j < ComApp[i]->DevNum;j++)
	{
		if(!memcmp(ComApp[i]->AppDevs[j].Addr,Addr,6))
			return (ComApp[i]->AppDevs[j].DevID);
	}
	return 0xffff;
}
/*----------------------------------------------------------------------------------*/
/*函數(shù)名稱:GetActDevNoByDevID(INT8U Port,INT16U DevID)															*/
/*函數(shù)功能:通過電能表ID號獲得設(shè)備的序號																						*/
/*----------------------------------------------------------------------------------*/
INT16U GetActDevNoByDevID(INT8U Port,INT16U DevID)
{
	INT8U i,j;
	i = Port - 1;
	for(j = 0;j < ComDb[i]->DevNum;j++)
	{
		if(DevID == ComDb[i]->DBCfgs[j].DevID)
			return j;
	}
	return 0xffff;
}
INT16U GetNextActDevNo(INT8U Port,INT16U DevNo)
{
	INT8U i;
	i = Port - 1;
	return ((DevNo+1)%ComApp[i]->DevNum);
}
/*BCD轉(zhuǎn)換二進制*/
INT16U BcdToBin(INT16U BCD)
{
        short i;
        i= (BCD&0xf)+(((BCD>>4)&0xf)*10)+(((BCD>>8)&0xf)*100)+(((BCD>>12)&0x7)*1000);
        if(BCD & 0x8000)
                return((~i) + 1);       
        else
                return(i);
}

INT32U BcdToBin8(unsigned char *BCD)
{
        return(((*BCD)&0xf)+((*(BCD)>>4)*10)+((*(BCD+1)&0xf)*100)+((*(BCD+1)>>4)*1000)
        
                +((*(BCD+2)&0xf)*10000)+((*(BCD+2)>>4)*100000)+((*(BCD+3)&0xf)*1000000)+((*(BCD+3)>>4)*10000000));

}

/*二進制轉(zhuǎn)換BCD*/
INT16U  BinToBcd(INT16U i)
{
        return(i%10+((i/10)<<4));
}

/*------------------------------------------------------------------*/
/*函數(shù)名稱:DLT645RecMISIData()										*/
/*函數(shù)功能:接收MISI數(shù)據(jù)											*/
/*------------------------------------------------------------------*/
void DLT645RecMISIData(INT8U Port, BOOL Flag)
{
	INT16U	i, count;
	
	i = Port - 1;
	count = Readx((INT8U *)&ComLink[i]->RxdBuf[ComLink[i]->RxdTail], RXBUFLEN, Port);
	if (count == 0)
		return ;
	
	lseek(Port, count);
	
	if (Flag)
	{
		ComLink[i]->RxdTail += count;
		DLT645SearchFrame(Port);
	}
}

void DLT645SearchFrame(INT8U Port)
{
	INT8U	i, err, tmp, num;
	i = Port - 1;
	
	while (ComLink[i]->RxdHead < ComLink[i]->RxdTail)
 	{
			if (ComLink[i]->RxdBuf[ComLink[i]->RxdHead] != STARTCODE68)
			{
				ComLink[i]->RxdHead++;
				continue;
			}

 			//找到后,清除無用的緩沖區(qū)報文
 			if (ComLink[i]->RxdTail > ComLink[i]->RxdHead)
 			{
 				memcpy (ComLink[i]->RxdBuf, &ComLink[i]->RxdBuf[ComLink[i]->RxdHead], ComLink[i]->RxdTail - ComLink[i]->RxdHead);
 				ComLink[i]->RxdTail -= ComLink[i]->RxdHead;
 				ComLink[i]->RxdHead = 0;
 			}

			ComLink[i]->RxdLength = ComLink[i]->RxdTail - ComLink[i]->RxdHead;
			
			if (ComLink[i]->RxdLength >= 10)
			{
				if (!DLT645HeadFun68(Port))
				{
        	ComLink[i]->RxdHead++;
        	continue;
        }
       	else
       	{
       		num = ComLink[i]->RxdBuf[ComLink[i]->RxdHead+9];
       		if (ComLink[i]->RxdLength >= (num + 12))	//報文收全
					{
						tmp = (INT8U)DLT6465CheckSum((void*)&ComLink[i]->RxdBuf[ComLink[i]->RxdHead], num+10);
						if ((ComLink[i]->RxdBuf[num+10] == tmp)
							&& (ComLink[i]->RxdBuf[num+11] == ENDCODE))
       			{
     						DLT645APP(Port);
     						if (ComLink[i]->RxdTail >= ComLink[i]->RxdHead)
								{
									ComLink[i]->RxdTail -= (num + 12);
									ComLink[i]->RxdHead = 0;
									OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
								}
       			}
   					else
   					{
     						ComLink[i]->RxdHead += (num+12);  
       					if (ComLink[i]->RxdTail > ComLink[i]->RxdHead)
					 			{
					 				ComLink[i]->RxdLength = ComLink[i]->RxdTail - ComLink[i]->RxdHead;
					 				memcpy (ComLink[i]->RxdBuf, &ComLink[i]->RxdBuf[ComLink[i]->RxdHead], ComLink[i]->RxdLength);
					 				ComLink[i]->RxdHead = 0;
					 				ComLink[i]->RxdTail = ComLink[i]->RxdLength;
					 			}
   					}
       		}
       			else
       				break;
       	}
			}
			else
				break;
 				
 		}
 		
}
/*------------------------------------------------------------------*/
/*函數(shù)名稱:DLT645HeadFun68()											*/
/*函數(shù)功能:檢測68幀頭正確性										*/
/*------------------------------------------------------------------*/
BOOL DLT645HeadFun68(INT8U Port)
{
	INT8U	i;
	
	i = Port - 1;

	if (STARTCODE68 != ComLink[i]->RxdBuf[ComLink[i]->RxdHead])
		return (FALSE);
	if (STARTCODE68 != ComLink[i]->RxdBuf[ComLink[i]->RxdHead + 7])
		return (FALSE);

	return (TRUE);
}

INT8U DLT6465CheckSum(INT8U *Buf,INT8U Num)
{
	INT8U sum = 0;
	while(Num--)
	{
		sum +=*Buf++ & 0xff;
	}
	return sum;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www国产亚洲精品久久麻豆| 国产日韩精品久久久| 色哦色哦哦色天天综合| 成人免费看的视频| 成人午夜激情片| 成人午夜看片网址| 99久久精品免费看| 成人av资源下载| 99久久99久久精品免费观看| 99久久精品费精品国产一区二区| 成人开心网精品视频| 91免费观看在线| 色琪琪一区二区三区亚洲区| 在线观看一区二区视频| 日本大香伊一区二区三区| 91传媒视频在线播放| 91久久久免费一区二区| 欧美日韩精品一区二区在线播放| 欧美亚洲一区二区在线观看| 欧美放荡的少妇| 精品国产凹凸成av人网站| 精品久久久久久久久久久久久久久| 久久久久久一级片| 亚洲国产精品av| 亚洲精品成人a在线观看| 亚洲第一主播视频| 美女mm1313爽爽久久久蜜臀| 国产一区二区在线观看免费| 暴力调教一区二区三区| 欧美亚洲日本一区| 日韩一区二区在线看| 国产亚洲综合性久久久影院| ...xxx性欧美| 天天色综合天天| 国产成人在线影院| 欧美最猛黑人xxxxx猛交| 中文字幕佐山爱一区二区免费| 亚洲自拍偷拍欧美| 美国欧美日韩国产在线播放| 国产精品99久久久久久久vr| 色综合中文综合网| 久久九九久精品国产免费直播| 中文字幕免费一区| 午夜欧美视频在线观看| 国产一区二三区| 欧美丝袜自拍制服另类| 久久伊人蜜桃av一区二区| 亚洲免费在线视频| 精品一区中文字幕| 日本二三区不卡| 2020国产精品| 一区二区三区欧美激情| 狠狠色丁香婷婷综合| 色哟哟一区二区在线观看| 欧美tickling网站挠脚心| 国产精品久久久久影视| 日本伊人午夜精品| 波多野结衣视频一区| 91精品欧美综合在线观看最新| 国产视频不卡一区| 日韩av电影免费观看高清完整版在线观看 | 国产欧美日韩在线观看| 亚洲综合在线观看视频| 国产大陆精品国产| 日韩欧美的一区二区| 亚洲综合视频在线| av午夜精品一区二区三区| 日韩女优制服丝袜电影| 欧美男人的天堂一二区| 欧美性极品少妇| 国产精品高潮呻吟| 国产在线一区二区| 欧美一区二区三区喷汁尤物| 亚洲激情一二三区| 成人动漫一区二区| 国产亚洲精品福利| 久久99精品久久只有精品| 欧美日韩在线亚洲一区蜜芽| 亚洲免费在线看| 99视频精品全部免费在线| 国产亚洲一二三区| 久久99久久99小草精品免视看| 欧美日韩一卡二卡| 亚洲精品乱码久久久久久久久| www.日韩大片| 国产精品欧美久久久久无广告| 国产一区二区三区视频在线播放| 制服丝袜亚洲色图| 亚洲一区二区三区四区五区黄 | 日韩欧美国产高清| 日本在线不卡一区| 欧美一区二区三区四区在线观看| 亚洲综合激情网| 91久久人澡人人添人人爽欧美| 中文字幕日韩一区| 成年人网站91| 国产精品青草综合久久久久99| 国产乱码精品一区二区三区av| 精品国产乱码久久| 国内成+人亚洲+欧美+综合在线 | 亚洲制服丝袜av| 日本精品一区二区三区高清 | 欧美一二区视频| 国产日产精品一区| 国产激情视频一区二区在线观看| 日韩免费一区二区| 奇米一区二区三区| 日韩精品一区二区三区在线 | 欧美男男青年gay1069videost| 亚洲高清视频在线| 欧美巨大另类极品videosbest | 国产亚洲1区2区3区| 国产精品一品二品| 中文字幕一区免费在线观看| 不卡av在线免费观看| 日韩伦理电影网| 91福利资源站| 日韩专区在线视频| 欧美电影免费观看高清完整版在线 | 日本不卡视频一二三区| 日韩午夜小视频| 国产精品一区二区三区99| 国产亚洲欧美日韩日本| 不卡影院免费观看| 亚洲国产视频a| 日韩丝袜美女视频| 国产成人精品亚洲午夜麻豆| 1024精品合集| 欧美一区二区视频免费观看| 久久精品国产在热久久| 国产精品免费丝袜| 欧美日本在线一区| 久久成人久久鬼色| 一色桃子久久精品亚洲| 日本精品一级二级| 日韩电影在线免费观看| 国产片一区二区三区| 色欧美88888久久久久久影院| 日韩国产欧美在线视频| 国产欧美日韩一区二区三区在线观看| 色婷婷久久综合| 麻豆精品久久精品色综合| 国产欧美视频在线观看| 欧美主播一区二区三区| 国产中文字幕精品| 夜夜嗨av一区二区三区网页| 在线播放国产精品二区一二区四区 | 国产一区二区视频在线| 亚洲女人****多毛耸耸8| 日韩欧美你懂的| 99精品久久免费看蜜臀剧情介绍| 天天操天天色综合| 国产精品色在线观看| 欧美美女一区二区在线观看| 国产一区二区成人久久免费影院| 亚洲精品网站在线观看| 欧美成人vps| 在线观看日韩电影| 国产精品99久久久久久有的能看| 亚洲影视在线观看| 国产日产欧美一区二区三区| 欧美二区三区的天堂| 91视频com| 国产乱人伦精品一区二区在线观看| 一级特黄大欧美久久久| 国产精品人成在线观看免费| 日韩网站在线看片你懂的| 欧美亚洲动漫另类| 成a人片亚洲日本久久| 狠狠色2019综合网| 日韩黄色小视频| 亚洲色图欧洲色图| 国产亚洲欧美日韩在线一区| 3d动漫精品啪啪1区2区免费| 99v久久综合狠狠综合久久| 国内精品伊人久久久久影院对白| 亚洲第一成人在线| 中文字幕日韩一区| 中文字幕的久久| 精品成人a区在线观看| 欧美一卡2卡3卡4卡| 欧美亚洲免费在线一区| 91久久免费观看| 91女神在线视频| www.欧美亚洲| 成人免费福利片| 国产999精品久久久久久绿帽| 玖玖九九国产精品| 麻豆精品在线视频| 日本三级亚洲精品| 丝袜国产日韩另类美女| 亚洲国产日韩综合久久精品| 亚洲精品视频一区二区| 国产精品不卡一区| 国产精品电影一区二区三区| 国产偷国产偷精品高清尤物| xnxx国产精品| 久久久精品天堂| 国产日韩欧美精品一区| 国产日韩亚洲欧美综合|