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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

Thema: Array Element über Variable auslesen.

  1. #11
    Registriert seit
    30.06.2007
    Ort
    Minden (Westf.)
    Beiträge
    178
    Danke
    42
    Erhielt 21 Danke für 21 Beiträge

    Rotes Gesicht


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... aber ich hab mal so etwas gebastelt:

    Code:
    FUNCTION "READ_IND_ADR_ARRAY" : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      feld_nr : INT ;	//Gewünschtes Feld im INTEGER-Format.
      feld_laeng : INT ;	//Summe über die Länge aller Zellen  innerhalb eines Feldes Byte-Weise.  
    END_VAR
    VAR_OUTPUT
      aus_zelle1 : TIME ;	//Inhalt des ersten ARRAY-Elements, das  gelesen werden soll.  
    END_VAR
    VAR_IN_OUT
      feld : ARRAY  [1 .. 100 ] OF //Muß identisch sein mit dem ARRAY, auf dem indirekt zugegriffen werden soll!
      STRUCT 	
       feld1 : TIME ;	
      END_STRUCT ;	
    END_VAR
    VAR_TEMP
      dbnr : WORD ;	
      offset : DWORD ;	
    END_VAR
    BEGIN
    NETWORK
    TITLE =OFFSET ermitteln
    
    //ermitteln des gewünschten Feldes, auf das zugegriffen werden soll
    //nach folgendem Algorithmus: (feld_nr - 1) * feld_laeng 
    
          L     #feld_nr; // Gewünscht. Indize vom ARRAY z.B.: 1 - 4
          L     1; 
          -D    ; 
          L     #feld_laeng; // Länge des Feldes Byteweise in
          *D    ; // INT-Format z.B.: 4 da 2 mal INTEGER.
          SLD   3; // Um 3 Bit nach links schieben um
          T     #offset; // Pointer-Format zu erhalten.
    
    NETWORK
    TITLE =Lesen indirekt Impliziert ARRAY-Feld 
    
    
          L     P##feld; // Ermitteln der Anfangsadresse.
          LAR1  ; // Laden der Anfangsadresse in das Adressregister 1.
          L     W [AR1,P#0.0]; // Falls ein referenzierter Zugriff erfolgt: DB-Nr. ermitteln.
          T     #dbnr; // Sichern der DB-Nr.
          AUF   DB [#dbnr]; // DB öffnen.
          L     #offset; // Lade OFFSET.
          L     D [AR1,P#2.0]; // Laden der Anfangsadresse des ARRAYs.
          +D    ; // Verknüpfen mit Anfangsadresse des Feldes.laden der Adresse des indizierten Feldes
          LAR1  ; // in das Adressregister 1.
          L     D [AR1,P#0.0]; // Ausgabe des Inhaltes des gewünschten
          T     #aus_zelle1; // Feldes zur OUTPUT-Variablen.
    
    END_FUNCTION
    
    FUNCTION "WRITE_IND_ADR_ARRAY" : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      feld_nr : INT ;	//Gewünschtes Feld im INTEGER-Format.
      feld_laeng : INT ;	//Summe über die Länge aller Zellen  innerhalb eines Feldes Byte-Weise.  
      in_zelle1 : TIME ;	//Inhalt des ersten ARRAY-Elements, das  beschrieben werden soll.  
    END_VAR
    VAR_IN_OUT
      feld : ARRAY  [1 .. 100 ] OF //Muß identisch sein mit dem ARRAY, auf dem indirekt zugegriffen werden soll!
      STRUCT 	
       feld1 : TIME ;	
      END_STRUCT ;	
    END_VAR
    VAR_TEMP
      dbnr : WORD ;	
      offset : DWORD ;	
    END_VAR
    BEGIN
    NETWORK
    TITLE =OFFSET ermitteln
    
    //ermitteln des gewünschten Feldes, auf das zugegriffen werden soll
    //nach folgendem Algorithmus: (feld_nr - 1) * feld_laeng 
    
          L     #feld_nr; // Gewünscht. Indize vom ARRAY z.B.: 1 - 4
          L     1; 
          -D    ; 
          L     #feld_laeng; // Länge des Feldes Byteweise in
          *D    ; // INT-Format z.B.: 4 da 2 mal INTEGER.
          SLD   3; // Um 3 Bit nach links schieben um
          T     #offset; // Pointer-Format zu erhalten.
    
    NETWORK
    TITLE =schreiben indirekt impliziet ARRAY-Feld 
    
    
          L     P##feld; // Ermitteln der Anfangsadresse.
          LAR1  ; // Laden der Anfangsadresse in das Adressregister 1.
          L     W [AR1,P#0.0]; // Falls ein referenzierter Zugriff erfolgt: DB-Nr. ermitteln.
          T     #dbnr; // Sichern der DB-Nr.
          AUF   DB [#dbnr]; // DB öffnen.
          L     #offset; // OFFSET laden.
          L     D [AR1,P#2.0]; // Laden der Anfangsadresse des ARRAYs.
          +D    ; // Verknüpfen mit Anfangsadresse des Feldes. Laden der Adresse des indizierten Feldes
          LAR1  ; // in das Adressregister 1.
          L     #in_zelle1; 
          T     D [AR1,P#0.0]; // Ausgabe des Inhaltes des gewünschten
    
    END_FUNCTION
    Gruß

    Stefan


    Zitieren Zitieren Schon etwas länger her...  

  2. #12
    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,

    Endlich bin ich dazu gekommen, dass Programm fertig zu programmieren.
    Ich habe nur das Problem, dass High Byte und Low Byte vertauscht sind. Aber ich denke, dass ich dazu, noch eine Lösung finde.

    Code:
          AUF   "DB55_HMI_Störmeldungen"
          L     #akt_dw_loop
          L     95
          >=I   
          SPBB  lasb                        //letztes Bit
    //Abfrage der Bitposition
          L     #akt_dw_loop
          LAR1  
          U     DBX [AR1,P#0.0]
          SPBN  inc
    //Abfrage ob das Letzte Anzeigefenster erreicht ist
          L     16
          L     #fehler_bit
          ==I   
          SPBB  inc
    //Schreibe Fehlernummer ins Array
          AUF   "Fehlerauswertung"
          L     #fehler_bit
          SLD   4
          LAR1  
          L     #akt_dw_loop
          T     DBW [AR1,P#2.0]
          L     #fehler_bit
          LAR1  
          SET   
          =     DBX [AR1,P#0.0]
    // fehlerbit +1
          L     1
          L     #fehler_bit
          +I    
          T     #fehler_bit
    // akt_dw_loop +1
    inc:  L     1
          L     #akt_dw_loop
          +I    
          T     #akt_dw_loop
    // Fehler rücksetzten bei Reset
    lasb: U     "DB52_HMI_Schalter".Fehler_zuruecksetzten
          SPBNB end
          L     0
          T     #akt_dw_loop
          T     #fehler_bit
          T     "Fehlerauswertung".FehlerSichtbar
    end:  BE
    Gruß und Vielen Dank für eure Hilfe

    Friedel

  3. #13
    Registriert seit
    28.02.2006
    Ort
    Ostsee 5 min zum Strand
    Beiträge
    780
    Danke
    92
    Erhielt 110 Danke für 98 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von FriedelM Beitrag anzeigen
    Ich habe nur das Problem, dass High Byte und Low Byte vertauscht sind. Aber ich denke, dass ich dazu, noch eine Lösung finde.
    Moin,

    dafür gibt es doch TAW
    Gruß von der Ostsee

    Nordischerjung
    _____________________

    Wenn man seinem Paßbild ähnlich zu sehen beginnt, sollte man schleunigst Urlaub machen. (Vico Torriani, schw. Entertainer)

    Ich habe eine Diät gemacht und fettem Essen und Alkohol abgeschworen - in zwei Wochen verlor ich 14 Tage. (Joe E. Lewis)

Ä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
  •