輸入寄存器的訪問屬性爲只讀
對輸入寄存器的操作包括:讀輸入寄存器(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;
}