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

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

?? modbus.c

?? 基于Hitech和C166的Modbus協(xié)議
?? C
?? 第 1 頁 / 共 2 頁
字號:
//****************************************************************************
// 文件名: MODBUS.C
// 功      能: 實現從機MODBUS功能,負責接收主機命令,校驗,應答
// 規(guī)      范: 使用RTU 模式CRC校驗
// 串      口: 1位起始位,8位數據位,無校驗位,1位停止位19200 波特率
// 作      者: 李龍勝
// 版      本: V1.0
// 日      期: 2008.09.05
// 修      訂: 2008.12.17
// 說     明 : 移植到雙芯片主機中由串口0改為串口1
//****************************************************************************

//****************************************************************************
// @Project Includes
//****************************************************************************
#include "MAIN.H"

//****************************************************************************
// @全局變量
//****************************************************************************

bit			Asc1_receive_ok;     	    	
bit			Asc1_transfer_ok;    	    	
bit			Asc1_lastFrame_indeal;		


ubyte			Asc1_Rx_BUF[Asc1_Rx_lengh_max]	=
{
	0, 0, 
};
ubyte			Asc1_Tx_BUF[Asc1_Tx_lengh_max]	=
{
	0, 0, 
};

ubyte			*Asc1_Rx_BUF_point			= Asc1_Rx_BUF;
ubyte			*Asc1_Tx_BUF_point			= Asc1_Tx_BUF;

ubyte			Asc1_Rx_lengh				= 0;
ubyte			Asc1_Tx_lengh				= 0;

const unsigned int	crc_ta[256]				=
{
	0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0,
	0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141,
	0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0,
	0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
	0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0,
	0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741,
	0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0,
	0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};



//****************************************************************************
// @Function  	   void  Modbus_deal()
// @Description        在main()中循環(huán)執(zhí)行
//****************************************************************************
void Modbus_deal()
{
	//檢查是否有收到幀信息
	//ASC1_vSendData(0x55);
	if (Asc1_receive_ok)
	{
		Asc1_receive_ok = 0; 
		//標記處于幀處理中
		//Asc1_lastFrame_indeal = 1;
		//是否開辟限時處理功能,防止超時未應答,
		//免得一直不退出上一幀處理
		//比如定時器T3之???ms延時
		//判定是否為本地址幀
		if (Asc1_Rx_BUF[0] == Modbus_Node)
		{
			//判定地址符合情況下才進入幀處理
			Frame_deal();
		}
		//不是本機地址直接退出
		else
		{
			#if(MODBUS_DebugMode)
				#if(Asc1_Send_while == 1)
					ASC1_vSendData_While( 0xAA );
				#endif
			#endif
			// do nothing
		}			
		//完成幀處理
		Asc1_lastFrame_indeal = 0;
		//長度清零,指針指向數組第一個空間
		Asc1_Rx_lengh = 0;
		Asc1_Rx_BUF_point = Asc1_Rx_BUF;
	}
}
//****************************************************************************
// @Function  	   void crc_cal( ubyte* ptr, ubyte len )
// @Description        計算待發(fā)送的數據之CRC 值 并插入發(fā)送緩沖
// @Parameters	* ptr : 待發(fā)送的數組的首地址 
//     			    len    : 待發(fā)送的數組之字節(jié)數,不包括CRC碼
//****************************************************************************
__inline void crc_cal(ubyte *ptr, ubyte len)
{
	uword	crc1	= 0xffff;    // 初始化 
	ubyte	temp	= 0;
	while (len > 0)
	{
		crc1 = ( crc1 >> 8 ) ^ crc_ta[( crc1 ^ *ptr ) & 0xff];
		len--;
		ptr++;
	} 

	//往發(fā)送緩沖區(qū)寫CRC之低字節(jié)	
	*ptr = ( ubyte ) ( crc1 % 256 );
	//往發(fā)送緩沖區(qū)寫CRC之高字節(jié)	
	ptr++;
	*ptr = ( ubyte ) ( crc1 / 256 );
}

//****************************************************************************
// @Function  	   uword crc_check( ubyte* ptr, ubyte len )
// @Description        計算待接收的數據之CRC 值 ,正確則返回0
// @Rerurn    	    正確的編碼返回 0x00
// @Parameters	* ptr : 待接收的數組的首地址 
//     			   len    : 待接收的數組之字節(jié)數,包括CRC碼
//****************************************************************************
__inline uword crc_check(ubyte *ptr, ubyte len)
{
	uword	crc1	= 0xffff;    // 初始化 
	#if(CRC_NeedSend)
	uword	temp	= 0;
	#endif
	while (len > 0)
	{
		crc1 = ( crc1 >> 8 ) ^ crc_ta[( crc1 ^ *ptr ) & 0xff];
		len--;
		ptr++;

		//調試幀數據時需要發(fā)送
		#if(CRC_NeedSend)	
			temp = crc1 / 256;
			#if(Asc1_Send_while == 1)
				ASC1_vSendData_While( temp );
			#endif
			temp = crc1 % 256;
			#if(Asc1_Send_while == 1)
				ASC1_vSendData_While( temp );
			#endif
		#endif
	}    	
	return crc1;
}

//****************************************************************************
// @Function  	  void  Frame_deal()
// @Description       處理接收到的數據幀,在main中查詢執(zhí)行
//     			   在地址也符合的情況下才進入幀處理
// @Rerurn    	    
// @Parameters	
//****************************************************************************
__inline void Frame_deal()
{
	uword	temp1	= 0;	
	//進行CRC 校驗,正確的校驗返回為0
	temp1 = crc_check( Asc1_Rx_BUF, Asc1_Rx_lengh );  		
	if (temp1 == 0)
	{
		#if(MODBUS_DebugMode == 1)
		//{   調試時
		#if(Asc1_Send_while == 1)
			ASC1_vSendData_While( 0x88 );
		#endif
		Frame_Data_Analyse();
		//}
		#else
		//{   正常處理
		Frame_Data_Analyse();
		//}
		#endif
	}			
	//校驗未通過處理
	else
	{
		#if(MODBUS_DebugMode)
		//{   調試時
		#if(Asc1_Send_while == 1)
			ASC1_vSendData_While( 0x99 );
		#endif
		//}
		#else
		//{   正常處理
		#if(MODBUS_CRCerr_needDeal)
		//{  CRC 校驗出錯 需處理
		#if(Asc1_Send_while == 1)
			ASC1_vSendData_While( 0x09 );
		#endif
		//}
		#endif
		//}	
		#endif
	}
}
//****************************************************************************
// @Function  	  void  Frame_Data_Analyse()
// @Description       在正確的CRC 校驗之后進行對數據分析處理
// @Rerurn    	    
// @Parameters	
//****************************************************************************
__inline void Frame_Data_Analyse()
{
	//-----------功能碼----------
	//#define READ_Coils_State     		01 
	//#define READ_Inputs_State  		02 
	//#define READ_Hold_Registers 	 	03 
	//#define READ_Input_Registers 		04 
	//#define WRITE_One_Coil      		05 
	//#define WRITE_One_Register  		06
	//#define WRITE_Some_Coil      		15 
	//#define WRITE_Some_Register 	16

	//對應答作初步準備
	Asc1_Tx_BUF[0] = Modbus_Node;
	Asc1_Tx_lengh = 1;
	//----根據功能碼分類-----
	switch (Asc1_Rx_BUF[1])
	{
	case READ_Coils_State:
		//01
		Deal_READ_Coils_State();
		break;
	case READ_Inputs_State:
		//02
		break;
	case READ_Hold_Registers:
		//03
		Deal_READ_Hold_Registers();
		break;
	case READ_Input_Registers:
		//04
		break;
	case WRITE_One_Coil:
		//05
		Deal_WRITE_One_Coilr();
		break;
	case WRITE_One_Register:
		//06
		Deal_WRITE_One_Register();
		break;
	case WRITE_Some_Coil:
		//15
		Deal_WRITE_Some_Coil();
		break;
	case WRITE_Some_Register:
		//16
		Deal_WRITE_Some_Register();
		break;				
	default:
		break;
	}
}

//****************************************************************************
// @Function  	  void Send_Asc0_Tx_buf()
// @Description       處理發(fā)送緩沖區(qū)
//****************************************************************************
__inline void Send_Asc0_Tx_buf()
{
	ubyte	temp1;
	for (temp1 = 0; temp1 < Asc1_Tx_lengh; temp1++)
	{
		#if(Asc1_Send_while == 1)
			ASC1_vSendData_While( Asc1_Tx_BUF[temp1]  );
		#endif
	}
}

//****************************************************************************
// @Function  	  void Send_Asc0_Rx_buf_Back()
// @Description       正確處理完寫,直接回復接收緩沖區(qū)
//****************************************************************************
__inline void Send_Asc0_Rx_buf_Back()
{
	ubyte	temp1;
	for (temp1 = 0; temp1 < Asc1_Rx_lengh; temp1++)
	{
		#if(Asc1_Send_while == 1)
			ASC1_vSendData_While( Asc1_Rx_BUF[temp1]  );
		#endif
	}
}

//****************************************************************************
// @Function  	  void Deal_READ_Coils_State()
// @Description       讀一組邏輯線圈當前狀態(tài)
//****************************************************************************
__inline void Deal_READ_Coils_State()
{
	bit	Deal_all_OK	= 0;
	ubyte	temp1, temp2, temp5, temp6, temp7, temp8, temp9;
	uword	temp3, temp4;
	//清零發(fā)送緩沖區(qū)
	for (temp1 = 0; temp1 < Asc1_Tx_lengh_max; temp1++)
	{
		Asc1_Tx_BUF[temp1] = 0;
	}
	//判定功能碼是否合法(01,但是幀長超出)
	if (Asc1_Rx_lengh != 8)
	{
		Asc1_Tx_BUF[1] = 0x81;
		Asc1_Tx_BUF[2] = 0x01;
		Asc1_Tx_lengh = 3;
	}
	else
	{
		//判定輸出數量是否合法(這里僅開辟80個位)
		temp3 = ( uword ) Asc1_Rx_BUF[4] * 256 + Asc1_Rx_BUF[5];
		if (temp3 > ModBus_PLC_Bit_max)		// 這里最多支持 80 bit
		{
			Asc1_Tx_BUF[1] = 0x81;
			Asc1_Tx_BUF[2] = 0x03;
			Asc1_Tx_lengh = 3;
		}
		else
		{
			//判定首地址、末地址是否合法
			temp4 = ( uword ) Asc1_Rx_BUF[2] * 256 + Asc1_Rx_BUF[3];	//首地址
			temp3 += temp4;									//末地址
			//判斷首地址、末地址均合法否
			if (temp3 >= ModBus_PLC_Bit_max || temp4 >= ModBus_PLC_Bit_max)
			{
				Asc1_Tx_BUF[1] = 0x81;
				Asc1_Tx_BUF[2] = 0x02;
				Asc1_Tx_lengh = 3;
			}
			else
			{
				//處理讀請求
				//開始地址: 第幾個字節(jié),第幾位
				temp1 = Asc1_Rx_BUF[3] / 8;	//第幾字節(jié)
				temp2 = ( ubyte ) ( Asc1_Rx_BUF[3] % 8 );	//該字節(jié)第幾位
				//共發(fā)送幾個字節(jié)+ 幾位
				temp5 = ( ubyte ) ( Asc1_Rx_BUF[5] / 8 + 1 );	//幾個字節(jié)
				//ASC1_vSendData(temp5);
				temp6 = ( ubyte ) ( Asc1_Rx_BUF[5] % 8 );	//加幾位
				Asc1_Tx_BUF[0] = Modbus_Node;
				Asc1_Tx_BUF[1] = 0x01;
				Asc1_Tx_BUF[2] = temp5;
				for (temp7 = 0; temp7 < temp5; temp7++)
				{
					temp9 = PLC_Bit_Buffer_all.PLC_Bit_Buffer[temp1 + 1];
					temp3 = temp7 * 256 + PLC_Bit_Buffer_all.PLC_Bit_Buffer[temp1];
					temp3 >>= temp2;
					temp1++;
					temp8 = temp7 + 3;
					Asc1_Tx_BUF[temp8] = ( ubyte ) ( temp3 & 0x00FF );
				}
				temp2 = Asc1_Tx_BUF[temp8];
				//對最后一個字節(jié)的無效高位清0
				temp1 = 0;
				for (temp7 = 0; temp7 < temp6; temp7++)
				{
					temp1 <<= 1;	
					temp1 |= 0x01;
				}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精彩视频在线观看不卡| 91丨porny丨最新| 成人精品在线视频观看| 中文字幕免费一区| 日韩国产高清影视| 一本到一区二区三区| 国产亚洲欧洲一区高清在线观看| 亚洲在线成人精品| 94-欧美-setu| 国产日韩av一区二区| 秋霞电影网一区二区| 欧美亚洲另类激情小说| **欧美大码日韩| 国产成人鲁色资源国产91色综| 91精品视频网| 天天综合网天天综合色| 在线精品视频一区二区| 18欧美乱大交hd1984| 豆国产96在线|亚洲| 欧美成人精品福利| 免费成人美女在线观看| 777xxx欧美| 午夜国产精品一区| 欧美性生活影院| 亚洲大片在线观看| 欧美婷婷六月丁香综合色| 亚洲欧美日韩在线| 91黄色免费网站| 一区二区久久久久| 91成人在线免费观看| 一区二区三区四区乱视频| 色婷婷激情综合| 一区二区三区精品| 欧美三级欧美一级| 性欧美大战久久久久久久久| 欧美欧美欧美欧美首页| 天天av天天翘天天综合网色鬼国产| 欧美日韩免费在线视频| 福利一区福利二区| 91国产免费看| 亚洲午夜av在线| 欧美日韩不卡在线| 麻豆精品精品国产自在97香蕉 | 3atv一区二区三区| 日韩精品乱码av一区二区| 91精品国产综合久久精品| 日本不卡在线视频| 久久综合给合久久狠狠狠97色69| 国产一区二区三区美女| 国产精品亲子伦对白| 色婷婷亚洲综合| 日韩高清不卡一区二区三区| 精品久久久久久综合日本欧美| 激情欧美一区二区| 国产亚洲一区二区三区在线观看| 国产成人免费视频一区| 亚洲精品日日夜夜| 欧美一区二区成人| 成人精品高清在线| 午夜亚洲福利老司机| 久久嫩草精品久久久精品| 97se亚洲国产综合自在线不卡| 亚洲综合激情网| 精品久久久久99| av色综合久久天堂av综合| 亚洲成av人在线观看| 精品国产一区二区三区不卡| 91麻豆国产福利精品| 老色鬼精品视频在线观看播放| 国产精品视频线看| 欧美日韩一本到| 成人免费观看av| 五月激情综合网| 综合精品久久久| 亚洲精品在线网站| 欧美日韩视频在线观看一区二区三区 | 亚洲国产va精品久久久不卡综合| 日韩你懂的在线播放| 91免费视频网址| 国产成人免费高清| 三级一区在线视频先锋| 久久久久久免费毛片精品| 欧美视频在线一区| www.亚洲激情.com| 国产精品一区在线观看你懂的| 艳妇臀荡乳欲伦亚洲一区| 国产免费观看久久| 91精品国产aⅴ一区二区| 色狠狠色噜噜噜综合网| 国产精品伊人色| 日韩国产高清影视| 亚洲成人激情自拍| 一区二区三区在线观看网站| 欧美国产日本视频| 久久久精品黄色| 欧美成人a∨高清免费观看| 欧美日本一区二区三区四区| 99免费精品在线观看| 国产成人综合视频| 国产精品自产自拍| 日韩高清欧美激情| 中文字幕的久久| 国产欧美日韩久久| 2021久久国产精品不只是精品| 7777精品伊人久久久大香线蕉经典版下载| 99久久婷婷国产综合精品电影| 国产 欧美在线| 国产乱理伦片在线观看夜一区| 极品美女销魂一区二区三区免费| 麻豆精品一区二区av白丝在线| 日本网站在线观看一区二区三区| 午夜精品久久久久久久久| 亚洲综合小说图片| 亚洲成人自拍偷拍| 婷婷成人综合网| 免费亚洲电影在线| 国产在线精品一区二区三区不卡| 国产一区二区三区香蕉| 国产精品99久久久久| 成人av午夜影院| 日本精品免费观看高清观看| 在线亚洲高清视频| 欧美理论电影在线| 精品免费国产一区二区三区四区| 欧美精品一区二区不卡| 国产精品美女久久久久aⅴ| 国产精品不卡在线| 亚洲第一会所有码转帖| 人妖欧美一区二区| 国产精品中文欧美| 91一区一区三区| 欧美丰满一区二区免费视频 | 欧美精品色综合| 精品国产一区二区三区四区四 | 五月天亚洲精品| 国内一区二区在线| 成人激情黄色小说| 欧美日韩精品一区二区三区| 精品日韩欧美一区二区| 中文字幕一区二区在线观看 | 高清不卡一二三区| 在线精品视频一区二区三四| 日韩欧美国产不卡| 国产精品乱人伦一区二区| 亚洲国产另类精品专区| 狠狠色丁香久久婷婷综合丁香| 99精品国产99久久久久久白柏| 欧美区视频在线观看| 国产欧美va欧美不卡在线| 亚洲国产成人porn| 成人一区二区三区视频在线观看| 在线看不卡av| 国产日韩三级在线| 日韩中文字幕91| 成人黄色免费短视频| 欧美一区二区三区日韩| 最新国产成人在线观看| 激情伊人五月天久久综合| 91蝌蚪porny| 久久综合狠狠综合久久激情 | 欧美一区二区三区免费视频| 国产精品免费久久| 久久国产尿小便嘘嘘| 在线免费不卡电影| 国产精品免费人成网站| 久久精品国产99| 6080午夜不卡| 亚洲欧美一区二区三区国产精品 | 国产精品免费av| 亚洲综合一区二区三区| 国产成人av在线影院| 欧美精品在线视频| 亚洲黄色片在线观看| 懂色av一区二区三区蜜臀| 欧美不卡一区二区三区四区| 夜夜亚洲天天久久| 91在线精品一区二区| 国产亚洲精品bt天堂精选| 激情av综合网| 4hu四虎永久在线影院成人| 亚洲裸体在线观看| 成人免费不卡视频| 久久综合五月天婷婷伊人| 蜜臀a∨国产成人精品| 欧美日韩一区二区三区高清| 亚洲欧美另类在线| eeuss国产一区二区三区| 国产欧美日产一区| 国产成人免费视频网站高清观看视频| 日韩手机在线导航| 视频在线观看91| 91精品欧美综合在线观看最新| 亚洲bt欧美bt精品| 亚洲欧美日韩国产一区二区三区| 日韩国产欧美在线视频| 欧美日韩卡一卡二| 一卡二卡欧美日韩| 欧美亚洲自拍偷拍| 性久久久久久久| 日韩欧美亚洲另类制服综合在线|