Arduino en Modbus TCP/Ip

Ook omdat we weinig werk hebben, en ik me zit te vervelen, ben ik bezig met een arduino, Plc en HMI...

Al eerder had ik een Modbus tcp/ip slave gemaak, met daarop een DS18B20..
en het voor elkaar gekregen de temeratuur in mij PLC in te lezen... en zichtbaar te maken op het HMI...

maar nu wilde ik eigelijk een soort van logger maken...

Dus ik heb een demo op de plc-hmi... dus een paar tellers in de plc..die ik op het scherm laat zien...

Nu wil ik eigelijk met de arduino op het zelfde ethernet werk die zelfde variable naar binnen halen...

maar wil nog niet erg lukken... :-)

Ik neem aan dat me arduino dan Master moet zijn?

IK denk wel dat het moet kunnen , want ik heb gekeken met ModbusScan64 en dan kan ik de zelfde variabelen bekijken... en zien veranderen...

nu heb ik het onderstaande in de arduino..

PLC/HMI draait.... In de PLC heb ik ook een soort van PING functie, bij de ethernet connection, en daar kan ik ook de arduino pingen... dus alles hangt aan elkaar...

Ik schrijf contineu een teller op 400001...

maar als ik via de serialmonitor in de arduino kijk komt er niets binnen?

ook begrijp ik die 6,6,6 niet?

is er misschien iemand die hier meer ervaring in heeft?

Alvast bedankt!

avr asm code:

#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[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB5 };
IPAddress ip(192, 168, 3, 242);
IPAddress gateway(192, 168, 3, 100);
IPAddress subnet(255, 255, 255, 0);


void setup()
{

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

  // initialize the ethernet device
  Ethernet.begin(mac, ip, gateway, subnet);   // 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 = IPAddress(192, 168, 3, 233);


  // Fill MbData
  //  Mb.SetBit(0,false);
  Mb.MbData[0] = 0;
  Mb.MbData[1] = 0;
  Mb.MbData[2] = 0;
  Mb.MbData[3] = 0;
  Mb.MbData[4] = 0;
  Mb.MbData[5] = 0;
  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.Req(MB_FC_READ_REGISTERS,           6, 6, 6);
  //Mb.Req(MB_FC_READ_INPUT_REGISTER,      6, 6, 6);

  
  Mb.MbmRun();
  //  Mb.MbsRun();
}
cnc filmpjes op Http://www.arjan-swets.com

Als je PLC modbus slave is (server), dan moet je inderdaad een modbus TCP master in je arduino gebruiken.

Waarom gebruik je niet de standaard modbus library van arduino?
Voorbeelden genoeg & documentatie voorhanden:
https://www.arduino.cc/en/ArduinoModbus/ArduinoModbus

Op 26 augustus 2020 20:56:10 schreef coldrestart:
Als je PLC modbus slave is (server), dan moet je inderdaad een modbus TCP master in je arduino gebruiken.

Waarom gebruik je niet de standaard modbus library van arduino?
Voorbeelden genoeg & documentatie voorhanden:
https://www.arduino.cc/en/ArduinoModbus/ArduinoModbus

tja waarom.... ik heb gewoon wat van internet afgehaald....
maar ik ga jouw link ook even bekijken....

Bedankt!

cnc filmpjes op Http://www.arjan-swets.com

laat ik het dan anders vragen.... want ik vind zoveel.... dat ik een beetje door de bomen het bos niet meer zie...

Ik heb een Arduino Mega, en een W5100 ethernet module...

Dan heb ik een schneider PLC M340... met daar aan een HMI

in die plc heb ik een demo-programmaatje gezet, welke een teller ophoog...
en dat tellertje laat ik zien op mijn HMI...

Nu wil ik aan dat zelfde Ethernetwerk de arduino hangen, en laten kijken naar die zelfde teller waarde....

maar het wil nog niet helemaal lukken allemaal....

cnc filmpjes op Http://www.arjan-swets.com