FreeModbus输入寄存器
生活随笔
收集整理的這篇文章主要介紹了
FreeModbus输入寄存器
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
輸入寄存器的訪問(wèn)屬性為只讀
對(duì)輸入寄存器的操作包括:讀輸入寄存器(0x04)
?
在一個(gè)遠(yuǎn)程設(shè)備中,使用該功能碼讀取1 至大約125 的連續(xù)輸入寄存器。請(qǐng)求PDU 說(shuō)明了起始地址和寄存器數(shù)量。從零開(kāi)始尋址寄存器。因此,尋址輸入寄存器1-16 為0-15。
將響應(yīng)報(bào)文中的寄存器數(shù)據(jù)分成每個(gè)寄存器為兩字節(jié),在每個(gè)字節(jié)中直接地調(diào)整二進(jìn)制內(nèi)容。對(duì)于每個(gè)寄存器,第一個(gè)字節(jié)包括高位比特,并且第二個(gè)字節(jié)包括低位比特。
讀輸入寄存器狀態(tài)圖
/* 讀輸入寄存器 */ eMBException eMBFuncReadInputRegister(UCHAR *pucFrame, USHORT *usLen) {USHORT usRegAddress;USHORT usRegCount;UCHAR *pucFrameCur;eMBException eStatus = MB_EX_NONE;eMBErrorCode eRegStatus;/* 校驗(yàn)PDU長(zhǎng)度是否合理 */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個(gè)寄存器尋址為0,所以地址加一 */usRegAddress++;/* 寄存器數(shù)量 */usRegCount = (USHORT)(pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8);usRegCount |= (USHORT)(pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1]);/* 檢查寄存器數(shù)量是否合理 */if((usRegCount >= 1) && (usRegCount < MB_PDU_FUNC_READ_REGCNT_MAX)){/* 構(gòu)建響應(yīng) *//* PDU指針 */pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF];/* PDU長(zhǎng)度初始化為0 */*usLen = MB_PDU_FUNC_OFF;/* 功能碼 */*pucFrameCur++ = MB_FUNC_READ_INPUT_REGISTER;*usLen += 1;/* 字節(jié)數(shù) */*pucFrameCur++ = (UCHAR)(usRegCount * 2);*usLen += 1;/* 讀取輸入寄存器數(shù)據(jù) */eRegStatus = eMBRegInputCB(pucFrameCur, usRegAddress, usRegCount);/* 產(chǎn)生異常 */if(eRegStatus != MB_ENOERR){/* 錯(cuò)誤轉(zhuǎn)化為異常碼 */eStatus = prveMBError2Exception(eRegStatus);}/* 未產(chǎn)生異常 */else{/* 數(shù)據(jù)長(zhǎng)度 */*usLen += usRegCount * 2;}}/* 寄存器數(shù)量不合理 */else{/* 非法數(shù)據(jù)值 */eStatus = MB_EX_ILLEGAL_DATA_VALUE;}}/* PDU長(zhǎng)度不對(duì) */else{/* 非法數(shù)據(jù)值 */eStatus = MB_EX_ILLEGAL_DATA_VALUE;}return eStatus; }?
總結(jié)
以上是生活随笔為你收集整理的FreeModbus输入寄存器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: uboot命令体系
- 下一篇: html5(mp4)无法播放,HTML5