输入寄存器的访问属性为只读
对输入寄存器的操作包括:读输入寄存器(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;
}