diff --git a/APP/src/app_task.c b/APP/src/app_task.c index 4b51d0f..96ac325 100644 --- a/APP/src/app_task.c +++ b/APP/src/app_task.c @@ -46,7 +46,7 @@ void thread_entry_SysMonitor(void* parameter) LED_LED1_OFF; LED_LED2_OFF; rt_thread_delay(DELAY_SYS_RUN_LED); - IWDG_Feed(); //喂狗 + IWDG_Feed(); //feed the dog //Test Modbus Master usModbusUserData[0] = (USHORT)(rt_tick_get()/10); usModbusUserData[1] = (USHORT)(rt_tick_get()%10); diff --git a/FreeModbus/port/port.h b/FreeModbus/port/port.h index 00dd1b1..9205611 100644 --- a/FreeModbus/port/port.h +++ b/FreeModbus/port/port.h @@ -58,6 +58,5 @@ typedef int32_t LONG; void EnterCriticalSection(void); void ExitCriticalSection(void); -void vMBDelay(ULONG nCount); #endif diff --git a/FreeModbus/port/rtt/portevent.c b/FreeModbus/port/rtt/portevent.c index f1c51a2..1a88116 100644 --- a/FreeModbus/port/rtt/portevent.c +++ b/FreeModbus/port/rtt/portevent.c @@ -1,5 +1,5 @@ /* - * FreeModbus Libary: STM32 Port + * FreeModbus Libary: RT-Thread Port * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or diff --git a/FreeModbus/port/rtt/portevent_m.c b/FreeModbus/port/rtt/portevent_m.c index 76ac86d..031a3b8 100644 --- a/FreeModbus/port/rtt/portevent_m.c +++ b/FreeModbus/port/rtt/portevent_m.c @@ -1,5 +1,5 @@ /* - * FreeModbus Libary: STM32 Port + * FreeModbus Libary: RT-Thread Port * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or diff --git a/FreeModbus/port/rtt/portserial.c b/FreeModbus/port/rtt/portserial.c index fbe92d2..0ba8dfb 100644 --- a/FreeModbus/port/rtt/portserial.c +++ b/FreeModbus/port/rtt/portserial.c @@ -1,5 +1,5 @@ /* - * FreeModbus Libary: STM32 Port + * FreeModbus Libary: RT-Thread Port * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or diff --git a/FreeModbus/port/rtt/portserial_m.c b/FreeModbus/port/rtt/portserial_m.c index 85c66de..4dc02d9 100644 --- a/FreeModbus/port/rtt/portserial_m.c +++ b/FreeModbus/port/rtt/portserial_m.c @@ -1,5 +1,5 @@ /* - * FreeModbus Libary: STM32 Port + * FreeModbus Libary: RT-Thread Port * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or diff --git a/FreeModbus/port/rtt/porttimer.c b/FreeModbus/port/rtt/porttimer.c index de5bebc..6f017d8 100644 --- a/FreeModbus/port/rtt/porttimer.c +++ b/FreeModbus/port/rtt/porttimer.c @@ -1,5 +1,5 @@ /* - * FreeModbus Libary: STM32 Port + * FreeModbus Libary: RT-Thread Port * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or @@ -57,11 +57,6 @@ void prvvTIMERExpiredISR(void) (void) pxMBPortCBTimerExpired(); } -/** - * This function is PLC uart receive timer callback function - * - * @param parameter null - */ static void timer_timeout_ind(void* parameter) { prvvTIMERExpiredISR(); diff --git a/FreeModbus/port/rtt/porttimer_m.c b/FreeModbus/port/rtt/porttimer_m.c index b9970ca..69bdc54 100644 --- a/FreeModbus/port/rtt/porttimer_m.c +++ b/FreeModbus/port/rtt/porttimer_m.c @@ -1,5 +1,5 @@ /* - * FreeModbus Libary: STM32 Port + * FreeModbus Libary: RT-Thread Port * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or @@ -57,7 +57,7 @@ void vMBMasterPortTimersT35Enable() rt_tick_t timer_tick = (50 * usT35TimeOut50us) / (1000 * 1000 / RT_TICK_PER_SECOND); - /* Set current timer mode,don't change it.*/ + /* Set current timer mode, don't change it.*/ vMBMasterSetCurTimerMode(MB_TMODE_T35); rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); @@ -69,7 +69,7 @@ void vMBMasterPortTimersConvertDelayEnable() { rt_tick_t timer_tick = MB_MASTER_DELAY_MS_CONVERT * RT_TICK_PER_SECOND / 1000; - /* Set current timer mode,don't change it.*/ + /* Set current timer mode, don't change it.*/ vMBMasterSetCurTimerMode(MB_TMODE_CONVERT_DELAY); rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); @@ -81,7 +81,7 @@ void vMBMasterPortTimersRespondTimeoutEnable() { rt_tick_t timer_tick = MB_MASTER_TIMEOUT_MS_RESPOND * RT_TICK_PER_SECOND / 1000; - /* Set current timer mode,don't change it.*/ + /* Set current timer mode, don't change it.*/ vMBMasterSetCurTimerMode(MB_TMODE_RESPOND_TIMEOUT); rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); @@ -99,11 +99,6 @@ void prvvTIMERExpiredISR(void) (void) pxMBMasterPortCBTimerExpired(); } -/** - * This function is PLC uart receive timer callback function - * - * @param parameter null - */ static void timer_timeout_ind(void* parameter) { prvvTIMERExpiredISR(); diff --git a/FreeModbus/port/user_mb_app.c b/FreeModbus/port/user_mb_app.c index 0fd00b7..e6fdede 100644 --- a/FreeModbus/port/user_mb_app.c +++ b/FreeModbus/port/user_mb_app.c @@ -41,17 +41,17 @@ USHORT usSRegInBuf[S_REG_INPUT_NREGS] ; //Slave mode:HoldingRegister variables USHORT usSRegHoldStart = S_REG_HOLDING_START; USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] ; -//******************************输入寄存器回调函数********************************** -//函数定义: eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) -//描 述:输入寄存器相关的功能(读、连续读) -//入口参数:pucRegBuffer : 回调函数将Modbus寄存器的当前值写入的缓冲区 -// usAddress : 寄存器的起始地址,输入寄存器的地址范围是1-65535。 -// usNRegs : 寄存器数量 -//出口参数:eMBErrorCode : 这个函数将返回的错误码 -//备 注:Editor:Armink 2010-10-31 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) + +/** + * Modbus slave input register callback function. + * + * @param pucRegBuffer input register buffer + * @param usAddress input register address + * @param usNRegs input register number + * + * @return result + */ +eMBErrorCode eMBRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) { eMBErrorCode eStatus = MB_ENOERR; USHORT iRegIndex; @@ -60,20 +60,22 @@ eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) USHORT REG_INPUT_NREGS; USHORT usRegInStart; - pusRegInputBuf = usSRegInBuf; - REG_INPUT_START = S_REG_INPUT_START; - REG_INPUT_NREGS = S_REG_INPUT_NREGS; - usRegInStart = usSRegInStart; + pusRegInputBuf = usSRegInBuf; + REG_INPUT_START = S_REG_INPUT_START; + REG_INPUT_NREGS = S_REG_INPUT_NREGS; + usRegInStart = usSRegInStart; - usAddress--;//FreeModbus功能函数中已经加1,为保证与缓冲区首地址一致,故减1 - if( ( usAddress >= REG_INPUT_START ) - && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= REG_INPUT_START) + && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS)) { iRegIndex = usAddress - usRegInStart; - while( usNRegs > 0 ) + while (usNRegs > 0) { - *pucRegBuffer++ = (unsigned char) (pusRegInputBuf[iRegIndex] >> 8); - *pucRegBuffer++ = ( unsigned char )( pusRegInputBuf[iRegIndex] & 0xFF ); + *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] >> 8); + *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] & 0xFF); iRegIndex++; usNRegs--; } @@ -85,20 +87,19 @@ eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) return eStatus; } -//******************************保持寄存器回调函数********************************** -//函数定义: eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) -//描 述:保持寄存器相关的功能(读、连续读、写、连续写) -//入口参数:pucRegBuffer : 如果需要更新用户寄存器数值,这个缓冲区必须指向新的寄存器数值。 -// 如果协议栈想知道当前的数值,回调函数必须将当前值写入这个缓冲区 -// usAddress : 寄存器的起始地址。 -// usNRegs : 寄存器数量 -// eMode : 如果该参数为eMBRegisterMode::MB_REG_WRITE,用户的应用数值将从pucRegBuffer中得到更新。 -// 如果该参数为eMBRegisterMode::MB_REG_READ,用户需要将当前的应用数据存储在pucRegBuffer中 -//出口参数:eMBErrorCode : 这个函数将返回的错误码 -//备 注:Editor:Armink 2010-10-31 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) + +/** + * Modbus slave holding register callback function. + * + * @param pucRegBuffer holding register buffer + * @param usAddress holding register address + * @param usNRegs holding register number + * @param eMode read or write + * + * @return result + */ +eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNRegs, eMBRegisterMode eMode) { eMBErrorCode eStatus = MB_ENOERR; USHORT iRegIndex; @@ -107,33 +108,34 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi USHORT REG_HOLDING_NREGS; USHORT usRegHoldStart; - pusRegHoldingBuf = usSRegHoldBuf; - REG_HOLDING_START = S_REG_HOLDING_START; - REG_HOLDING_NREGS = S_REG_HOLDING_NREGS; - usRegHoldStart = usSRegHoldStart; + pusRegHoldingBuf = usSRegHoldBuf; + REG_HOLDING_START = S_REG_HOLDING_START; + REG_HOLDING_NREGS = S_REG_HOLDING_NREGS; + usRegHoldStart = usSRegHoldStart; - usAddress--;//FreeModbus功能函数中已经加1,为保证与缓冲区首地址一致,故减1 - if( ( usAddress >= REG_HOLDING_START ) && - ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) ) + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= REG_HOLDING_START) + && (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)) { iRegIndex = usAddress - usRegHoldStart; - switch ( eMode ) + switch (eMode) { - /* Pass current register values to the protocol stack. */ + /* read current register values from the protocol stack. */ case MB_REG_READ: - while( usNRegs > 0 ) + while (usNRegs > 0) { - *pucRegBuffer++ = ( unsigned char )( pusRegHoldingBuf[iRegIndex] >> 8 ); - *pucRegBuffer++ = ( unsigned char )( pusRegHoldingBuf[iRegIndex] & 0xFF ); + *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8); + *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF); iRegIndex++; usNRegs--; } break; - /* Update current register values with new values from the - * protocol stack. */ + /* write current register values with new values from the protocol stack. */ case MB_REG_WRITE: - while( usNRegs > 0 ) + while (usNRegs > 0) { pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8; pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; @@ -149,70 +151,76 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi } return eStatus; } -//****************************线圈状态寄存器回调函数******************************** -//函数定义: eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) -//描 述:线圈状态寄存器相关的功能(读、连续读、写、连续写) -//入口参数:pucRegBuffer : 位组成一个字节,起始寄存器对应的位处于该字节pucRegBuffer的最低位LSB。 -// 如果回调函数要写这个缓冲区,没有用到的线圈(例如不是8个一组的线圈状态)对应的位的数值必须设置位0。 -// usAddress : 第一个线圈地址。 -// usNCoils : 请求的线圈个数 -// eMode ;如果该参数为eMBRegisterMode::MB_REG_WRITE,用户的应用数值将从pucRegBuffer中得到更新。 -// 如果该参数为eMBRegisterMode::MB_REG_READ,用户需要将当前的应用数据存储在pucRegBuffer中 -//出口参数:eMBErrorCode : 这个函数将返回的错误码 -//备 注:Editor:Armink 2010-10-31 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) + +/** + * Modbus slave coils callback function. + * + * @param pucRegBuffer coils buffer + * @param usAddress coils address + * @param usNCoils coils number + * @param eMode read or write + * + * @return result + */ +eMBErrorCode eMBRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNCoils, eMBRegisterMode eMode) { eMBErrorCode eStatus = MB_ENOERR; USHORT iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucCoilBuf; - USHORT COIL_START; - USHORT COIL_NCOILS; - USHORT usCoilStart; - iNReg = usNCoils / 8 + 1; //占用寄存器数量 + UCHAR * pucCoilBuf; + USHORT COIL_START; + USHORT COIL_NCOILS; + USHORT usCoilStart; + iNReg = usNCoils / 8 + 1; - pucCoilBuf = ucSCoilBuf; - COIL_START = S_COIL_START; - COIL_NCOILS = S_COIL_NCOILS; - usCoilStart = usSCoilStart; + pucCoilBuf = ucSCoilBuf; + COIL_START = S_COIL_START; + COIL_NCOILS = S_COIL_NCOILS; + usCoilStart = usSCoilStart; + + /* it already plus one in modbus function method. */ + usAddress--; - usAddress--;//FreeModbus功能函数中已经加1,为保证与缓冲区首地址一致,故减1 if( ( usAddress >= COIL_START ) && ( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) ) { - iRegIndex = ( int )( usAddress - usCoilStart ) / 8 ; //每个寄存器存8个 - iRegBitIndex = ( int )( usAddress - usCoilStart ) % 8 ; //相对于寄存器内部的位地址 + iRegIndex = (USHORT) (usAddress - usCoilStart) / 8; + iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8; switch ( eMode ) { - /* Pass current coil values to the protocol stack. */ + /* read current coil values from the protocol stack. */ case MB_REG_READ: - while( iNReg > 0 ) + while (iNReg > 0) { - *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++] , iRegBitIndex , 8); - iNReg --; - } - pucRegBuffer --; - usNCoils = usNCoils % 8; //余下的线圈数 - *pucRegBuffer = *pucRegBuffer <<(8 - usNCoils); //高位补零 - *pucRegBuffer = *pucRegBuffer >>(8 - usNCoils); - break; - - /* Update current coil values with new values from the - * protocol stack. */ - case MB_REG_WRITE: - while(iNReg > 1) //最后面余下来的数单独算 - { - xMBUtilSetBits(&pucCoilBuf[iRegIndex++] , iRegBitIndex , 8 , *pucRegBuffer++); + *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++], + iRegBitIndex, 8); iNReg--; } - usNCoils = usNCoils % 8; //余下的线圈数 - if (usNCoils != 0) //xMBUtilSetBits方法 在操作位数量为0时存在bug - { - xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils, - *pucRegBuffer++); - } - break; + pucRegBuffer--; + /* last coils */ + usNCoils = usNCoils % 8; + /* filling zero to high bit */ + *pucRegBuffer = *pucRegBuffer << (8 - usNCoils); + *pucRegBuffer = *pucRegBuffer >> (8 - usNCoils); + break; + + /* write current coil values with new values from the protocol stack. */ + case MB_REG_WRITE: + while (iNReg > 1) + { + xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8, + *pucRegBuffer++); + iNReg--; + } + /* last coils */ + usNCoils = usNCoils % 8; + /* xMBUtilSetBits has bug when ucNBits is zero */ + if (usNCoils != 0) + { + xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils, + *pucRegBuffer++); + } + break; } } else @@ -221,49 +229,52 @@ eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegis } return eStatus; } -//****************************离散输入寄存器回调函数******************************** -//函数定义: eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) -//描 述:离散输入寄存器相关的功能(读、连续读) -//入口参数:pucRegBuffer : 用当前的线圈数据更新这个寄存器,起始寄存器对应的位处于该字节pucRegBuffer的最低位LSB。 -// 如果回调函数要写这个缓冲区,没有用到的线圈(例如不是8个一组的线圈状态)对应的位的数值必须设置为0。 -// usAddress : 离散输入的起始地址 -// usNDiscrete : 离散输入点数量 -//出口参数:eMBErrorCode : 这个函数将返回的错误码 -//备 注:Editor:Armink 2010-10-31 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) + +/** + * Modbus slave discrete callback function. + * + * @param pucRegBuffer discrete buffer + * @param usAddress discrete address + * @param usNDiscrete discrete number + * + * @return result + */ +eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) { eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucDiscreteInputBuf; - USHORT DISCRETE_INPUT_START; - USHORT DISCRETE_INPUT_NDISCRETES; - USHORT usDiscreteInputStart; - iNReg = usNDiscrete / 8 + 1; //占用寄存器数量 + USHORT iRegIndex , iRegBitIndex , iNReg; + UCHAR * pucDiscreteInputBuf; + USHORT DISCRETE_INPUT_START; + USHORT DISCRETE_INPUT_NDISCRETES; + USHORT usDiscreteInputStart; + iNReg = usNDiscrete / 8 + 1; - pucDiscreteInputBuf = ucSDiscInBuf; - DISCRETE_INPUT_START = S_DISCRETE_INPUT_START; - DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES; - usDiscreteInputStart = usSDiscInStart; + pucDiscreteInputBuf = ucSDiscInBuf; + DISCRETE_INPUT_START = S_DISCRETE_INPUT_START; + DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES; + usDiscreteInputStart = usSDiscInStart; - usAddress--;//FreeModbus功能函数中已经加1,为保证与缓冲区首地址一致,故减1 - if( ( usAddress >= DISCRETE_INPUT_START ) - && ( usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES ) ) + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= DISCRETE_INPUT_START) + && (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES)) { - iRegIndex = ( int )( usAddress - usDiscreteInputStart ) / 8 ; //每个寄存器存8个 - iRegBitIndex = ( int )( usAddress - usDiscreteInputStart ) % 8 ; //相对于寄存器内部的位地址 + iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8; //每个寄存器存8个 + iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8; //相对于寄存器内部的位地址 - while (iNReg > 0) - { - *pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++], - iRegBitIndex, 8); - iNReg--; - } - pucRegBuffer--; - usNDiscrete = usNDiscrete % 8; //余下的线圈数 - *pucRegBuffer = *pucRegBuffer << (8 - usNDiscrete); //高位补零 - *pucRegBuffer = *pucRegBuffer >>(8 - usNDiscrete); + while (iNReg > 0) + { + *pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++], + iRegBitIndex, 8); + iNReg--; + } + pucRegBuffer--; + /* last discrete */ + usNDiscrete = usNDiscrete % 8; + /* filling zero to high bit */ + *pucRegBuffer = *pucRegBuffer << (8 - usNDiscrete); + *pucRegBuffer = *pucRegBuffer >> (8 - usNDiscrete); } else { diff --git a/FreeModbus/port/user_mb_app.h b/FreeModbus/port/user_mb_app.h index 104dcf4..846b9a3 100644 --- a/FreeModbus/port/user_mb_app.h +++ b/FreeModbus/port/user_mb_app.h @@ -1,4 +1,4 @@ -#ifndef USER_APP +#ifndef USER_APP #define USER_APP /* ----------------------- Modbus includes ----------------------------------*/ #include "mb.h" @@ -16,19 +16,16 @@ #define S_REG_INPUT_NREGS 100 #define S_REG_HOLDING_START 0 #define S_REG_HOLDING_NREGS 100 -//从机模式:在保持寄存器中,各个地址对应的功能定义 -#define S_HD_RESERVE 0 //保留 -#define S_HD_CPU_USAGE_MAJOR 1 //当前CPU利用率的整数位 -#define S_HD_CPU_USAGE_MINOR 2 //当前CPU利用率的小数位 - -//从机模式:在输入寄存器中,各个地址对应的功能定义 -#define S_IN_RESERVE 0 //保留 - -//从机模式:在线圈中,各个地址对应的功能定义 -#define S_CO_RESERVE 2 //保留 - -//从机模式:在离散输入中,各个地址对应的功能定义 -#define S_DI_RESERVE 1 //保留 +/* salve mode: holding register's all address */ +#define S_HD_RESERVE 0 +#define S_HD_CPU_USAGE_MAJOR 1 +#define S_HD_CPU_USAGE_MINOR 2 +/* salve mode: input register's all address */ +#define S_IN_RESERVE 0 +/* salve mode: coil's all address */ +#define S_CO_RESERVE 0 +/* salve mode: discrete's all address */ +#define S_DI_RESERVE 0 /* -----------------------Master Defines -------------------------------------*/ #define M_DISCRETE_INPUT_START 0 @@ -39,16 +36,13 @@ #define M_REG_INPUT_NREGS 100 #define M_REG_HOLDING_START 0 #define M_REG_HOLDING_NREGS 100 -//主机模式:在保持寄存器中,各个地址对应的功能定义 -#define M_HD_RESERVE 0 //保留 - -//主机模式:在输入寄存器中,各个地址对应的功能定义 -#define M_IN_RESERVE 0 //保留 - -//主机模式:在线圈中,各个地址对应的功能定义 -#define M_CO_RESERVE 2 //保留 - -//主机模式:在离散输入中,各个地址对应的功能定义 -#define M_DI_RESERVE 1 //保留 +/* master mode: holding register's all address */ +#define M_HD_RESERVE 0 +/* master mode: input register's all address */ +#define M_IN_RESERVE 0 +/* master mode: coil's all address */ +#define M_CO_RESERVE 0 +/* master mode: discrete's all address */ +#define M_DI_RESERVE 0 #endif diff --git a/FreeModbus/port/user_mb_app_m.c b/FreeModbus/port/user_mb_app_m.c index 5f96d03..12fabf2 100644 --- a/FreeModbus/port/user_mb_app_m.c +++ b/FreeModbus/port/user_mb_app_m.c @@ -43,17 +43,16 @@ USHORT usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS]; USHORT usMRegHoldStart = M_REG_HOLDING_START; USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS]; -//******************************输入寄存器回调函数********************************** -//函数定义: eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) -//描 述:输入寄存器相关的功能(读、连续读) -//入口参数:pucRegBuffer : 回调函数将Modbus寄存器的当前值写入的缓冲区 -// usAddress : 寄存器的起始地址,输入寄存器的地址范围是1-65535。 -// usNRegs : 寄存器数量 -//出口参数:eMBErrorCode : 这个函数将返回的错误码 -//备 注:Editor:Armink 2013-11-25 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) +/** + * Modbus master input register callback function. + * + * @param pucRegBuffer input register buffer + * @param usAddress input register address + * @param usNRegs input register number + * + * @return result + */ +eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) { eMBErrorCode eStatus = MB_ENOERR; USHORT iRegIndex; @@ -62,20 +61,22 @@ eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) USHORT REG_INPUT_NREGS; USHORT usRegInStart; - pusRegInputBuf = usMRegInBuf[ucMBMasterGetDestAddress() - 1]; - REG_INPUT_START = M_REG_INPUT_START; - REG_INPUT_NREGS = M_REG_INPUT_NREGS; - usRegInStart = usMRegInStart; + pusRegInputBuf = usMRegInBuf[ucMBMasterGetDestAddress() - 1]; + REG_INPUT_START = M_REG_INPUT_START; + REG_INPUT_NREGS = M_REG_INPUT_NREGS; + usRegInStart = usMRegInStart; - usAddress--;//FreeModbus功能函数中已经加1,为保证与缓冲区首地址一致,故减1 - if( ( usAddress >= REG_INPUT_START ) - && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= REG_INPUT_START) + && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS)) { iRegIndex = usAddress - usRegInStart; - while( usNRegs > 0 ) + while (usNRegs > 0) { - pusRegInputBuf[iRegIndex] = *pucRegBuffer++ << 8; - pusRegInputBuf[iRegIndex] |= *pucRegBuffer++; + pusRegInputBuf[iRegIndex] = *pucRegBuffer++ << 8; + pusRegInputBuf[iRegIndex] |= *pucRegBuffer++; iRegIndex++; usNRegs--; } @@ -87,20 +88,19 @@ eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) return eStatus; } -//******************************保持寄存器回调函数********************************** -//函数定义: eMBErrorCode eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) -//描 述:保持寄存器相关的功能(读、连续读、写、连续写) -//入口参数:pucRegBuffer : 如果需要更新用户寄存器数值,这个缓冲区必须指向新的寄存器数值。 -// 如果协议栈想知道当前的数值,回调函数必须将当前值写入这个缓冲区 -// usAddress : 寄存器的起始地址。 -// usNRegs : 寄存器数量 -// eMode : 如果该参数为eMBRegisterMode::MB_REG_WRITE,用户的应用数值将从pucRegBuffer中得到更新。 -// 如果该参数为eMBRegisterMode::MB_REG_READ,用户需要将当前的应用数据存储在pucRegBuffer中 -//出口参数:eMBErrorCode : 这个函数将返回的错误码 -//备 注:Editor:Armink 2013-11-25 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) + +/** + * Modbus master holding register callback function. + * + * @param pucRegBuffer holding register buffer + * @param usAddress holding register address + * @param usNRegs holding register number + * @param eMode read or write + * + * @return result + */ +eMBErrorCode eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNRegs, eMBRegisterMode eMode) { eMBErrorCode eStatus = MB_ENOERR; USHORT iRegIndex; @@ -109,35 +109,35 @@ eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, e USHORT REG_HOLDING_NREGS; USHORT usRegHoldStart; - pusRegHoldingBuf = usMRegHoldBuf[ucMBMasterGetDestAddress() - 1]; - REG_HOLDING_START = M_REG_HOLDING_START; - REG_HOLDING_NREGS = M_REG_HOLDING_NREGS; - usRegHoldStart = usMRegHoldStart; - //If mode is read,the master will wirte the received date to bufffer. - eMode = MB_REG_WRITE; + pusRegHoldingBuf = usMRegHoldBuf[ucMBMasterGetDestAddress() - 1]; + REG_HOLDING_START = M_REG_HOLDING_START; + REG_HOLDING_NREGS = M_REG_HOLDING_NREGS; + usRegHoldStart = usMRegHoldStart; + /* if mode is read, the master will write the received date to buffer. */ + eMode = MB_REG_WRITE; - usAddress--;//FreeModbus功能函数中已经加1,为保证与缓冲区首地址一致,故减1 - if( ( usAddress >= REG_HOLDING_START ) && - ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) ) + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= REG_HOLDING_START) + && (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)) { iRegIndex = usAddress - usRegHoldStart; - switch ( eMode ) + switch (eMode) { - /* Pass current register values to the protocol stack. */ + /* read current register values from the protocol stack. */ case MB_REG_READ: - while( usNRegs > 0 ) + while (usNRegs > 0) { - *pucRegBuffer++ = ( unsigned char )( pusRegHoldingBuf[iRegIndex] >> 8 ); - *pucRegBuffer++ = ( unsigned char )( pusRegHoldingBuf[iRegIndex] & 0xFF ); + *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8); + *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF); iRegIndex++; usNRegs--; } break; - - /* Update current register values with new values from the - * protocol stack. */ + /* write current register values with new values from the protocol stack. */ case MB_REG_WRITE: - while( usNRegs > 0 ) + while (usNRegs > 0) { pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8; pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; @@ -153,72 +153,79 @@ eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, e } return eStatus; } -//****************************线圈状态寄存器回调函数******************************** -//函数定义: eMBErrorCode eMBMasterRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) -//描 述:线圈状态寄存器相关的功能(读、连续读、写、连续写) -//入口参数:pucRegBuffer : 位组成一个字节,起始寄存器对应的位处于该字节pucRegBuffer的最低位LSB。 -// 如果回调函数要写这个缓冲区,没有用到的线圈(例如不是8个一组的线圈状态)对应的位的数值必须设置位0。 -// usAddress : 第一个线圈地址。 -// usNCoils : 请求的线圈个数 -// eMode ;如果该参数为eMBRegisterMode::MB_REG_WRITE,用户的应用数值将从pucRegBuffer中得到更新。 -// 如果该参数为eMBRegisterMode::MB_REG_READ,用户需要将当前的应用数据存储在pucRegBuffer中 -//出口参数:eMBErrorCode : 这个函数将返回的错误码 -//备 注:Editor:Armink 2013-11-25 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBMasterRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) + +/** + * Modbus master coils callback function. + * + * @param pucRegBuffer coils buffer + * @param usAddress coils address + * @param usNCoils coils number + * @param eMode read or write + * + * @return result + */ +eMBErrorCode eMBMasterRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNCoils, eMBRegisterMode eMode) { eMBErrorCode eStatus = MB_ENOERR; USHORT iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucCoilBuf; - USHORT COIL_START; - USHORT COIL_NCOILS; - USHORT usCoilStart; - iNReg = usNCoils / 8 + 1; //占用寄存器数量 + UCHAR * pucCoilBuf; + USHORT COIL_START; + USHORT COIL_NCOILS; + USHORT usCoilStart; + iNReg = usNCoils / 8 + 1; - pucCoilBuf = ucMCoilBuf[ucMBMasterGetDestAddress() - 1]; - COIL_START = M_COIL_START; - COIL_NCOILS = M_COIL_NCOILS; - usCoilStart = usMCoilStart; - //If mode is read,the master will wirte the received date to bufffer. - eMode = MB_REG_WRITE; + pucCoilBuf = ucMCoilBuf[ucMBMasterGetDestAddress() - 1]; + COIL_START = M_COIL_START; + COIL_NCOILS = M_COIL_NCOILS; + usCoilStart = usMCoilStart; - usAddress--;//FreeModbus功能函数中已经加1,为保证与缓冲区首地址一致,故减1 - if( ( usAddress >= COIL_START ) && - ( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) ) + /* if mode is read,the master will write the received date to buffer. */ + eMode = MB_REG_WRITE; + + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= COIL_START) + && (usAddress + usNCoils <= COIL_START + COIL_NCOILS)) { - iRegIndex = ( int )( usAddress - usCoilStart ) / 8 ; //每个寄存器存8个 - iRegBitIndex = ( int )( usAddress - usCoilStart ) % 8 ; //相对于寄存器内部的位地址 - switch ( eMode ) + iRegIndex = (USHORT) (usAddress - usCoilStart) / 8; + iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8; + switch (eMode) { - /* Pass current coil values to the protocol stack. */ + /* read current coil values from the protocol stack. */ case MB_REG_READ: - while( iNReg > 0 ) + while (iNReg > 0) { - *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++] , iRegBitIndex , 8); - iNReg --; - } - pucRegBuffer --; - usNCoils = usNCoils % 8; //余下的线圈数 - *pucRegBuffer = *pucRegBuffer <<(8 - usNCoils); //高位补零 - *pucRegBuffer = *pucRegBuffer >>(8 - usNCoils); - break; - - /* Update current coil values with new values from the - * protocol stack. */ - case MB_REG_WRITE: - while(iNReg > 1) //最后面余下来的数单独算 - { - xMBUtilSetBits(&pucCoilBuf[iRegIndex++] , iRegBitIndex , 8 , *pucRegBuffer++); + *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++], + iRegBitIndex, 8); iNReg--; } - usNCoils = usNCoils % 8; //余下的线圈数 - if (usNCoils != 0) //xMBUtilSetBits方法 在操作位数量为0时存在bug - { - xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils, - *pucRegBuffer++); - } - break; + pucRegBuffer--; + /* last coils */ + usNCoils = usNCoils % 8; + /* filling zero to high bit */ + *pucRegBuffer = *pucRegBuffer << (8 - usNCoils); + *pucRegBuffer = *pucRegBuffer >> (8 - usNCoils); + break; + + /* write current coil values with new values from the protocol stack. */ + case MB_REG_WRITE: + while (iNReg > 1) + { + xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8, + *pucRegBuffer++); + iNReg--; + } + /* last coils */ + usNCoils = usNCoils % 8; + /* xMBUtilSetBits has bug when ucNBits is zero */ + if (usNCoils != 0) + { + xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils, + *pucRegBuffer++); + } + break; } } else @@ -227,53 +234,55 @@ eMBMasterRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eM } return eStatus; } -//****************************离散输入寄存器回调函数******************************** -//函数定义: eMBErrorCode eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) -//描 述:离散输入寄存器相关的功能(读、连续读) -//入口参数:pucRegBuffer : 用当前的线圈数据更新这个寄存器,起始寄存器对应的位处于该字节pucRegBuffer的最低位LSB。 -// 如果回调函数要写这个缓冲区,没有用到的线圈(例如不是8个一组的线圈状态)对应的位的数值必须设置为0。 -// usAddress : 离散输入的起始地址 -// usNDiscrete : 离散输入点数量 -//出口参数:eMBErrorCode : 这个函数将返回的错误码 -//备 注:Editor:Armink 2013-11-25 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) + +/** + * Modbus master discrete callback function. + * + * @param pucRegBuffer discrete buffer + * @param usAddress discrete address + * @param usNDiscrete discrete number + * + * @return result + */ +eMBErrorCode eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) { eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucDiscreteInputBuf; - USHORT DISCRETE_INPUT_START; - USHORT DISCRETE_INPUT_NDISCRETES; - USHORT usDiscreteInputStart; - iNReg = usNDiscrete / 8 + 1; //占用寄存器数量 + USHORT iRegIndex , iRegBitIndex , iNReg; + UCHAR * pucDiscreteInputBuf; + USHORT DISCRETE_INPUT_START; + USHORT DISCRETE_INPUT_NDISCRETES; + USHORT usDiscreteInputStart; + iNReg = usNDiscrete / 8 + 1; - pucDiscreteInputBuf = ucMDiscInBuf[ucMBMasterGetDestAddress() - 1]; - DISCRETE_INPUT_START = M_DISCRETE_INPUT_START; - DISCRETE_INPUT_NDISCRETES = M_DISCRETE_INPUT_NDISCRETES; - usDiscreteInputStart = usMDiscInStart; + pucDiscreteInputBuf = ucMDiscInBuf[ucMBMasterGetDestAddress() - 1]; + DISCRETE_INPUT_START = M_DISCRETE_INPUT_START; + DISCRETE_INPUT_NDISCRETES = M_DISCRETE_INPUT_NDISCRETES; + usDiscreteInputStart = usMDiscInStart; - usAddress--;//FreeModbus功能函数中已经加1,为保证与缓冲区首地址一致,故减1 - if( ( usAddress >= DISCRETE_INPUT_START ) - && ( usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES ) ) + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= DISCRETE_INPUT_START) + && (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES)) { - iRegIndex = ( int )( usAddress - usDiscreteInputStart ) / 8 ; //每个寄存器存8个 - iRegBitIndex = ( int )( usAddress - usDiscreteInputStart ) % 8 ; //相对于寄存器内部的位地址 + iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8; + iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8; - /* Update current coil values with new values from the - * protocol stack. */ - while (iNReg > 1) //最后面余下来的数单独算 - { - xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, 8, - *pucRegBuffer++); - iNReg--; - } - usNDiscrete = usNDiscrete % 8; //余下的线圈数 - if (usNDiscrete != 0) //xMBUtilSetBits方法 在操作位数量为0时存在bug - { - xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, - usNDiscrete, *pucRegBuffer++); - } + /* write current discrete values with new values from the protocol stack. */ + while (iNReg > 1) + { + xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, 8, + *pucRegBuffer++); + iNReg--; + } + /* last discrete */ + usNDiscrete = usNDiscrete % 8; + /* xMBUtilSetBits has bug when ucNBits is zero */ + if (usNDiscrete != 0) + { + xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, + usNDiscrete, *pucRegBuffer++); + } } else {