FreeModbus輸入寄存器

輸入寄存器的訪問屬性爲只讀

對輸入寄存器的操作包括:讀輸入寄存器(0x04)

 

在一個遠程設備中,使用該功能碼讀取1 至大約125 的連續輸入寄存器。請求PDU 說明了起始地址和寄存器數量。從零開始尋址寄存器。因此,尋址輸入寄存器1-16 爲0-15。
將響應報文中的寄存器數據分成每個寄存器爲兩字節,在每個字節中直接地調整二進制內容。對於每個寄存器,第一個字節包括高位比特,並且第二個字節包括低位比特。

讀輸入寄存器狀態圖

/* 讀輸入寄存器 */
eMBException eMBFuncReadInputRegister(UCHAR *pucFrame, USHORT *usLen)
{
	USHORT usRegAddress;
	USHORT usRegCount;
	UCHAR *pucFrameCur;
	eMBException eStatus = MB_EX_NONE;
	eMBErrorCode eRegStatus;

	/* 校驗PDU長度是否合理 */
	if(*usLen == (MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN))
	{
		/* 寄存器地址 */
		usRegAddress = (USHORT)(pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8);
		usRegAddress |= (USHORT)(pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1]);
		/* 第1個寄存器尋址爲0,所以地址加一 */
		usRegAddress++;

		/* 寄存器數量 */
		usRegCount = (USHORT)(pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8);
		usRegCount |= (USHORT)(pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1]);

		/* 檢查寄存器數量是否合理 */
		if((usRegCount >= 1) && (usRegCount < MB_PDU_FUNC_READ_REGCNT_MAX))
		{
			/* 構建響應 */
			
			/* PDU指針 */
			pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF];
			/* PDU長度初始化爲0 */
			*usLen = MB_PDU_FUNC_OFF;

			/* 功能碼 */
			*pucFrameCur++ = MB_FUNC_READ_INPUT_REGISTER;
			*usLen += 1;

			/* 字節數 */
			*pucFrameCur++ = (UCHAR)(usRegCount * 2);
			*usLen += 1;

			/* 讀取輸入寄存器數據 */
			eRegStatus = eMBRegInputCB(pucFrameCur, usRegAddress, usRegCount);
			/* 產生異常 */
			if(eRegStatus != MB_ENOERR)
			{
				/* 錯誤轉化爲異常碼 */
				eStatus = prveMBError2Exception(eRegStatus);
			}
			/* 未產生異常 */
			else
			{
				/* 數據長度 */
				*usLen += usRegCount * 2;
			}
		}
		/* 寄存器數量不合理 */
		else
		{
			/* 非法數據值 */
			eStatus = MB_EX_ILLEGAL_DATA_VALUE;
		}
	}
	/* PDU長度不對 */
	else
	{
		/* 非法數據值 */
		eStatus = MB_EX_ILLEGAL_DATA_VALUE;
	}

	return eStatus;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章