FreeModbus输入寄存器
生活随笔
收集整理的這篇文章主要介紹了
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; }?
總結
以上是生活随笔為你收集整理的FreeModbus输入寄存器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uboot命令体系
- 下一篇: html5(mp4)无法播放,HTML5