Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: Zugriff von java auf Struktur per ADS

  1. #1
    Registriert seit
    27.05.2011
    Beiträge
    6
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Zugriff von java auf Struktur per ADS  

  2. #2
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    Wo hackt's denn? Klappt das lesen in das JNIByteBuffer schon nicht? Gibt adsSyncReadReq eine Fehlernummer aus?

    Gruß,
    witkatz

  3. #3
    Registriert seit
    15.09.2011
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  4. #4
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    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

  5. #5
    Registriert seit
    15.09.2011
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  6. #6
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    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

  7. Folgender Benutzer sagt Danke zu witkatz für den nützlichen Beitrag:

    DeepOcean (15.09.2011)

  8. #7
    Registriert seit
    15.09.2011
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  9. #8
    Registriert seit
    15.09.2011
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  10. #9
    Registriert seit
    15.09.2011
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Zitieren Zitieren Problemlösung  

Ähnliche Themen

  1. Ein- und Ausgänge in Struktur
    Von bonatus im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 05.06.2009, 14:04
  2. Pointer auf Struktur (SCL)?
    Von momo99 im Forum Simatic
    Antworten: 26
    Letzter Beitrag: 25.03.2009, 10:23
  3. Beckhoff - Java - ADS: Zugriff über Symbolnamen?
    Von lollipop im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 02.02.2009, 23:39
  4. HTTP Zugriff/Java funktioniert nicht auf CP 243-1 IT
    Von Norbert im Forum Programmierstrategien
    Antworten: 0
    Letzter Beitrag: 26.01.2007, 19:41
  5. DB-struktur
    Von Pimsti im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 13.06.2006, 12:48

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •