Moin
ich versuche seit Tagen erfolglos mit dem Arduino Nano und einem ENC28J60 Ethernet Shield als Client/Master, Register vom Server/Slave abzufragen.
Als Grundlage dient die UIPEthernet.h Bibliothek.
Das Beispiel Simple_Ethernet_Test.ino funktioniert, die Hardware läuft also.
Ich hab mir aus diesem Beispiel ein minimal Test zusammen geschustert.
Laut Wireshark geht die Anfrage raus und eine Antwort vom Slave wird auch gesendet.
Nur der Nano bekommt's nicht mit und ich weiss nich warum.
Ich würde micht über einen Schubser in die richtige Richung sehr freuen.
Gruß
Robert
Ach ja ...
hier der Sketch:
// minimal Test Arduino Nano + Nano Ethernet Shield V1.0 mit ENC28J60
// Modbus TCP/IP Master lese HReg 520 von Modbus TCP/IP Slave
#include <UIPEthernet.h>
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };
IPAddress mbMaster(192, 168, 0, 89); //Arduino Nano + ENC28J60 Master
IPAddress mbSlave(192,168,0, 10); //Modbus Slave
EthernetClient client;
void setup() {
Serial.begin(115200);
delay(500);
Serial.print("Sketch=");
Serial.println(__FILE__);
Serial.println("Los geht's...");
Ethernet.begin(mac, mbMaster);
Serial.print("mbMaster Address: ");
Serial.println(Ethernet.localIP());
}
void loop() {
size_t size;
int nTransactionID,nProtocolID,nLengthOfNext,nL;
if (client.connect(mbSlave,502)) {
Serial.println("client.connect");
String szStr = "000000000006010302080001"; // ByteLenght=06; uID=01; FC=03 (Read HReg); Address=520 (0x0208); n Address=01 (0x0001)
nL = szStr.length() / 2;
uint8_t* msg = (uint8_t*)malloc(nL*sizeof(uint8_t));
msg = uiHex(msg,szStr);
client.write(msg,nL);
free(msg);
while((size = client.available()) > 0) {
Serial.println("client.available");
uint8_t* msg = (uint8_t*)malloc(size);
size = client.read(msg,size);
for(uint8_t i=0 ; i < size ; i++) {
Serial.print("msg");
Serial.println(msg[i],HEX);
vHex2n(msg[i]);
}
free(msg);
}
//client.stop();
Serial.println("client not available");
}
delay(1000);
}
void vHex2n(char X) {
if (X < 16) {Serial.print("0");}
Serial.print(X, HEX);
}
unsigned int uiHexToInt(String hex) {
int intValue = (int)strtol(&(hex[0]), NULL, 16);
return intValue;
}
uint8_t* uiHex(uint8_t* m,String str) {
int nStr = str.length();
String strAux;
char sz[3];
for(int i = 0; i < nStr; i += 2 ) {
sz[0] = str.charAt(i);
sz[1] = str.charAt(i+1);
sz[2] = 0;
m[i/2] = uiHexToInt(sz);
//Serial.println(m[i/2],HEX);
}
return m;
}
