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

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

?? mbmaster.c

?? 基于飛利浦ARM的modbus工業總線開發
?? C
字號:
/****************************************Copyright (c)**************************************************
**                               廣州周立功單片機發展有限公司
**                                     研    究    所
**                                        產品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: MBMaster.c
**創   建   人: 周立山
**最后修改日期: 2005年7月29日
**描        述: MODBUS RTU 協議棧
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 周立山
** 版  本: 1.0a
** 日 期: 2005年7月29日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"

#define ERR_ADRRESS 	0xff		// 設備地址無效
#define ERR_PARAMETER	0xfe		// 輸入參數無效出錯

#define ERR_TIMEOUT		0xfd		// 沒應答超時出錯
#define ERR_FRAME		0xfc		// 接收到的幀出錯(CRC出錯)
#define ERR_NON			0x00		// 正常返回


extern FUNCTION_PACK_PDU FunPDUPackHanlde[MAX_FUNCTION];
extern FUNCTION_DATA_HANDLE FunParRepAndStData[MAX_FUNCTION];

uint16 Modbus_CRC16(uint8 *Buff_addr,uint16 len);
void SendResponse(uint8 *buff,uint16 len);


uint8 ADUBuffer[256];

extern g_WaitN10mS;

#ifdef UCOSII
	OS_EVENT *mb_handle_event_ptr;
	OS_EVENT *mb_reply_event_ptr;
	OS_EVENT *mb_idle_event_ptr;
#endif

MASTER_INFORMATION MB_Master;
//********************************************************************************************************
// 函數名稱:MBSlaveIni
// 輸入參數:無
// 輸出參數:無
// 功能描述:MODBUS從機初始化
//********************************************************************************************************
void MBMasterIni(void)
{

	MB_Master.Status = MB_MASTER_IDLE;	// 主機空閑
	ADUData.Address = 0;
	ADUData.ADUBuffPtr = ADUBuffer;
	ADUData.ADULength = 0;

	ADUData.EndT15 = FALSE;
	ADUData.FrameOK = FALSE;
	PDUData.PDUBuffPtr = NULL;
#ifdef UCOSII
	mb_idle_event_ptr   = OSSemCreate(1);			// MODBUS主機空閑信號量
	mb_handle_event_ptr = OSSemCreate(0);			// MODBUS處理信號量
	mb_reply_event_ptr  = OSMboxCreate((void *)0);	// MODBUS處理應答消息
#endif
}


//******************************************************************************************
// 函數名稱:ModbusPoll
// 輸入參數:NodeID,節點ID(設備地址)
// 			 FunctionCode,功能代碼
//			 ParameterPtr,參數入口
// 輸出參數:err,指令執行狀態
// 功能描述:
//******************************************************************************************
uint8 ModbusPoll(uint8 NodeID,uint8 FunctionCode,void *ParameterPtr)
{
	uint8 i,err;
	ADUData.Address = NodeID;
	

	for(i=0;i<MAX_FUNCTION;i++)							// 查打有效的功能代碼			
	{	if(FunPDUPackHanlde[i].Code==FunctionCode)		// 查找功能代碼處理函數
		{
		#ifdef UCOSII
			OSSemPend(mb_idle_event_ptr,0,&err);		// 等待可以操作MODBUS主機的一個信號量	
		#else
			if(MB_Master.Status!=(uint8)MB_MASTER_IDLE)
				return (uint8)MB_MASTER_BUSY;			// 無效指令返回
		#endif	
			PDUData.PDUBuffPtr = ADUData.ADUBuffPtr+1;	// 設置PDU起始指針
			FunPDUPackHanlde[i].Function(ParameterPtr);	// 調用功能代碼處理函數
			PDUData.FrameOK = TRUE;						// 請求幀準備就緒
			MB_Master.ParPtr = ParameterPtr;			// 請求參數結構指針
			
		#ifdef UCOSII
			OSSemPost(mb_handle_event_ptr);				// 發報信號量,使MODBUS服務任務處理傳輸
			err = *(uint8 *)OSMboxPend(mb_reply_event_ptr,0,&err);	// 等待執行完成	
		#else
			do
			{
				err = IdleModbus();
			}while(MB_Master.Status==(uint8)MB_MASTER_BUSY);
		#endif		
			return err;	// 無效指令返回

		}
	}
	return (uint8)MB_FUN_NOT_DEF;
}


//******************************************************************************************
// 函數名稱:ParseReponseAndStoreData
// 輸入參數:無
// 輸出參數:無
// 功能描述:解析應答幀,并保存數據
//******************************************************************************************
uint8 ParseReponseAndStoreData(void)
{
	uint8 i,err;
	err = MB_FUN_NOT_DEF;
	for(i=0;i<MAX_FUNCTION;i++)							
		if(FunParRepAndStData[i].Code==PDUData.FunctionCode)	// 查找功能代碼處理函數
		{
			if(PDUData.PDUBuffPtr[0]&0x80)						// 異常產生
			{	err = PDUData.PDUBuffPtr[1];}
			else	
			{	err = MB_NO_ERR;
				FunParRepAndStData[i].Function(PDUData.PDUBuffPtr,MB_Master.ParPtr);	// 調用功能代碼處理函數
			}
			break;
		}
	return err;// 未定義功能碼
}

//******************************************************************************************
// 函數名稱:CheckModbusMessage
// 輸入參數:無
// 輸出參數:ADU描述符
// 功能描述:檢查是否有需要發送的的幀
//******************************************************************************************
ADU_CONTROL *CheckModbusMessage(void)
{
	uint16 CRC16;
	uint8 *ADUPtr;
	if(PDUData.FrameOK == TRUE)			// 請求幀的PDU是否準備就緒
	{
		PDUData.FrameOK = FALSE;		// 清PDU是否準備就緒標志,當接收到有效的PDU后將被再次置1
		ADUPtr = ADUData.ADUBuffPtr;
		ADUPtr[0] = ADUData.Address;	// 設置ADU地址(節點)
		
		CRC16 = Modbus_CRC16(ADUPtr,PDUData.PDULength+1);	// 求CRC16值
		ADUPtr[PDUData.PDULength+1] = CRC16;				// 設置CRC16值
		ADUPtr[PDUData.PDULength+2] = CRC16>>8;
		ADUData.ADULength=PDUData.PDULength+3;		// ADU長度等于PDU長度加1個地址和2個CRC字符
		ADUData.FrameOK = TRUE;						// 標記ADU請求幀準備就緒
		
		return (ADU_CONTROL *) &ADUData;			
	}
	else
		return NULL;
}








//******************************************************************************************
// 函數名稱:IdleModbus
// 輸入參數:無
// 輸出參數:MODBUS主機狀態
// 功能描述:
//******************************************************************************************
uint8 IdleModbus(void)
{
	static uint8 err;
	static uint8  modbus_state=0;
	
#ifdef	UCOSII
	OSSemPend(mb_handle_event_ptr,0,&err);
#endif	
	
	err = MB_MASTER_BUSY;
	switch ( modbus_state )
	{
      	case 0:
         	/******************************************************************/
         	/*       CHECK FOR THE NEXT MESSAGE TO SEND                       */
         	/*       檢查需要發送的消息,并發送請求幀						  */
         	/******************************************************************/
        	if ( CheckModbusMessage() )
			{     
				/******************************************************************/
	         	/*       SEND THE POLL                                            */
	         	/*		發送請求幀												  */
	         	/******************************************************************/
	         	SendResponse(ADUData.ADUBuffPtr,ADUData.ADULength);// 發送幀
	        	ADUData.FrameOK = FALSE;
	        	ADUData.ADULength = 0;
   				MB_Master.Status = (uint8)MB_MASTER_BUSY;				// 設置主機忙狀態
	        	Waite10mS(MB_POLL_TIMEOUT);			// 命令應答計時 
	            modbus_state++;
 				
            }
            else
            	err = MB_MASTER_IDLE;	// 沒有功能代碼需傳輸
         	break;
      	case 1:
         	/******************************************************************/
         	/*       GET THE PACKET AND MAKE SURE IT IS COMPLETE              */
         	/******************************************************************/
         	if ( PDUData.FrameOK )	// 成功接收PDU幀
            {
                /******************************************************************/
         		/*       PARSE THE RESPONSE AND STORE THE DATA                    */
         		/*       解析應等幀,并儲存數據									  */
         		/******************************************************************/
         		err = ParseReponseAndStoreData();
         		PDUData.FrameOK = FALSE;
         		Waite10mS(MB_POLL_DELAY);	
    		#ifdef	UCOSII
				OSMboxPost(mb_reply_event_ptr,&err);  		   
			#endif		 
            	modbus_state++;
            	break;
            }

         	/******************************************************************/
         	/*       IF NO RESPONSE RECEIVED TIME OUT AND SEND NEXT POLL      */
         	/******************************************************************/
         	if (g_TimeEnd)
            {
            	modbus_state = 0;
            	MB_Master.Status = MB_MASTER_IDLE;	// 主機空閑
            	err = MB_RESPONSE_TIME_OUT;
 			#ifdef	UCOSII
				OSMboxPost(mb_reply_event_ptr,&err);  		   
			#endif	
            }
         	break;
      	case 2:
         	/******************************************************************/
         	/*       POLL DELAY                                               */
         	/*		輪循延時												  */
         	/******************************************************************/

         	if (g_TimeEnd)
            {
               	modbus_state=0;
          		MB_Master.Status = MB_MASTER_IDLE;	// 主機空閑
            }
      	default:
         	break;
      }
      
#ifdef	UCOSII
	if(MB_Master.Status == MB_MASTER_IDLE)
		OSSemPost(mb_idle_event_ptr);     
#endif
    return err;
}







?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品一区二区三区三上悠亚| 成人免费视频国产在线观看| www.欧美.com| 日韩免费看的电影| 亚洲欧美日韩国产手机在线| 国产宾馆实践打屁股91| 777亚洲妇女| 亚洲午夜久久久久| 97se亚洲国产综合自在线观| 久久久不卡影院| 久久99国产精品尤物| 欧美私模裸体表演在线观看| 日韩理论片在线| eeuss鲁一区二区三区| 欧美精品一区二区三区蜜臀| 日本欧美久久久久免费播放网| 色国产精品一区在线观看| 中文字幕欧美一| 丁香婷婷综合色啪| 国产亚洲一区二区三区| 韩国v欧美v日本v亚洲v| 日韩欧美成人激情| 久久精品国产77777蜜臀| 欧美日韩精品二区第二页| 亚洲一区二区三区四区中文字幕| 91美女片黄在线观看91美女| 亚洲色图都市小说| 91亚洲精品久久久蜜桃| 最新中文字幕一区二区三区| av一区二区不卡| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 亚洲不卡在线观看| 欧美日韩国产高清一区| 午夜欧美视频在线观看| 欧美日韩三级视频| 日韩高清一区二区| 2017欧美狠狠色| 国产福利91精品| 最新国产成人在线观看| 日本韩国欧美一区| 亚洲永久免费视频| 日韩视频123| 国产精品自产自拍| 亚洲视频电影在线| 欧美日韩精品高清| 国产麻豆午夜三级精品| 中文一区在线播放| 欧美色手机在线观看| 免费一级欧美片在线观看| 精品播放一区二区| 成人午夜av电影| 亚洲综合图片区| 日韩一区二区三区电影 | 精品国免费一区二区三区| 悠悠色在线精品| 91浏览器打开| 午夜久久福利影院| 国产亚洲成年网址在线观看| 99re热这里只有精品免费视频| 亚洲一区中文日韩| 欧美mv和日韩mv的网站| 99精品欧美一区二区三区综合在线| 亚洲精品视频在线| 久久香蕉国产线看观看99| av日韩在线网站| 奇米影视在线99精品| 国产农村妇女精品| 91精品国产色综合久久ai换脸| 国产成人精品影视| 日本视频一区二区| 亚洲视频你懂的| 久久久久国产精品厨房| 欧美色大人视频| 成人综合婷婷国产精品久久| 天堂久久久久va久久久久| 国产偷国产偷亚洲高清人白洁| 日本在线不卡一区| 国产精品九色蝌蚪自拍| 日韩欧美视频在线| 一道本成人在线| 国产91精品入口| 日本中文字幕一区二区视频| 日本一区二区在线不卡| 91精品黄色片免费大全| 99免费精品视频| 精东粉嫩av免费一区二区三区| 亚洲成av人影院| 欧美一级片免费看| 国产日韩精品视频一区| 欧美日韩综合不卡| 成人自拍视频在线观看| 日本中文字幕一区二区视频| 亚洲人成精品久久久久久 | 日韩一区二区免费电影| 色国产综合视频| av影院午夜一区| 国产激情一区二区三区桃花岛亚洲| 日本不卡不码高清免费观看| 亚洲成av人片一区二区梦乃| 亚洲精品成人精品456| 中文字幕一区二区三区精华液| 国产亚洲va综合人人澡精品| 精品欧美一区二区久久| 91精品国产91久久久久久最新毛片 | 91麻豆高清视频| 成人黄色网址在线观看| 国产高清亚洲一区| 国产成人亚洲综合a∨猫咪| 国产一区二区三区免费播放| 麻豆精品久久久| 久久er精品视频| 精品一区二区三区免费视频| 久久99精品久久久久| 久久精品99国产精品日本| 麻豆久久久久久| 激情五月婷婷综合| 国产剧情在线观看一区二区| 国产成人高清视频| 91一区二区在线观看| 色94色欧美sute亚洲线路二| 欧美日韩一卡二卡| 欧美一卡2卡三卡4卡5免费| 日韩欧美精品三级| 久久精品视频一区二区三区| 欧美国产激情一区二区三区蜜月| 国产精品伦理在线| 亚洲国产一二三| 蜜臀av亚洲一区中文字幕| 国产一区久久久| 99久久国产免费看| 欧美日韩在线播放| 精品免费日韩av| 国产精品二区一区二区aⅴ污介绍| 亚洲精品菠萝久久久久久久| 日本视频免费一区| 国产精品456| 欧美系列日韩一区| 精品裸体舞一区二区三区| 国产日韩欧美a| 亚洲一区二区三区四区五区中文 | 久久亚洲精华国产精华液| 国产精品久久看| 亚洲成a人v欧美综合天堂| 黄网站免费久久| 91视频观看免费| 欧美一级理论片| 亚洲欧洲日韩女同| 日本欧美肥老太交大片| 成人一区在线观看| 制服丝袜一区二区三区| 国产精品色婷婷久久58| 午夜精品久久久久久久蜜桃app | 国产精品成人免费精品自在线观看| 一区二区三区蜜桃| 国产麻豆一精品一av一免费 | 中文字幕一区二区5566日韩| 日韩精品电影一区亚洲| av电影在线观看完整版一区二区| 91麻豆精品国产自产在线观看一区 | 久久精品人人做人人爽人人| 亚洲免费视频成人| 精彩视频一区二区| 欧美日本在线看| 国产精品国产a| 久久国产剧场电影| 在线观看精品一区| 中文字幕一区在线观看| 激情六月婷婷久久| 欧美一区二区性放荡片| 亚洲午夜精品在线| 91在线无精精品入口| 欧美精品一区二区三区在线 | 亚洲国产精品成人综合| 三级在线观看一区二区| 成年人午夜久久久| 日韩亚洲欧美在线| 午夜精品久久久久久久久| 99久久99久久精品免费看蜜桃| 欧美成va人片在线观看| 午夜精品一区在线观看| 欧美性色综合网| 亚洲精品自拍动漫在线| 成人av网在线| 中文字幕精品—区二区四季| 国产精品 欧美精品| 久久久久久毛片| 国产麻豆精品一区二区| 欧美成人伊人久久综合网| 麻豆高清免费国产一区| 欧美一级日韩不卡播放免费| 人人狠狠综合久久亚洲| 欧美日本韩国一区| 天天影视涩香欲综合网| 欧美日韩免费在线视频| 亚洲3atv精品一区二区三区| 欧美性一区二区| 天天爽夜夜爽夜夜爽精品视频| 91精品欧美一区二区三区综合在| 三级久久三级久久久| 精品日韩成人av|