Tom Martins / Mbed OS Nucleo_RS485_Modbus

Fork of Modbus by Cam Marshall

Revision:
1:390d9808cdde
Parent:
0:0453a0a7e500
Child:
2:b6ae32d99b4a
--- a/main.cpp	Thu Apr 15 12:10:34 2010 +0000
+++ b/main.cpp	Fri Jul 06 10:50:10 2018 +0000
@@ -22,40 +22,193 @@
 /* ----------------------- System includes --------------------------------*/
 
 /* ----------------------- Modbus includes ----------------------------------*/
+#include "mbed.h"
+#include "EthernetInterface.h"
 #include "mb.h"
 #include "mbport.h"
 
 /* ----------------------- Defines ------------------------------------------*/
-#define REG_INPUT_START 1000
-#define REG_INPUT_NREGS 4
-#define SLAVE_ID 0x0A
+#define REG_INPUT_START 0
+#define REG_INPUT_NREGS 20
+#define SLAVE_ID 0x00
 
 /* ----------------------- Static variables ---------------------------------*/
 static USHORT   usRegInputStart = REG_INPUT_START;
 static USHORT   usRegInputBuf[REG_INPUT_NREGS];
 
 /* ----------------------- Start implementation -----------------------------*/
+
+Ticker flipper; 
+Serial le_pc(SERIAL_TX, SERIAL_RX);
+Serial RS485(D1, D0);
+DigitalIn mybutton(USER_BUTTON);
+DigitalOut myled(LED1);
+DigitalOut myled2(LED2);
+DigitalOut myled3(LED3);
+
+int i=0;
+int timer=0;
+char new_adr[13]="#adrADR000\r";
+
+void flip1()
+{
+    le_pc.printf("\n\ri=%i\n\r",i);
+    RS485.puts("#???ADR\r");
+    le_pc.puts("#???ADR\r");
+    if(i!=0) i=0;
+    timer++;
+    myled3=!myled3;
+}
+
+void flip2()
+{
+    le_pc.printf("\n\ri=%i\n\r",i);
+    RS485.printf("%s",&new_adr[0]);
+    le_pc.printf("%s",&new_adr[0]);
+    if(i!=0) i=0;
+    timer++;
+    myled=!myled;
+}
+ 
+void flip3()
+{
+    RS485.puts("#000STA\r"); 
+    le_pc.printf("i=%i\n\r",i);
+    if(i!=0) i=0;
+    myled2=!myled2;
+}  
+
+
 int
 main( void )
 {
-    eMBErrorCode    eStatus;
-
-    eStatus = eMBInit( MB_RTU, SLAVE_ID, 0, 9600, MB_PAR_NONE );
-
+    uint32_t var;
+    unsigned short var_bon;
+    
+    char buffer[150];
+    RS485.baud(9600);
+    RS485.format(8,SerialBase::None,1);
+    printf("START OF THE TESTS\n");
+    eMBErrorCode    eStatus; 
+    EthernetInterface eth;
+    //eth.set_network("169.254.178.1","255.255.0.0","169.254.178.3");
+    eth.set_network("10.64.123.43","255.255.252.0","10.64.123.254");
+    eth.connect();
+    printf("IP address is '%s'\n", eth.get_ip_address());
+    printf("MAC address is '%s'\n", eth.get_mac_address());
+    flipper.attach(&flip1, 0.5);
+    
+    while( timer<3 )
+    {
+        while(RS485.readable())
+        {
+            buffer[i++]=RS485.getc();
+        }
+        if(i>=7)
+        {
+            i=0;
+            buffer[7]='\0';
+            le_pc.printf("%s",buffer);
+        }
+    }
+    flipper.detach();
+    
+    new_adr[1]=buffer[1];
+    new_adr[2]=buffer[2];
+    new_adr[3]=buffer[3];
+    timer=0;
+    
+    flipper.attach(&flip2, 0.5);
+    
+    while( timer<3 )
+    {
+        while(RS485.readable())
+        {
+            buffer[i++]=RS485.getc();
+        }
+        if(i>=7)
+        {
+            i=0;
+            buffer[7]='\0';
+            le_pc.printf("%s",buffer);
+        }
+    }
+    flipper.detach();
+    
+    i=0;   
+    
+    /* inicializacion del Stack de Modbus */
+    eMBTCPInit(502);
+    
     /* Enable the Modbus Protocol Stack. */
     eStatus = eMBEnable(  );
-    
-    // Initialise some registers
-    usRegInputBuf[1] = 0x1234;
-    usRegInputBuf[2] = 0x5678;
-    usRegInputBuf[3] = 0x9abc;        
+    myled2=1;      
 
-    for( ;; )
+    flipper.attach(&flip3, 2.0);
+    
+    myled=1;
+    
+    while(1)
     {
+        while(RS485.readable())
+        {
+            buffer[i++]=RS485.getc();
+        }
+        if(i>=56)
+        {
+            i=0;
+            if( buffer[54]>=48 && buffer[54]<=58) buffer[55]='\0';
+            else if( buffer[53]>=48 && buffer[53]<=58 )buffer[54]='\0';
+            else buffer[53]='\0';
+            le_pc.printf("%s",buffer);
+            
+            //Adresse Pompe
+            usRegInputBuf[1] = (buffer[1]-48)*100 + (buffer[2]-48)*10 + (buffer[3]-48);
+            
+            //Infos diverses
+            usRegInputBuf[2] = buffer[7]-48; // 1 -> Pompe en marche / 0 -> Arretee
+            usRegInputBuf[3] = buffer[8]-48; // 1 -> Vitesse Standby / 0 -> Vitesse nominale
+            usRegInputBuf[4] = buffer[9]-48; // 1 -> Mode Standby / 0 -> Autre
+            
+            usRegInputBuf[5] = buffer[12]-48; // 1 -> Transistor de puissance non commandes / 0 ->sinon
+            usRegInputBuf[6] = buffer[13]-48; // 1 -> Temperature moteur elevee
+            usRegInputBuf[7] = buffer[14]-48; // 1 -> Courant moteur important
+            
+            //Vitesse en tr/min en consigne
+            var = (buffer[26]-48)*10000 + (buffer[27]-48)*1000 + (buffer[28]-48)*100 + (buffer[29]-48)*10 + (buffer[30]-48) ;
+            var_bon = var>>16;
+            usRegInputBuf[8] = var_bon;
+            usRegInputBuf[9] = (unsigned short) var;
+            
+            //Puissance Pompe
+            usRegInputBuf[10] = (buffer[32]-48)*1000 + (buffer[33]-48)*100 + (buffer[34]-48)*10 + (buffer[35]-48) ;
+            
+            //Temperature Pompe
+            usRegInputBuf[11] = (buffer[41]-48)*100 + (buffer[42]-48)*10 + buffer[43]-48 ;
+            
+            //Temps de fonctionnement Pompe
+            if( buffer[53]=='\0')
+            {
+                usRegInputBuf[12] = 0;
+                usRegInputBuf[13] = (buffer[49]-48)*1000 + (buffer[50]-48)*100 + (buffer[51]-48)*10 + buffer[52]-48 ;;    
+            }
+            else if( buffer[54]=='\0' ){
+                var = (buffer[49]-48)*10000 + (buffer[50]-48)*1000 + (buffer[51]-48)*100 + (buffer[52]-48)*10 + (buffer[53]-48);
+                var_bon = var>>16;
+                usRegInputBuf[12] = var_bon;
+                usRegInputBuf[13] = (unsigned short) var;
+            }
+            else{
+                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;
+                var_bon = var>>16;
+                usRegInputBuf[12] = var_bon;
+                usRegInputBuf[13] = (unsigned short) var;
+            }
+        }
+        
+        /* Here we simply count the number of poll cycles. */
         ( void )eMBPoll(  );
-                
-        /* Here we simply count the number of poll cycles. */
-        usRegInputBuf[0]++;
+        //usRegInputBuf[0]++;
     }
 }