sw k
/
Modbus
a
Fork of Modbus by
main.cpp@1:a6730b74f48b, 2016-12-01 (annotated)
- Committer:
- swk
- Date:
- Thu Dec 01 00:56:19 2016 +0000
- Revision:
- 1:a6730b74f48b
dd
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
swk | 1:a6730b74f48b | 1 | /* |
swk | 1:a6730b74f48b | 2 | * swk |
swk | 1:a6730b74f48b | 3 | * The program is a sample code. |
swk | 1:a6730b74f48b | 4 | * It needs run with some NuMaker-PFM-NUC472 boards. |
swk | 1:a6730b74f48b | 5 | * |
swk | 1:a6730b74f48b | 6 | * Please remeber to modify global definition to enable RS485 port on board. |
swk | 1:a6730b74f48b | 7 | * Modify '//#define DEF_RS485_PORT 1' to '#define DEF_RS485_PORT 1' |
swk | 1:a6730b74f48b | 8 | https://developer.mbed.org/users/wclin/code/modbus-over-rs485-sample/file/f9d748875768/main.cpp |
swk | 1:a6730b74f48b | 9 | */ |
swk | 1:a6730b74f48b | 10 | |
swk | 1:a6730b74f48b | 11 | /* ----------------------- System includes --------------------------------*/ |
swk | 1:a6730b74f48b | 12 | #include "mbed.h" |
swk | 1:a6730b74f48b | 13 | #include "rtos.h" |
swk | 1:a6730b74f48b | 14 | /*----------------------- Modbus includes ----------------------------------*/ |
swk | 1:a6730b74f48b | 15 | #include "mb.h" |
swk | 1:a6730b74f48b | 16 | #include "mbport.h" |
swk | 1:a6730b74f48b | 17 | |
swk | 1:a6730b74f48b | 18 | /* ----------------------- Defines ------------------------------------------*/ |
swk | 1:a6730b74f48b | 19 | // Sharing buffer index |
swk | 1:a6730b74f48b | 20 | enum { |
swk | 1:a6730b74f48b | 21 | eData_MBInCounter, |
swk | 1:a6730b74f48b | 22 | eData_MBOutCounter, |
swk | 1:a6730b74f48b | 23 | eData_MBError, |
swk | 1:a6730b74f48b | 24 | eData_DI, |
swk | 1:a6730b74f48b | 25 | eData_DATA, |
swk | 1:a6730b74f48b | 26 | eData_Cnt |
swk | 1:a6730b74f48b | 27 | } E_DATA_TYPE; |
swk | 1:a6730b74f48b | 28 | |
swk | 1:a6730b74f48b | 29 | #define REG_INPUT_START 1 |
swk | 1:a6730b74f48b | 30 | #define REG_INPUT_NREGS eData_Cnt |
swk | 1:a6730b74f48b | 31 | /* ----------------------- Static variables ---------------------------------*/ |
swk | 1:a6730b74f48b | 32 | static USHORT usRegInputStart = REG_INPUT_START; |
swk | 1:a6730b74f48b | 33 | static USHORT usRegInputBuf[REG_INPUT_NREGS]; |
swk | 1:a6730b74f48b | 34 | |
swk | 1:a6730b74f48b | 35 | DigitalOut led1(LED1); // For temperature worker. |
swk | 1:a6730b74f48b | 36 | DigitalOut led2(LED2); // For Modbus worker. |
swk | 1:a6730b74f48b | 37 | DigitalOut led3(LED3); // For Holder CB |
swk | 1:a6730b74f48b | 38 | |
swk | 1:a6730b74f48b | 39 | #define DEF_PIN_NUM 6 |
swk | 1:a6730b74f48b | 40 | DigitalIn DipSwitch[DEF_PIN_NUM] = { PG_1, PG_2, PF_9, PF_10, PC_10, PC_11 } ; |
swk | 1:a6730b74f48b | 41 | |
swk | 1:a6730b74f48b | 42 | unsigned short GetValueOnDipSwitch() |
swk | 1:a6730b74f48b | 43 | { |
swk | 1:a6730b74f48b | 44 | int i=0; |
swk | 1:a6730b74f48b | 45 | unsigned short usDipValue = 0x0; |
swk | 1:a6730b74f48b | 46 | for ( i=0; i<DEF_PIN_NUM ; i++) |
swk | 1:a6730b74f48b | 47 | usDipValue |= DipSwitch[i].read() << i; |
swk | 1:a6730b74f48b | 48 | usDipValue = (~usDipValue) & 0x003F; |
swk | 1:a6730b74f48b | 49 | return usDipValue; |
swk | 1:a6730b74f48b | 50 | } |
swk | 1:a6730b74f48b | 51 | |
swk | 1:a6730b74f48b | 52 | void worker_uart(void const *args) |
swk | 1:a6730b74f48b | 53 | { |
swk | 1:a6730b74f48b | 54 | int counter=0; |
swk | 1:a6730b74f48b | 55 | // For UART-SERIAL Tx/Rx Service. |
swk | 1:a6730b74f48b | 56 | while (true) |
swk | 1:a6730b74f48b | 57 | { |
swk | 1:a6730b74f48b | 58 | //xMBPortSerialPolling(); |
swk | 1:a6730b74f48b | 59 | if ( counter > 10000 ) |
swk | 1:a6730b74f48b | 60 | { |
swk | 1:a6730b74f48b | 61 | led2 = !led2; |
swk | 1:a6730b74f48b | 62 | counter=0; |
swk | 1:a6730b74f48b | 63 | } |
swk | 1:a6730b74f48b | 64 | counter++; |
swk | 1:a6730b74f48b | 65 | } |
swk | 1:a6730b74f48b | 66 | } |
swk | 1:a6730b74f48b | 67 | |
swk | 1:a6730b74f48b | 68 | /* ----------------------- Start implementation -----------------------------*/ |
swk | 1:a6730b74f48b | 69 | int |
swk | 1:a6730b74f48b | 70 | main( void ) |
swk | 1:a6730b74f48b | 71 | { |
swk | 1:a6730b74f48b | 72 | eMBErrorCode eStatus; |
swk | 1:a6730b74f48b | 73 | //Thread uart_thread(worker_uart); |
swk | 1:a6730b74f48b | 74 | unsigned short usSlaveID=GetValueOnDipSwitch(); |
swk | 1:a6730b74f48b | 75 | |
swk | 1:a6730b74f48b | 76 | // Initialise some registers |
swk | 1:a6730b74f48b | 77 | for (int i=0; i<REG_INPUT_NREGS; i++) |
swk | 1:a6730b74f48b | 78 | usRegInputBuf[i] = 0x0; |
swk | 1:a6730b74f48b | 79 | |
swk | 1:a6730b74f48b | 80 | printf("We will set modbus slave ID-%d(0x%x) for the device.\r\n", usSlaveID, usSlaveID ); |
swk | 1:a6730b74f48b | 81 | |
swk | 1:a6730b74f48b | 82 | /* Enable the Modbus Protocol Stack. */ |
swk | 1:a6730b74f48b | 83 | if ( (eStatus = eMBInit( MB_RTU, usSlaveID, 0, 115200, MB_PAR_NONE )) != MB_ENOERR ) |
swk | 1:a6730b74f48b | 84 | goto FAIL_MB; |
swk | 1:a6730b74f48b | 85 | else if ( (eStatus = eMBEnable( ) ) != MB_ENOERR ) |
swk | 1:a6730b74f48b | 86 | goto FAIL_MB_1; |
swk | 1:a6730b74f48b | 87 | else { |
swk | 1:a6730b74f48b | 88 | for( ;; ) |
swk | 1:a6730b74f48b | 89 | { |
swk | 1:a6730b74f48b | 90 | xMBPortSerialPolling(); |
swk | 1:a6730b74f48b | 91 | if ( eMBPoll( ) != MB_ENOERR ) break; |
swk | 1:a6730b74f48b | 92 | } |
swk | 1:a6730b74f48b | 93 | } |
swk | 1:a6730b74f48b | 94 | |
swk | 1:a6730b74f48b | 95 | FAIL_MB_1: |
swk | 1:a6730b74f48b | 96 | eMBClose(); |
swk | 1:a6730b74f48b | 97 | |
swk | 1:a6730b74f48b | 98 | FAIL_MB: |
swk | 1:a6730b74f48b | 99 | for( ;; ) |
swk | 1:a6730b74f48b | 100 | { |
swk | 1:a6730b74f48b | 101 | led2 = !led2; |
swk | 1:a6730b74f48b | 102 | Thread::wait(200); |
swk | 1:a6730b74f48b | 103 | } |
swk | 1:a6730b74f48b | 104 | } |
swk | 1:a6730b74f48b | 105 | |
swk | 1:a6730b74f48b | 106 | |
swk | 1:a6730b74f48b | 107 | |
swk | 1:a6730b74f48b | 108 | |
swk | 1:a6730b74f48b | 109 | eMBErrorCode |
swk | 1:a6730b74f48b | 110 | eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) |
swk | 1:a6730b74f48b | 111 | { |
swk | 1:a6730b74f48b | 112 | eMBErrorCode eStatus = MB_ENOERR; |
swk | 1:a6730b74f48b | 113 | int iRegIndex; |
swk | 1:a6730b74f48b | 114 | |
swk | 1:a6730b74f48b | 115 | if( ( usAddress >= REG_INPUT_START ) |
swk | 1:a6730b74f48b | 116 | && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) |
swk | 1:a6730b74f48b | 117 | { |
swk | 1:a6730b74f48b | 118 | iRegIndex = ( int )( usAddress - usRegInputStart ); |
swk | 1:a6730b74f48b | 119 | while( usNRegs > 0 ) |
swk | 1:a6730b74f48b | 120 | { |
swk | 1:a6730b74f48b | 121 | *pucRegBuffer++ = |
swk | 1:a6730b74f48b | 122 | ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 ); |
swk | 1:a6730b74f48b | 123 | *pucRegBuffer++ = |
swk | 1:a6730b74f48b | 124 | ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF ); |
swk | 1:a6730b74f48b | 125 | iRegIndex++; |
swk | 1:a6730b74f48b | 126 | usNRegs--; |
swk | 1:a6730b74f48b | 127 | } |
swk | 1:a6730b74f48b | 128 | } |
swk | 1:a6730b74f48b | 129 | else |
swk | 1:a6730b74f48b | 130 | { |
swk | 1:a6730b74f48b | 131 | eStatus = MB_ENOREG; |
swk | 1:a6730b74f48b | 132 | } |
swk | 1:a6730b74f48b | 133 | |
swk | 1:a6730b74f48b | 134 | return eStatus; |
swk | 1:a6730b74f48b | 135 | } |
swk | 1:a6730b74f48b | 136 | |
swk | 1:a6730b74f48b | 137 | eMBErrorCode |
swk | 1:a6730b74f48b | 138 | eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) |
swk | 1:a6730b74f48b | 139 | { |
swk | 1:a6730b74f48b | 140 | eMBErrorCode eStatus = MB_ENOERR; |
swk | 1:a6730b74f48b | 141 | int iRegIndex; |
swk | 1:a6730b74f48b | 142 | |
swk | 1:a6730b74f48b | 143 | usRegInputBuf[eData_MBInCounter]++; |
swk | 1:a6730b74f48b | 144 | usRegInputBuf[eData_MBOutCounter]++; |
swk | 1:a6730b74f48b | 145 | |
swk | 1:a6730b74f48b | 146 | if (eMode == MB_REG_READ) |
swk | 1:a6730b74f48b | 147 | { |
swk | 1:a6730b74f48b | 148 | usRegInputBuf[eData_DI] = GetValueOnDipSwitch(); |
swk | 1:a6730b74f48b | 149 | |
swk | 1:a6730b74f48b | 150 | if( ( usAddress >= REG_INPUT_START ) |
swk | 1:a6730b74f48b | 151 | && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) |
swk | 1:a6730b74f48b | 152 | { |
swk | 1:a6730b74f48b | 153 | iRegIndex = ( int )( usAddress - usRegInputStart ); |
swk | 1:a6730b74f48b | 154 | while( usNRegs > 0 ) |
swk | 1:a6730b74f48b | 155 | { |
swk | 1:a6730b74f48b | 156 | *pucRegBuffer++ = |
swk | 1:a6730b74f48b | 157 | ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 ); |
swk | 1:a6730b74f48b | 158 | *pucRegBuffer++ = |
swk | 1:a6730b74f48b | 159 | ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF ); |
swk | 1:a6730b74f48b | 160 | iRegIndex++; |
swk | 1:a6730b74f48b | 161 | usNRegs--; |
swk | 1:a6730b74f48b | 162 | } |
swk | 1:a6730b74f48b | 163 | } |
swk | 1:a6730b74f48b | 164 | } |
swk | 1:a6730b74f48b | 165 | |
swk | 1:a6730b74f48b | 166 | if (eMode == MB_REG_WRITE) |
swk | 1:a6730b74f48b | 167 | { |
swk | 1:a6730b74f48b | 168 | if( ( usAddress >= REG_INPUT_START ) |
swk | 1:a6730b74f48b | 169 | && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) |
swk | 1:a6730b74f48b | 170 | { |
swk | 1:a6730b74f48b | 171 | iRegIndex = ( int )( usAddress - usRegInputStart ); |
swk | 1:a6730b74f48b | 172 | while( usNRegs > 0 ) |
swk | 1:a6730b74f48b | 173 | { |
swk | 1:a6730b74f48b | 174 | usRegInputBuf[iRegIndex] = ((unsigned int) *pucRegBuffer << 8) | ((unsigned int) *(pucRegBuffer+1)); |
swk | 1:a6730b74f48b | 175 | pucRegBuffer+=2; |
swk | 1:a6730b74f48b | 176 | iRegIndex++; |
swk | 1:a6730b74f48b | 177 | usNRegs--; |
swk | 1:a6730b74f48b | 178 | } |
swk | 1:a6730b74f48b | 179 | } |
swk | 1:a6730b74f48b | 180 | } |
swk | 1:a6730b74f48b | 181 | |
swk | 1:a6730b74f48b | 182 | led3=!led3; |
swk | 1:a6730b74f48b | 183 | |
swk | 1:a6730b74f48b | 184 | return eStatus; |
swk | 1:a6730b74f48b | 185 | } |
swk | 1:a6730b74f48b | 186 | |
swk | 1:a6730b74f48b | 187 | |
swk | 1:a6730b74f48b | 188 | eMBErrorCode |
swk | 1:a6730b74f48b | 189 | eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, |
swk | 1:a6730b74f48b | 190 | eMBRegisterMode eMode ) |
swk | 1:a6730b74f48b | 191 | { |
swk | 1:a6730b74f48b | 192 | return MB_ENOREG; |
swk | 1:a6730b74f48b | 193 | } |
swk | 1:a6730b74f48b | 194 | |
swk | 1:a6730b74f48b | 195 | eMBErrorCode |
swk | 1:a6730b74f48b | 196 | eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) |
swk | 1:a6730b74f48b | 197 | { |
swk | 1:a6730b74f48b | 198 | return MB_ENOREG; |
swk | 1:a6730b74f48b | 199 | } |