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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dlt645pri.c

?? 詳細介紹了arm7-at91r40008,的開發全過程
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*------------------------------------------------------------------*/
/*模塊名稱:DL/T645.c                                            		*/
/*模塊功能:DL/T 645-1997 多功能電能表通訊規約											*/
/*編寫日期: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];

/*------------------------------------------------------------------*/
/*函數名稱:DLT645_1997PriTask()																				*/
/*函數功能:DL/T 645-1997 多功能電能表規約主站方任務								*/
/*------------------------------------------------------------------*/
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)	//繼續處理
		{
			PRI645SCHEDULE(Info->PortID);
		}		
		//定時處理區(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);						//寫通訊狀態 分
						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);//發重復幀
					}
				}
			}
			
			ComApp[i]->AllDataCount++;
			if(ComApp[i]->AllDataCount >= ComApp[i]->AllData)
			{
				SetAllDataFlag(i+1);//置全數據標志
				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)				//定時召喚全數據
		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;

}

//設備調度函數
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;
}

/*----------------------------------------------------------------------------------*/
/*函數名稱:GetDevIDByAddr(INT8U Port,INT8U *Addr)																	*/
/*函數功能:通過電能表地址獲得設備的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;
}
/*----------------------------------------------------------------------------------*/
/*函數名稱:GetActDevNoByDevID(INT8U Port,INT16U DevID)															*/
/*函數功能:通過電能表ID號獲得設備的序號																						*/
/*----------------------------------------------------------------------------------*/
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轉換二進制*/
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));

}

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

/*------------------------------------------------------------------*/
/*函數名稱:DLT645RecMISIData()										*/
/*函數功能:接收MISI數據											*/
/*------------------------------------------------------------------*/
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;
			}

 			//找到后,清除無用的緩沖區報文
 			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;
 				
 		}
 		
}
/*------------------------------------------------------------------*/
/*函數名稱:DLT645HeadFun68()											*/
/*函數功能:檢測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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区国产| 麻豆成人免费电影| av电影天堂一区二区在线观看| 精品国产伦一区二区三区观看体验 | 成人a级免费电影| 精品国产成人系列| 久久精品国产秦先生| 91精品麻豆日日躁夜夜躁| 婷婷综合在线观看| 这里是久久伊人| 麻豆精品在线视频| 日韩欧美电影一区| 日韩电影在线一区二区| 欧美一区二区在线不卡| 日韩av电影天堂| 日韩一区二区三区视频在线| 美女在线视频一区| 久久久久久亚洲综合影院红桃| 国产一区二区三区免费播放| 久久久五月婷婷| 成人黄色a**站在线观看| 国产精品久久久久久久第一福利| 成人白浆超碰人人人人| 亚洲欧美日韩久久精品| 欧美四级电影网| 日本人妖一区二区| 精品欧美一区二区久久| 国产酒店精品激情| 国产精品久久久久影院| 在线观看www91| 日韩av在线播放中文字幕| 日韩精品专区在线影院重磅| 国产美女精品一区二区三区| 国产精品日韩成人| 在线一区二区三区四区五区 | 99久久综合国产精品| 亚洲免费视频中文字幕| 欧美日韩午夜在线视频| 久草热8精品视频在线观看| 国产精品天干天干在线综合| 色婷婷综合久久久中文一区二区| 午夜精品久久久久| www国产亚洲精品久久麻豆| av不卡一区二区三区| 香蕉乱码成人久久天堂爱免费| 精品久久久久久久久久久久久久久久久 | 国产老肥熟一区二区三区| 久久久国产精品午夜一区ai换脸| 成人精品免费网站| 一区二区三区产品免费精品久久75| 欧美老肥妇做.爰bbww| 国产伦精品一区二区三区在线观看 | 欧美日本精品一区二区三区| 另类小说图片综合网| 国产精品久久久久影院| 欧美午夜精品一区二区蜜桃| 麻豆国产精品官网| 中文字幕一区二区三区不卡在线| 欧美日韩国产另类不卡| 岛国一区二区三区| 亚洲成av人片在线| 国产日韩精品久久久| 欧美喷水一区二区| 成人免费毛片嘿嘿连载视频| 性做久久久久久免费观看欧美| 国产日韩精品一区| 欧美高清www午色夜在线视频| 成人污污视频在线观看| 男女男精品网站| 亚洲情趣在线观看| 精品黑人一区二区三区久久| 色噜噜久久综合| 国产在线视视频有精品| 夜夜嗨av一区二区三区中文字幕| www一区二区| 欧美另类一区二区三区| 99精品热视频| 久草在线在线精品观看| 午夜日韩在线电影| 国产精品久久久久久久久动漫 | 欧美精品国产精品| jlzzjlzz欧美大全| 久久国产尿小便嘘嘘| 一区二区三区在线观看视频| 久久久久久久综合日本| 91精品国产色综合久久ai换脸| 97国产精品videossex| 国产在线国偷精品产拍免费yy| 亚洲一区二区av在线| 综合欧美亚洲日本| 久久一区二区三区四区| 91精品国产综合久久婷婷香蕉 | 一本色道久久综合亚洲91| 国产精品一二三四五| 免费视频一区二区| 亚洲国产wwwccc36天堂| 亚洲欧美成aⅴ人在线观看| 久久九九影视网| 日韩午夜电影在线观看| 欧美少妇性性性| 一本到一区二区三区| 国产 日韩 欧美大片| 国产一区二区三区免费观看| 免费观看成人av| 日本中文字幕一区二区视频 | 成人爽a毛片一区二区免费| 久久国产精品无码网站| 日本美女一区二区三区视频| 亚洲在线视频免费观看| 亚洲精品视频在线看| 国产精品国产三级国产aⅴ中文| 久久精品一区二区| 日韩欧美一级精品久久| 91精品国产全国免费观看| 91官网在线观看| 在线精品观看国产| 一本色道**综合亚洲精品蜜桃冫| 成人av午夜电影| 成人免费不卡视频| 成人丝袜视频网| 成人av在线资源网站| 丁香婷婷深情五月亚洲| 国产电影一区二区三区| 国产剧情av麻豆香蕉精品| 激情五月婷婷综合网| 黄网站免费久久| 国产一区二区看久久| 国产盗摄一区二区| 国产精品66部| 国产v综合v亚洲欧| 成人av电影观看| 91小视频在线| 91久久精品网| 欧美在线视频你懂得| 欧美午夜电影在线播放| 欧美三片在线视频观看| 欧美福利视频一区| 91精品国产91久久久久久最新毛片 | 午夜激情一区二区| 日韩影院在线观看| 青青草原综合久久大伊人精品 | 成人免费在线观看入口| 亚洲人成精品久久久久久| 一区二区三区产品免费精品久久75| 亚洲综合在线视频| 五月婷婷色综合| 蜜桃av噜噜一区| 国产成人免费网站| 97se亚洲国产综合自在线不卡| 色综合久久久久综合| 欧美日韩在线播放三区四区| 欧美久久久久久久久中文字幕| 日韩一区二区在线观看视频播放| 欧美成人三级在线| 国产欧美视频在线观看| 自拍偷拍亚洲综合| 亚洲国产wwwccc36天堂| 久色婷婷小香蕉久久| 国产91高潮流白浆在线麻豆| 99久久777色| 欧美日韩国产影片| 精品国精品国产| 最好看的中文字幕久久| 亚洲国产精品久久久男人的天堂| 青青草精品视频| 东方aⅴ免费观看久久av| 91丝袜国产在线播放| 欧美日韩精品福利| 久久一留热品黄| 亚洲精品v日韩精品| 免费在线看一区| 成人一区二区在线观看| 欧美性大战久久| 久久综合久久久久88| 亚洲欧美日韩一区二区| 免费观看日韩电影| 国产成人在线视频播放| 91福利资源站| 2020国产精品| 一级日本不卡的影视| 久久国产精品色| 色综合久久综合中文综合网| 欧美一级精品在线| 国产精品无人区| 日韩avvvv在线播放| 成人福利视频在线看| 欧美日韩成人综合天天影院| 国产午夜精品久久久久久久| 一区二区三区日本| 国内久久精品视频| 欧洲av一区二区嗯嗯嗯啊| 久久亚洲欧美国产精品乐播| 亚洲人xxxx| 国产精品一区二区x88av| 欧美三级欧美一级| 中文字幕欧美国产| 日韩黄色免费电影| 99久久精品国产毛片| 精品美女在线播放| 一区二区三区四区五区视频在线观看|