2016-05-11 11 views
1

Ich versuche, Modbus TCP auf arduino uno + ethernet shield mit dem folgenden Code zu implementieren. Ich benutze einen Modbus-Slave-Simulator auf einem PC, um den folgenden Code zu überprüfen. Der Code scheint jedoch nicht zu funktionieren. Ich habe den Code & die Bibliotheken von http://myarduinoprojects.com/modbus.html heruntergeladen. Bitte schlagen Sie mir Korrekturen vor, falls nötig. Auch gibt es ein anderes funktionierendes Beispiel für Modbus tcp/ip auf Arduino.Modbus TCP/IP auf Arduino

Danke.

#include <SPI.h> 
#include <Ethernet.h> 
#include "MgsModbus.h" 

MgsModbus Mb; 
int inByte = 0; // incoming serial byte 

// Ethernet settings (depending on MAC and Local network) 
byte mac[] = {0x00, 0x1A, 0xB6, 0x02, 0xD1, 0x14 }; 
IPAddress ip(192, 168, 0, 35); 



void setup() 
{ 

    // serial setup 
    Serial.begin(9600); 
    Serial.println("Serial interface started"); 

    // initialize the ethernet device 
    Ethernet.begin(mac, ip); // start etehrnet interface 
    Serial.println("Ethernet interface started"); 

    // print your local IP address: 
    Serial.print("My IP address: "); 
    for (byte thisByte = 0; thisByte < 4; thisByte++) { 
    // print the value of each byte of the IP address: 
    Serial.print(Ethernet.localIP()[thisByte], DEC); 
    Serial.print("."); 
    } 
    Serial.println(); 

    // slave address 
    Mb.remSlaveIP = (192,168,0,1); 

    // Fill MbData 
// Mb.SetBit(0,false); 
    Mb.MbData[0] = 1; 
    Mb.MbData[1] = 2; 
    Mb.MbData[2] = 3; 
    Mb.MbData[3] = 4; 
    Mb.MbData[4] = 5; 
    Mb.MbData[5] = 6; 
    Mb.MbData[6] = 0; 
    Mb.MbData[7] = 0; 
    Mb.MbData[8] = 0; 
    Mb.MbData[9] = 0; 
    Mb.MbData[10] = 0; 
    Mb.MbData[11] = 0; 

    // print MbData 
    for (int i=0;i<12;i++) { 
    Serial.print("address: "); Serial.print(i); Serial.print("Data: "); Serial.println(Mb.MbData[i]); 
    } 
    // print menu 
    Serial.println("0 - print the first 12 words of the MbData space"); 
    Serial.println("1 - FC 1 - read the first 5 coils from the slave and store them in the lower byte of MbData[1]"); 
    Serial.println("2 - FC 2 - read the first 5 discrete inputs from the slave and store them in the higer of the MbData[1]"); 
    Serial.println("3 - FC 3 - read the first 5 registers from the slave and store them in MbData[3..7"); 
    Serial.println("4 - FC 4 - read the first 5 input registers from the slave and store them in MbData[8..12]"); 
    Serial.println("5 - FC 5 - write coil 0 of the slave with the bit valeu of MbData[0.0]"); 
    Serial.println("6 - FC 6 - write register 0 of the slave with MbData[2]"); 
    Serial.println("7 - FC 15 - write 5 coils of the slave starting with coil 0 with GetBit(16..20"); 
    Serial.println("8 - Fc 16 - write 5 registers of the slave starting on register 0 with MbData[0..4]"); 

    Serial.println(Mb.remSlaveIP); 
} 

void loop() 
{ 
    if (Serial.available() > 0) { 
    // get incoming byte: 
    inByte = Serial.read(); 
    if (inByte == '0') {           // print MbData 
     for (int i=0;i<12;i++) { 
     Serial.print("address: "); Serial.print(i); Serial.print("Data: "); Serial.println(Mb.MbData[i]); 
     } 
    } 
    if (inByte == '1') {Mb.Req(MB_FC_READ_COILS,    6,6,6);} // 1 // ref, count, pos 
    if (inByte == '2') {Mb.Req(MB_FC_READ_DISCRETE_INPUT,  6,6,6);} // 2 
    if (inByte == '3') {Mb.Req(MB_FC_READ_REGISTERS,   6,6,6);} // 3 
    if (inByte == '4') {Mb.Req(MB_FC_READ_INPUT_REGISTER,  6,6,6);} // 4 
    if (inByte == '5') {Mb.Req(MB_FC_WRITE_COIL,    0,0,0);} // 5 // count can be x 
    if (inByte == '6') {Mb.Req(MB_FC_WRITE_REGISTER,   7,0,0);} // 6 // count can be x 
    if (inByte == '7') {Mb.Req(MB_FC_WRITE_MULTIPLE_COILS,  0,6,0);} // 15 
    if (inByte == '8') {Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 0,6,0);} // 16 
    } 

    Mb.MbmRun(); 
// Mb.MbsRun(); 
} 
+0

"Der Code scheint jedoch nicht zu funktionieren". Inwiefern? –

+0

Wenn ich es an den PC anschließe und den Simulator starte, wird auf dem seriellen Port keine Kommunikation angezeigt. @ ghaham.reeds – hs7624

+0

Okay. Was hast du benutzt, um zu überprüfen, dass keine Kommunikation stattfindet? Die Tatsache, dass Ihr Programm keine erkennt oder verwenden Sie etwas wie hyperterminal/serialmon zu hören? –

Antwort

1

Serieller Monitor funktioniert einwandfrei. Folgende Zeilen werden auf der ersten gedruckten Testen des Programms

Serial interface started Ethernet interface started My IP address: 192.168.0.35. address: 0Data: 1 address: 1Data: 2 address: 2Data: 3 address: 3Data: 4 address: 4Data: 5 address: 5Data: 6 address: 6Data: 0 address: 7Data: 0 address: 8Data: 0 address: 9Data: 0 address: 10Data: 0 address: 11Data: 0 0 - print the first 12 words of the MbData space 1 - FC 1 - read the first 5 coils from the slave and store them in the lower byte of MbData[1] 2 - FC 2 - read the first 5 discrete inputs from the slave and store them in the higer of the MbData[1] 3 - FC 3 - read the first 5 registers from the slave and store them in MbData[3..7 4 - FC 4 - read the first 5 input registers from the slave and store them in MbData[8..12] 5 - FC 5 - write coil 0 of the slave with the bit valeu of MbData[0.0] 6 - FC 6 - write register 0 of the slave with MbData[2] 7 - FC 15 - write 5 coils of the slave starting with coil 0 with GetBit(16..20 8 - Fc 16 - write 5 registers of the slave starting on register 0 with MbData[0..4] 1.0.0.0

aber es scheint, dass die TCP-Kommunikation funktioniert nicht, da nichts auf dem seriellen Monitor ist danach @

0

graham.reeds Ich bin mit mgsmodbus für meine Modbusarbeit im Büro. Was ich habe, ist ein Master-TI-Board und ein Slave-Simulator. Allerdings verwende ich Wifi.h anstelle von ethernet.h. Ich kann alle Operationen ausführen.

Haben Sie überprüft, ob die Ethernet-Verbindung ordnungsgemäß hergestellt wurde?

Wenn ja IBH Modbus Slave-Simulator versuchen. Das funktioniert perfekt. Sie müssten die Einstellung in TCP ändern und den Port auswählen. Manchmal könnte die Portnummer falsch sein. Ich benutze den Port 502, der der Standard ist.

Stellen Sie außerdem sicher, dass die Slave-IP im CPP-Code ebenfalls geändert wird.