2016-05-11 554 views
1

我正嘗試使用以下代碼在arduino uno + ethernet shield上實現Modbus TCP。 我在PC上使用modbus slave模擬器來檢查下面的代碼。但是,代碼似乎沒有工作。我已經從http://myarduinoprojects.com/modbus.html下載了代碼&庫。如有必要,請建議我更正。還有另一個可用於Arduino上的modbus tcp/ip的工作示例。Arduino上的Modbus TCP/IP

謝謝。

#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

「但是,代碼似乎沒有工作」。以什麼方式? –

+0

當我將它連接到PC並運行模擬器時,串行端口上看不到任何通信。 @ ghaham.reeds – hs7624

+0

好的。你用什麼來檢查沒有溝通?你的程序沒有檢測到的事實,或者你正在使用類似hyperterminal/serialmon的東西來聽嗎? –

回答

1

串行監視器工作正常。繼線印在第一調試程序

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

但似乎這@ graham.reeds

0

我使用mgsmodbus後的TCP通信不起作用,因爲沒有什麼串口監視器上在辦公室我的modbuswork。我擁有的是一個主TI板和一個從模擬器。但是我使用Wifi.h而不是ethernet.h。我能夠做所有的操作。

您是否檢查以太網連接是否正確建立?

如果是這樣,請嘗試IBH Modbus slave模擬器。這是完美的。您將不得不將設置更改爲TCP並選擇端口。有時您嘗試的端口號可能是錯誤的。我使用默認端口502。

另外,請確保.cpp代碼中的從IP也已更改。