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();
}