FreeModbus离散量输入
生活随笔
收集整理的這篇文章主要介紹了
FreeModbus离散量输入
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
離散量輸入的訪問屬性為只讀
對離散量輸入的操作包括:讀離散量輸入(0x02)
?
在一個遠程設備中,使用該功能碼讀取離散量輸入的1 至2000 連續(xù)狀態(tài)。請求PDU 詳細說明了起始地址,即指定的第一個輸入地址和輸入編號。從零開始尋址輸入。因此尋址輸入1-16 為0-15。根據(jù)數(shù)據(jù)域的每個比特將響應報文中的離散量輸入分成為一個輸入。指示狀態(tài)為1= ON 和0=OFF。第一個數(shù)據(jù)字節(jié)的LSB(最低有效位)包括在詢問中尋址的輸入。其它輸入依次類推,一直到這個字節(jié)的高位端為止,并在后續(xù)字節(jié)中從低位到高位的順序。
如果返回的輸入數(shù)量不是八的倍數(shù),將用零填充最后數(shù)據(jù)字節(jié)中的剩余比特(一直到字節(jié)的高位端)。字節(jié)數(shù)量域說明了數(shù)據(jù)的完整字節(jié)數(shù)。
讀離散量輸入狀態(tài)圖
/* 讀離散量 */ eMBException eMBFuncReadDiscreteInputs(UCHAR *pucFrame, USHORT *usLen) {USHORT usRegAddress;USHORT usDiscreteCnt;UCHAR ucNBytes;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++;/* 離散量數(shù)量 */usDiscreteCnt = (USHORT)(pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF] << 8);usDiscreteCnt |= (USHORT)(pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF + 1]);/* 檢查離散量數(shù)量是否合理 */if((usDiscreteCnt >= 1) &&(usDiscreteCnt < MB_PDU_FUNC_READ_DISCCNT_MAX)){/* 構建響應 *//* PDU指針 */pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF];/* PDU長度初始化為0 */*usLen = MB_PDU_FUNC_OFF;/* 功能碼 */*pucFrameCur++ = MB_FUNC_READ_DISCRETE_INPUTS;*usLen += 1;/* 字節(jié)數(shù) */if((usDiscreteCnt & 0x0007) != 0){ucNBytes = (UCHAR)(usDiscreteCnt / 8 + 1);}else{ucNBytes = (UCHAR)(usDiscreteCnt / 8);}*pucFrameCur++ = ucNBytes;*usLen += 1;/* 讀取離散量值 */eRegStatus = eMBRegDiscreteCB(pucFrameCur, usRegAddress, usDiscreteCnt);/* 產生異常 */if(eRegStatus != MB_ENOERR){/* 錯誤轉化為異常碼 */eStatus = prveMBError2Exception(eRegStatus);}/* 未產生異常 */else{/* 數(shù)據(jù)長度 */*usLen += ucNBytes;;}}/* 離散量數(shù)量不合理 */else{/* 非法數(shù)據(jù)值 */eStatus = MB_EX_ILLEGAL_DATA_VALUE;}}/* PDU長度不對 */else{/* 非法數(shù)據(jù)值 */eStatus = MB_EX_ILLEGAL_DATA_VALUE;}return eStatus; }?
總結
以上是生活随笔為你收集整理的FreeModbus离散量输入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cortex-M3异常中断及向量表定义
- 下一篇: STM32之DAC例程