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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Array Element über Variable auslesen.

  1. #1
    Registriert seit
    06.12.2010
    Beiträge
    4
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Bisher habe ich nur in ST programmiert und soll mich nun in der S7 einarbeiten deshalb habe ich zwei einfache Fragen:
    Meine Steuerung ist eine S7 315 DP.
    Das Programm soll in AWL geschrieben werden.
    Problem 1:
    Ich habe im DB14 ein Array [0...15] of Int. in diesem möchte ich über eine Variable ein einzelnes Element auslesen.
    In ST wäre das folgendermaßen:
    Wertx:=Array[variable_X];

    Mein zweites Problem ist etwas komplexer. Hier habe ich ebenfalls ein Array [0...6] of Int. Dieses möchte ich mit einer Schleife durchlaufen und Bitweise abfragen. Sollte ein Bit true sein möchte ich die Bittnummer in einen anderes Array mit 16 Feldern schreiben.
    Beispiel:
    Das Bit 5, 16, 25 ,33 und 36 ist true.

    (0000 0100 0000 0000 1000 0000 0100 0000 0100 1000 ..........)
    Dann soll in einen Integer die ersten 5 bits true gesetzt werden. (0000 0000 0001 1111) bei 6 Bits die true sind dem entsprechend die ersten sechs.
    Das Array soll dann so aussehen.
    Array[0] := 5;
    Array[1] := 16;
    Array[2] := 25;
    Array[3] := 33;
    Array[4] := 36;
    Sollten mehr als 16 Bits true sein, werden ab dem 16. Bit, diese nicht mehr beachtet.

    Vielen Dank für eure Hilfe im Voraus. Und denkt daran ich bin nicht besonders fit beim S7 programmieren

    .
    Zitieren Zitieren Array Element über Variable auslesen.  

  2. #2
    Registriert seit
    18.11.2010
    Beiträge
    8
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    Wenn du weißt, welches Element du auslesen willst würde ich das mit "lade" und "transferiere" machen.

    L db14.dbwx
    T variable

    Deiner zweiten Frage kann ich nicht folgen. Aber es hört sich für mich nach indirekter Adressierung mit Zeigern an, ...

    Gruß Copy

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.289 Danke für 2.658 Beiträge

    Standard

    Suche mal in der Step7-Hilfe nach Adressierung speicherindirekt, das kommt der Array-Schreibweise schon ziemlich nahe, adressiert aber nicht ein Array-Element sondern eine Speicheradresse in Byte-Zählung. EDIT: Bit-Zählung.

    Harald
    Geändert von PN/DP (06.12.2010 um 18:30 Uhr) Grund: Bit-Zählung!
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #4
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Problem 1:
    Das indirekte Adressieren des "Index" in der eckigen Klammer hätte ich auch schon x-mal mit AWL/KOP/FUP gebrauchen können...
    Wie PN/DP schon geschrieben hat, kann man nur die Adresse aufrufen. Wenn dann mal ein Element eingefügt wird, passen die Adressen nicht mehr.

    Problem 2:
    Könnte man mit einer Schleife lösen (AWL kann "LOOP" ).
    Bits mit einem Schiebebefehl durchschieben, das letzte Bit auf 1 abfragen und den Schleifenzähler benutzen, um einzutragen das wievielte bit an war.

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    vielleicht noch ein anderer Ansatz :
    das Pendant zu ST gibt es in der Siemens-Welt auch - nennt sich da SCL. Da solltest du dann alles so machen können wie gehabt.
    Unter Siemens AWL kannst du die Adressierung nur wie oben beschrieben über indirekte Adressierung lösen (also für jedes Array-Element einen neuen Pointer bauen). Du kannst hier (leider) nicht mit dem Index direkt arbeiten ...

    Gruß
    Larry

  6. #6
    FriedelM ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.12.2010
    Beiträge
    4
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo ich habe nach ein paar Versuchen folgenden Code erstellt der nciht funktioniert. Den habe ich mir aus anderen Forenbeiträgen zusammengesucht.

    Code:
    AUF   "Fehlerauswertung" //DB 14
          L     "Fehlerauswertung".FehlerDetailAnzeige //DB 14.dbw34
          T     #akt_dw 
          SLD   3
          LAR1  
          L     DBD [AR1,P#0.0]
          T     "Fehlerauswertung".FehlerDetailAnzeige //DB 14.dbw36
    Dabei geht die CPU immer in Stopp.
    Ich finde einfach nichts für die richtige Syntax.
    Ich habe ach andere Versuche gemacht, dabei kommen dann allerdings immer wirre Werte raus.
    Leider habe ich hier nur die Möglichkeit in AWL zu programmieren.
    Und unter "Adressierung speicherindirekt" habe ich nichts gefunden.

    Gruß FriedelM
    Zitieren Zitieren Versuche zu Problem 1  

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    schreib doch bitte mal in ST-Code hin, was du vorhast ...

    Gruß
    Larry

  8. #8
    Registriert seit
    19.06.2008
    Ort
    Ostalbkreis
    Beiträge
    3.140
    Danke
    201
    Erhielt 553 Danke für 498 Beiträge

    Standard

    Zitat Zitat von FriedelM Beitrag anzeigen
    Hallo ich habe nach ein paar Versuchen folgenden Code erstellt der nciht funktioniert. Den habe ich mir aus anderen Forenbeiträgen zusammengesucht.

    Code:
    AUF   "Fehlerauswertung" //DB 14
          L     "Fehlerauswertung".FehlerDetailAnzeige //DB 14.dbw34
          T     #akt_dw 
          SLD   3
          LAR1  
          L     DBD [AR1,P#0.0]
          T     "Fehlerauswertung".FehlerDetailAnzeige //DB 14.dbw36
    Dabei geht die CPU immer in Stopp.
    Ich finde einfach nichts für die richtige Syntax.
    Ich habe ach andere Versuche gemacht, dabei kommen dann allerdings immer wirre Werte raus.
    Leider habe ich hier nur die Möglichkeit in AWL zu programmieren.
    Und unter "Adressierung speicherindirekt" habe ich nichts gefunden.

    Gruß FriedelM
    Sollte da nicht ein

    Code:
    L DBW (AR1.P#0.0)
    rein?

  9. #9
    FriedelM ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.12.2010
    Beiträge
    4
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    Ich habe da zwei ganz "dumme" Fehler gemacht. Jetzt funktioniert es
    Hier der richtige Code. Woran ich nicht gedacht habe, ist dass ich bei der Adressierung ja nor jede 2. Adresse abfragen kann.
    Code:
          AUF   "Fehlerauswertung" //
          L     "Fehlerauswertung".FehlerDetailBild
          T     #akt_dw
          SLD   3
          LAR1  
          L     DBW [AR1,P#0.0]
          T     "Fehlerauswertung".FehlerDetailAnzeige
    Zu Problem 2 komme ich dann noch einmal später. Vielen Dank an euch. Muss leider noch an einen anderen Projekt weiter machen. Der BL ruft.

    Gruß FriedelM

  10. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.289 Danke für 2.658 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von FriedelM Beitrag anzeigen
    Ich habe im DB14 ein Array [0...15] of Int. in diesem möchte ich über eine Variable ein einzelnes Element auslesen.
    In ST wäre das folgendermaßen:
    Wertx:=Array[variable_X];
    Zitat Zitat von FriedelM Beitrag anzeigen
    Hier der richtige Code. Woran ich nicht gedacht habe, ist dass ich bei der Adressierung ja nor jede 2. Adresse abfragen kann.
    Code:
          AUF   "Fehlerauswertung" //
          L     "Fehlerauswertung".FehlerDetailBild
          T     #akt_dw
          SLD   3   // muß SLD 4 heißen bei INT-Array
          LAR1
          L     DBW [AR1,P#0.0]
          T     "Fehlerauswertung".FehlerDetailAnzeige
    SLD 3 adressiert byteweise, SLD 4 adressiert wordweise.

    Mit SLD 4 entspricht das der Operation "Fehlerauswertung".FehlerDetailAnzeige:=Array["Fehlerauswertung".FehlerDetailBild]; wenn Dein Array bei DB14.DBB0 beginnt. Wenn das Array nicht bei DBB0 beginnt, dann muß zwischen dem SLD 4 und dem LAR1 noch die Anfangsadresse des Arrays addiert werden.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Fügt ein neues Element in Array hinzu
    Von Gundam00 im Forum CODESYS und IEC61131
    Antworten: 21
    Letzter Beitrag: 28.09.2011, 08:12
  2. Array mit strukturierten Element Zur CSV-Datei
    Von ysh032 im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 14.09.2011, 14:23
  3. FB Array als OUT Variable
    Von Beckx-net im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 10.09.2009, 16:41
  4. Element aus Array kopieren
    Von guidokk im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 18.06.2008, 16:14
  5. ARRAY OUT Variable
    Von Kleissler im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 09.04.2005, 11:54

Stichworte

Lesezeichen

Berechtigungen

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