a

Dependencies:   mbed

Fork of Modbus by Matthew Waddilove

Committer:
swk
Date:
Thu Dec 01 00:56:19 2016 +0000
Revision:
1:a6730b74f48b
dd

Who changed what in which revision?

UserRevisionLine numberNew 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 }