Zugriff von java auf Struktur per ADS

henne1978

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich setze mich gerade mit der Kommunikation per ADS auseinander und bin auf folgendes Problem gestoßen.
Ich kann nicht auf Variablen die in einer selbsterstellten Struktur abgelegt sind zugreifen. Der Zugriff auf "normale" (globale)Variablen klappt problemlos.
Das Array das mit meinen Strukturen gefüllt ist ist als globale Variable deklariert.

Hier die Struktur:
TYPE modul :
STRUCT
Bezeichnung : ARRAY[1..3] OF BOOL;
Identifier : ARRAY[1..5] OF BOOL;
Modul_Nr : INT;
ID_BYTE: BYTE;
(*Transfer, Bypass, ect*)
Bez_String: STRING;
END_STRUCT
END_TYPE

und das globale Array:

Modulliste : ARRAY[0..21] OF modul;

die Software aus der der Zugriff erfolgt ist in Java geschrieben.

Hat jemand einen Hinweis oder Idee?

Viele Grüße
 
Wo hackt's denn? Klappt das lesen in das JNIByteBuffer schon nicht? Gibt adsSyncReadReq eine Fehlernummer aus?

Gruß,
witkatz
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
schön dass jemand sich zu diesen Problem gemeldet hat.
Der Zugriff per adsSyncReq(addr,0x4040,0x0,200,databuff) funktionert. Jedoch benutze ich die Werte für den Speicherzugriff des Arrays aus dem Beispiel von Beckhoff.
Ich weiß nicht, ob ich mit 0x4040 auf das richtige Array zugreife?
Leider wirft mir mein Programm eine Fehlermeldung wenn ich per Symbolname auf das Array zugreifen möchte. Bei jeder anderen beliebigen globalen Variable kann ich einen Zugriff ermöglichen.

Zudem ist unser Array eine Struktur nach dem Schema unten:

TYPE modul :
STRUCT
Bezeichnung : ARRAY[1..3] OF BOOL;
Identifier : ARRAY[1..5] OF BOOL;
Modul_Nr : INT;
ID_BYTE: BYTE;
(*Transfer, Bypass, ect*)
Bez_String: STRING;
END_STRUCT
END_TYPE

Das heißt ich muss auch hier wieder Arrays herauslesen können.
Ich denke es ist ein Problem, dass ich ein String Typ innehabe, bei welchen keine feste Größe definiert ist?

Das Problem ist also nicht, dass ich nicht zugreifen kann. Sondern
das ich die Werte welche sich im databuff befinden nicht zu den Variablen der Struktur zuordnen kann, weil ich nicht einmal weiß ob ich den richtigen Startwert im Speicher(0x4040) anspreche?

Ich hoffe jemand kann uns bei diesen Problem erhellende Einblicke geben, da die Doku von Beckhoff relativ gering ausfällt

viele Grüße und vielen Dank
 
Der ADS Zugriff mit lj_indexGroup = 0x4040 bedeutet laut InformationSystem:
"PLCADS_IGR_RWDB
Daten-Bereich. Offset ist Byteoffset"
In deinem Aufruf ist lj_indexOffset = 0x0. Wenn deine PLC-Variable auf der Adresse 0 liegt, dann passt das. Die Byte-Adresse der PLC-Variablen, die in der Deklaration mit AT%MBnn angegeben ist muss mit dem Offset im AdsSynReadReq übereinstimmen. Mit den 200 Byte wird nur ein kleiner Teil des Arrays gelesen, aber das ist das nächste Problem.


Welche Fehlermeldung wir denn beim symbolischen Lesen ausgegeben? Die ADS Return Codes sind dokumentiert. Ich tippe auf "0x705 parameter size not correct" was bedeuten würde, dass die 200 Byte nicht mit der Variablengröße übereinstimmen.


Gruß,
witkatz
 
Hallo,

nein ich erhalte die Fehlermeldung 0x701 1793 Service is not supported by serverich denke es liegt daran, dass ich auf eine Struktur zugreife, für welche er keine richtige Größe kennt?
AT%MBnn Vorher bekomme ich diesen Wert?
Ich denke wenn ich diesen kenne dann kann ich doch auf den Start vom Array zugreifen. Die Größe des databuffs kann ich später doch dann beliebig anpassen?
Oder siehst du noch ein anderes Problem?
viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Adressierung hat der Programmierer selber in der Hand. Die Adresse wird in der Deklaration angegeben. Z.B.
Modulliste AT%MB0 : ARRAY[0..21] OF modul;

Bei der Variablenadressierung besteht die Gefahr, dass sich Adressen ungewollt überschneiden können.
Wenn du z.B. folgendes deklarierst:
Modulliste1 AT%MB0 : ARRAY[0..21] OF modul;
Modulliste2 AT%MB200 : ARRAY[0..21] OF modul;
dann ist Ärger vorprogrammiert.

Gruß,
witkatz
 
Okay ich verstehe,

so wie es aussieht, haben wir noch ein Array.
Dann muss auch versuchen, dass all die anderen Variablen vor dem Array deklariert sind, um diese nicht mit dem Array zu überschreiben.

Okay wir versuchen mal diese Hinweise umsetzen.
Vielen Dank für deine tolle Unterstützung.

viele Grüße
 
Hallo,
leider kommen wir nicht weiter obwohl der Array der Struktur mit AT%MB0 bezeichnet ist können wir mit
nErr = AdsCallDllFunction.adsSyncReadReq(addr,
0x4040, // size of byte
0x0, // starts by adress 0
wholestructsize,
databuff);
nicht auf das Array zugreifen, sobald wir in der Steuerung die Werte ändern, zeigt sich in den erhaltenen JNI Byte Array keine Änderungen.

Wir haben nochmal versucht mit den Name .Modulliste auf das array zuzugreifen. Aber auch ändern sich keine Werte in Java wenn wird die Struktur per Steuerung ändern.

JNIByteBuffer hdlBuff = new JNIByteBuffer(4);
// Symbol name: String to byte[]
JNIByteBuffer symBuff = new JNIByteBuffer(".Modulliste".getBytes());
JNIByteBuffer dataBuff = new JNIByteBuffer(wholestructsize);

if(nErr!=0) { System.out.println("Error: Open Communication: 0x"
+ Long.toHexString(nErr)); }

// Get handle by symbol name
nErr = AdsCallDllFunction.adsSyncReadWriteReq(addr,
0xF003,
0x0,
hdlBuff.getUsedBytesCount(),
hdlBuff,
symBuff.getUsedBytesCount(),
symBuff);
if(nErr!=0) { System.out.println("Error: Get handle: 0x"
+ Long.toHexString(nErr)); }

// Handle: byte[] to int
int hdlBuffToInt = Convert.ByteArrToInt(hdlBuff.getByteArray());

// Read value by handle
nErr = AdsCallDllFunction.adsSyncReadReq(addr,
0xF005,
hdlBuffToInt,
0x4,
dataBuff);

hätte jemand noch ein paar Hinweise?

viele Grüße und vielen Dank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Problemlösung

Hallo,

wir haben es schließlich geschafft auf die einzelnen Werte innerhalb eines Arrays zugreifen zu können. Nachdem es uns nicht gelang mit der Adressierung bei 0 zu beginnen, haben wir nochmals den Zugriff per Namen probiert. Unser Array mit dem Namen modulliste konnte auch so nicht angesprochen werden. Jedoch gelang der Zugriff auf den Wert mit modulliste[1].Bezeichnung. Der Zugriff von innenliegenden Arrays ging auch
modulliste[1].Bezeichnung[2].Wert.

Das Schreiben funktioniert auf den gleichen Weg.
Ich hoffe das hilft hier jemanden?

viele Grüße
 
Zurück
Oben