Programme Nucleo RS485 - Modbus TCP/IP (ACP 40)

Fork of Modbus by Cam Marshall

Committer:
TomTom83
Date:
Fri Jul 06 11:45:57 2018 +0000
Revision:
2:b6ae32d99b4a
Parent:
1:390d9808cdde
Programme RS485 - Modbus TCP/IP (ACP40)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cam 0:0453a0a7e500 1 /*
cam 0:0453a0a7e500 2 * FreeModbus Libary: BARE Demo Application
cam 0:0453a0a7e500 3 * Copyright (C) 2006 Christian Walter <wolti@sil.at>
cam 0:0453a0a7e500 4 *
cam 0:0453a0a7e500 5 * This program is free software; you can redistribute it and/or modify
cam 0:0453a0a7e500 6 * it under the terms of the GNU General Public License as published by
cam 0:0453a0a7e500 7 * the Free Software Foundation; either version 2 of the License, or
cam 0:0453a0a7e500 8 * (at your option) any later version.
cam 0:0453a0a7e500 9 *
cam 0:0453a0a7e500 10 * This program is distributed in the hope that it will be useful,
cam 0:0453a0a7e500 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cam 0:0453a0a7e500 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cam 0:0453a0a7e500 13 * GNU General Public License for more details.
cam 0:0453a0a7e500 14 *
cam 0:0453a0a7e500 15 * You should have received a copy of the GNU General Public License
cam 0:0453a0a7e500 16 * along with this program; if not, write to the Free Software
cam 0:0453a0a7e500 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
cam 0:0453a0a7e500 18 *
cam 0:0453a0a7e500 19 * File: $Id: demo.c,v 1.1 2006/08/22 21:35:13 wolti Exp $
cam 0:0453a0a7e500 20 */
cam 0:0453a0a7e500 21
cam 0:0453a0a7e500 22 /* ----------------------- System includes --------------------------------*/
cam 0:0453a0a7e500 23
cam 0:0453a0a7e500 24 /* ----------------------- Modbus includes ----------------------------------*/
TomTom83 1:390d9808cdde 25 #include "mbed.h"
TomTom83 1:390d9808cdde 26 #include "EthernetInterface.h"
cam 0:0453a0a7e500 27 #include "mb.h"
cam 0:0453a0a7e500 28 #include "mbport.h"
cam 0:0453a0a7e500 29
cam 0:0453a0a7e500 30 /* ----------------------- Defines ------------------------------------------*/
TomTom83 2:b6ae32d99b4a 31 #define REG_INPUT_START 1
TomTom83 1:390d9808cdde 32 #define REG_INPUT_NREGS 20
TomTom83 1:390d9808cdde 33 #define SLAVE_ID 0x00
cam 0:0453a0a7e500 34
cam 0:0453a0a7e500 35 /* ----------------------- Static variables ---------------------------------*/
cam 0:0453a0a7e500 36 static USHORT usRegInputStart = REG_INPUT_START;
cam 0:0453a0a7e500 37 static USHORT usRegInputBuf[REG_INPUT_NREGS];
cam 0:0453a0a7e500 38
cam 0:0453a0a7e500 39 /* ----------------------- Start implementation -----------------------------*/
TomTom83 1:390d9808cdde 40
TomTom83 1:390d9808cdde 41 Ticker flipper;
TomTom83 1:390d9808cdde 42 Serial le_pc(SERIAL_TX, SERIAL_RX);
TomTom83 1:390d9808cdde 43 Serial RS485(D1, D0);
TomTom83 1:390d9808cdde 44 DigitalIn mybutton(USER_BUTTON);
TomTom83 1:390d9808cdde 45 DigitalOut myled(LED1);
TomTom83 1:390d9808cdde 46 DigitalOut myled2(LED2);
TomTom83 1:390d9808cdde 47 DigitalOut myled3(LED3);
TomTom83 1:390d9808cdde 48
TomTom83 1:390d9808cdde 49 int i=0;
TomTom83 1:390d9808cdde 50 int timer=0;
TomTom83 1:390d9808cdde 51 char new_adr[13]="#adrADR000\r";
TomTom83 1:390d9808cdde 52
TomTom83 1:390d9808cdde 53 void flip1()
TomTom83 1:390d9808cdde 54 {
TomTom83 1:390d9808cdde 55 le_pc.printf("\n\ri=%i\n\r",i);
TomTom83 1:390d9808cdde 56 RS485.puts("#???ADR\r");
TomTom83 1:390d9808cdde 57 le_pc.puts("#???ADR\r");
TomTom83 1:390d9808cdde 58 if(i!=0) i=0;
TomTom83 1:390d9808cdde 59 timer++;
TomTom83 1:390d9808cdde 60 myled3=!myled3;
TomTom83 1:390d9808cdde 61 }
TomTom83 1:390d9808cdde 62
TomTom83 1:390d9808cdde 63 void flip2()
TomTom83 1:390d9808cdde 64 {
TomTom83 1:390d9808cdde 65 le_pc.printf("\n\ri=%i\n\r",i);
TomTom83 1:390d9808cdde 66 RS485.printf("%s",&new_adr[0]);
TomTom83 1:390d9808cdde 67 le_pc.printf("%s",&new_adr[0]);
TomTom83 1:390d9808cdde 68 if(i!=0) i=0;
TomTom83 1:390d9808cdde 69 timer++;
TomTom83 1:390d9808cdde 70 myled=!myled;
TomTom83 1:390d9808cdde 71 }
TomTom83 1:390d9808cdde 72
TomTom83 1:390d9808cdde 73 void flip3()
TomTom83 1:390d9808cdde 74 {
TomTom83 1:390d9808cdde 75 RS485.puts("#000STA\r");
TomTom83 1:390d9808cdde 76 le_pc.printf("i=%i\n\r",i);
TomTom83 1:390d9808cdde 77 if(i!=0) i=0;
TomTom83 1:390d9808cdde 78 myled2=!myled2;
TomTom83 1:390d9808cdde 79 }
TomTom83 1:390d9808cdde 80
TomTom83 1:390d9808cdde 81
cam 0:0453a0a7e500 82 int
cam 0:0453a0a7e500 83 main( void )
cam 0:0453a0a7e500 84 {
TomTom83 1:390d9808cdde 85 uint32_t var;
TomTom83 1:390d9808cdde 86 unsigned short var_bon;
TomTom83 1:390d9808cdde 87
TomTom83 1:390d9808cdde 88 char buffer[150];
TomTom83 1:390d9808cdde 89 RS485.baud(9600);
TomTom83 1:390d9808cdde 90 RS485.format(8,SerialBase::None,1);
TomTom83 1:390d9808cdde 91 printf("START OF THE TESTS\n");
TomTom83 1:390d9808cdde 92 eMBErrorCode eStatus;
TomTom83 1:390d9808cdde 93 EthernetInterface eth;
TomTom83 1:390d9808cdde 94 //eth.set_network("169.254.178.1","255.255.0.0","169.254.178.3");
TomTom83 1:390d9808cdde 95 eth.set_network("10.64.123.43","255.255.252.0","10.64.123.254");
TomTom83 1:390d9808cdde 96 eth.connect();
TomTom83 1:390d9808cdde 97 printf("IP address is '%s'\n", eth.get_ip_address());
TomTom83 1:390d9808cdde 98 printf("MAC address is '%s'\n", eth.get_mac_address());
TomTom83 1:390d9808cdde 99 flipper.attach(&flip1, 0.5);
TomTom83 1:390d9808cdde 100
TomTom83 1:390d9808cdde 101 while( timer<3 )
TomTom83 1:390d9808cdde 102 {
TomTom83 1:390d9808cdde 103 while(RS485.readable())
TomTom83 1:390d9808cdde 104 {
TomTom83 1:390d9808cdde 105 buffer[i++]=RS485.getc();
TomTom83 1:390d9808cdde 106 }
TomTom83 1:390d9808cdde 107 if(i>=7)
TomTom83 1:390d9808cdde 108 {
TomTom83 1:390d9808cdde 109 i=0;
TomTom83 1:390d9808cdde 110 buffer[7]='\0';
TomTom83 1:390d9808cdde 111 le_pc.printf("%s",buffer);
TomTom83 1:390d9808cdde 112 }
TomTom83 1:390d9808cdde 113 }
TomTom83 1:390d9808cdde 114 flipper.detach();
TomTom83 1:390d9808cdde 115
TomTom83 1:390d9808cdde 116 new_adr[1]=buffer[1];
TomTom83 1:390d9808cdde 117 new_adr[2]=buffer[2];
TomTom83 1:390d9808cdde 118 new_adr[3]=buffer[3];
TomTom83 1:390d9808cdde 119 timer=0;
TomTom83 1:390d9808cdde 120
TomTom83 1:390d9808cdde 121 flipper.attach(&flip2, 0.5);
TomTom83 1:390d9808cdde 122
TomTom83 1:390d9808cdde 123 while( timer<3 )
TomTom83 1:390d9808cdde 124 {
TomTom83 1:390d9808cdde 125 while(RS485.readable())
TomTom83 1:390d9808cdde 126 {
TomTom83 1:390d9808cdde 127 buffer[i++]=RS485.getc();
TomTom83 1:390d9808cdde 128 }
TomTom83 1:390d9808cdde 129 if(i>=7)
TomTom83 1:390d9808cdde 130 {
TomTom83 1:390d9808cdde 131 i=0;
TomTom83 1:390d9808cdde 132 buffer[7]='\0';
TomTom83 1:390d9808cdde 133 le_pc.printf("%s",buffer);
TomTom83 1:390d9808cdde 134 }
TomTom83 1:390d9808cdde 135 }
TomTom83 1:390d9808cdde 136 flipper.detach();
TomTom83 1:390d9808cdde 137
TomTom83 1:390d9808cdde 138 i=0;
TomTom83 1:390d9808cdde 139
TomTom83 1:390d9808cdde 140 /* inicializacion del Stack de Modbus */
TomTom83 1:390d9808cdde 141 eMBTCPInit(502);
TomTom83 1:390d9808cdde 142
cam 0:0453a0a7e500 143 /* Enable the Modbus Protocol Stack. */
cam 0:0453a0a7e500 144 eStatus = eMBEnable( );
TomTom83 1:390d9808cdde 145 myled2=1;
cam 0:0453a0a7e500 146
TomTom83 1:390d9808cdde 147 flipper.attach(&flip3, 2.0);
TomTom83 1:390d9808cdde 148
TomTom83 1:390d9808cdde 149 myled=1;
TomTom83 1:390d9808cdde 150
TomTom83 1:390d9808cdde 151 while(1)
cam 0:0453a0a7e500 152 {
TomTom83 1:390d9808cdde 153 while(RS485.readable())
TomTom83 1:390d9808cdde 154 {
TomTom83 1:390d9808cdde 155 buffer[i++]=RS485.getc();
TomTom83 1:390d9808cdde 156 }
TomTom83 1:390d9808cdde 157 if(i>=56)
TomTom83 1:390d9808cdde 158 {
TomTom83 1:390d9808cdde 159 i=0;
TomTom83 1:390d9808cdde 160 if( buffer[54]>=48 && buffer[54]<=58) buffer[55]='\0';
TomTom83 1:390d9808cdde 161 else if( buffer[53]>=48 && buffer[53]<=58 )buffer[54]='\0';
TomTom83 1:390d9808cdde 162 else buffer[53]='\0';
TomTom83 1:390d9808cdde 163 le_pc.printf("%s",buffer);
TomTom83 1:390d9808cdde 164
TomTom83 1:390d9808cdde 165 //Adresse Pompe
TomTom83 1:390d9808cdde 166 usRegInputBuf[1] = (buffer[1]-48)*100 + (buffer[2]-48)*10 + (buffer[3]-48);
TomTom83 1:390d9808cdde 167
TomTom83 1:390d9808cdde 168 //Infos diverses
TomTom83 1:390d9808cdde 169 usRegInputBuf[2] = buffer[7]-48; // 1 -> Pompe en marche / 0 -> Arretee
TomTom83 1:390d9808cdde 170 usRegInputBuf[3] = buffer[8]-48; // 1 -> Vitesse Standby / 0 -> Vitesse nominale
TomTom83 1:390d9808cdde 171 usRegInputBuf[4] = buffer[9]-48; // 1 -> Mode Standby / 0 -> Autre
TomTom83 1:390d9808cdde 172
TomTom83 1:390d9808cdde 173 usRegInputBuf[5] = buffer[12]-48; // 1 -> Transistor de puissance non commandes / 0 ->sinon
TomTom83 1:390d9808cdde 174 usRegInputBuf[6] = buffer[13]-48; // 1 -> Temperature moteur elevee
TomTom83 1:390d9808cdde 175 usRegInputBuf[7] = buffer[14]-48; // 1 -> Courant moteur important
TomTom83 1:390d9808cdde 176
TomTom83 1:390d9808cdde 177 //Vitesse en tr/min en consigne
TomTom83 1:390d9808cdde 178 var = (buffer[26]-48)*10000 + (buffer[27]-48)*1000 + (buffer[28]-48)*100 + (buffer[29]-48)*10 + (buffer[30]-48) ;
TomTom83 1:390d9808cdde 179 var_bon = var>>16;
TomTom83 1:390d9808cdde 180 usRegInputBuf[8] = var_bon;
TomTom83 1:390d9808cdde 181 usRegInputBuf[9] = (unsigned short) var;
TomTom83 1:390d9808cdde 182
TomTom83 1:390d9808cdde 183 //Puissance Pompe
TomTom83 1:390d9808cdde 184 usRegInputBuf[10] = (buffer[32]-48)*1000 + (buffer[33]-48)*100 + (buffer[34]-48)*10 + (buffer[35]-48) ;
TomTom83 1:390d9808cdde 185
TomTom83 1:390d9808cdde 186 //Temperature Pompe
TomTom83 1:390d9808cdde 187 usRegInputBuf[11] = (buffer[41]-48)*100 + (buffer[42]-48)*10 + buffer[43]-48 ;
TomTom83 1:390d9808cdde 188
TomTom83 1:390d9808cdde 189 //Temps de fonctionnement Pompe
TomTom83 1:390d9808cdde 190 if( buffer[53]=='\0')
TomTom83 1:390d9808cdde 191 {
TomTom83 1:390d9808cdde 192 usRegInputBuf[12] = 0;
TomTom83 1:390d9808cdde 193 usRegInputBuf[13] = (buffer[49]-48)*1000 + (buffer[50]-48)*100 + (buffer[51]-48)*10 + buffer[52]-48 ;;
TomTom83 1:390d9808cdde 194 }
TomTom83 1:390d9808cdde 195 else if( buffer[54]=='\0' ){
TomTom83 1:390d9808cdde 196 var = (buffer[49]-48)*10000 + (buffer[50]-48)*1000 + (buffer[51]-48)*100 + (buffer[52]-48)*10 + (buffer[53]-48);
TomTom83 1:390d9808cdde 197 var_bon = var>>16;
TomTom83 1:390d9808cdde 198 usRegInputBuf[12] = var_bon;
TomTom83 1:390d9808cdde 199 usRegInputBuf[13] = (unsigned short) var;
TomTom83 1:390d9808cdde 200 }
TomTom83 1:390d9808cdde 201 else{
TomTom83 1:390d9808cdde 202 var = (buffer[49]-48)*100000 + (buffer[50]-48)*10000 + (buffer[51]-48)*1000 + (buffer[52]-48)*100 + (buffer[53]-48)*10 + (buffer[54]-48)*1;
TomTom83 1:390d9808cdde 203 var_bon = var>>16;
TomTom83 1:390d9808cdde 204 usRegInputBuf[12] = var_bon;
TomTom83 1:390d9808cdde 205 usRegInputBuf[13] = (unsigned short) var;
TomTom83 1:390d9808cdde 206 }
TomTom83 1:390d9808cdde 207 }
TomTom83 1:390d9808cdde 208
TomTom83 1:390d9808cdde 209 /* Here we simply count the number of poll cycles. */
cam 0:0453a0a7e500 210 ( void )eMBPoll( );
TomTom83 1:390d9808cdde 211 //usRegInputBuf[0]++;
cam 0:0453a0a7e500 212 }
cam 0:0453a0a7e500 213 }
cam 0:0453a0a7e500 214
cam 0:0453a0a7e500 215 eMBErrorCode
cam 0:0453a0a7e500 216 eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
cam 0:0453a0a7e500 217 {
cam 0:0453a0a7e500 218 eMBErrorCode eStatus = MB_ENOERR;
cam 0:0453a0a7e500 219 int iRegIndex;
cam 0:0453a0a7e500 220
cam 0:0453a0a7e500 221 if( ( usAddress >= REG_INPUT_START )
cam 0:0453a0a7e500 222 && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
cam 0:0453a0a7e500 223 {
cam 0:0453a0a7e500 224 iRegIndex = ( int )( usAddress - usRegInputStart );
cam 0:0453a0a7e500 225 while( usNRegs > 0 )
cam 0:0453a0a7e500 226 {
cam 0:0453a0a7e500 227 *pucRegBuffer++ =
cam 0:0453a0a7e500 228 ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
cam 0:0453a0a7e500 229 *pucRegBuffer++ =
cam 0:0453a0a7e500 230 ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
cam 0:0453a0a7e500 231 iRegIndex++;
cam 0:0453a0a7e500 232 usNRegs--;
cam 0:0453a0a7e500 233 }
cam 0:0453a0a7e500 234 }
cam 0:0453a0a7e500 235 else
cam 0:0453a0a7e500 236 {
cam 0:0453a0a7e500 237 eStatus = MB_ENOREG;
cam 0:0453a0a7e500 238 }
cam 0:0453a0a7e500 239
cam 0:0453a0a7e500 240 return eStatus;
cam 0:0453a0a7e500 241 }
cam 0:0453a0a7e500 242
cam 0:0453a0a7e500 243 eMBErrorCode
cam 0:0453a0a7e500 244 eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
cam 0:0453a0a7e500 245 {
cam 0:0453a0a7e500 246 eMBErrorCode eStatus = MB_ENOERR;
cam 0:0453a0a7e500 247 int iRegIndex;
cam 0:0453a0a7e500 248
cam 0:0453a0a7e500 249 if (eMode == MB_REG_READ)
cam 0:0453a0a7e500 250 {
cam 0:0453a0a7e500 251 if( ( usAddress >= REG_INPUT_START )
cam 0:0453a0a7e500 252 && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
cam 0:0453a0a7e500 253 {
cam 0:0453a0a7e500 254 iRegIndex = ( int )( usAddress - usRegInputStart );
cam 0:0453a0a7e500 255 while( usNRegs > 0 )
cam 0:0453a0a7e500 256 {
cam 0:0453a0a7e500 257 *pucRegBuffer++ =
cam 0:0453a0a7e500 258 ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
cam 0:0453a0a7e500 259 *pucRegBuffer++ =
cam 0:0453a0a7e500 260 ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
cam 0:0453a0a7e500 261 iRegIndex++;
cam 0:0453a0a7e500 262 usNRegs--;
cam 0:0453a0a7e500 263 }
cam 0:0453a0a7e500 264 }
cam 0:0453a0a7e500 265 }
cam 0:0453a0a7e500 266
cam 0:0453a0a7e500 267 if (eMode == MB_REG_WRITE)
cam 0:0453a0a7e500 268 {
cam 0:0453a0a7e500 269 if( ( usAddress >= REG_INPUT_START )
cam 0:0453a0a7e500 270 && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
cam 0:0453a0a7e500 271 {
cam 0:0453a0a7e500 272 iRegIndex = ( int )( usAddress - usRegInputStart );
cam 0:0453a0a7e500 273 while( usNRegs > 0 )
cam 0:0453a0a7e500 274 {
cam 0:0453a0a7e500 275 usRegInputBuf[iRegIndex] = ((unsigned int) *pucRegBuffer << 8) | ((unsigned int) *(pucRegBuffer+1));
cam 0:0453a0a7e500 276 pucRegBuffer+=2;
cam 0:0453a0a7e500 277 iRegIndex++;
cam 0:0453a0a7e500 278 usNRegs--;
cam 0:0453a0a7e500 279 }
cam 0:0453a0a7e500 280 }
cam 0:0453a0a7e500 281 }
cam 0:0453a0a7e500 282
cam 0:0453a0a7e500 283 return eStatus;
cam 0:0453a0a7e500 284 }
cam 0:0453a0a7e500 285
cam 0:0453a0a7e500 286
cam 0:0453a0a7e500 287 eMBErrorCode
cam 0:0453a0a7e500 288 eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
cam 0:0453a0a7e500 289 eMBRegisterMode eMode )
cam 0:0453a0a7e500 290 {
cam 0:0453a0a7e500 291 return MB_ENOREG;
cam 0:0453a0a7e500 292 }
cam 0:0453a0a7e500 293
cam 0:0453a0a7e500 294 eMBErrorCode
cam 0:0453a0a7e500 295 eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
cam 0:0453a0a7e500 296 {
cam 0:0453a0a7e500 297 return MB_ENOREG;
cam 0:0453a0a7e500 298 }
cam 0:0453a0a7e500 299