Adressen direkt einem Array zuweisen

Fuchks
2009-09-28
2009-10-19
  • Fuchks - 2009-09-28

    Gibt es eine Möglichkeit Adressen direkt einem Array zuzuweisen?

    Beispiel:

    (* Standard *)
    xBit1   AT %IX6.0   : BOOL;   (* Eingangsbit 1 *)
    xBit2   AT %IX6.1   : BOOL;   (* Eingangsbit 2 *)
    xBit3   AT %IX6.2   : BOOL;   (* Eingangsbit 3 *)
    xBit4   AT %IX6.3   : BOOL;   (* Eingangsbit 4 *)
    (* Array - Schematisch, funktioniert so natürlich nicht *)
    xBit   : ARRAY [1..4] OF BOOL; (* Array der Eingangsbits *)
    xBit[1]   AT %IX6.0   : BOOL;   (* Eingangsbit 1 *)
    xBit[2]   AT %IX6.1   : BOOL;   (* Eingangsbit 2 *)
    xBit[3]   AT %IX6.2   : BOOL;   (* Eingangsbit 3 *)
    xBit[4]   AT %IX6.3   : BOOL;   (* Eingangsbit 4 *)
    

    Oder gibt es praktikable Alternativen?
    Das funktioniert z.B. auch nicht:

    VAR
       xBit   : ARRAY [1..4] OF BOOL;
       i   : USINT;
       pBit   : POINTER TO BOOL;
    END_VAR
    FOR i:=1 TO 4 DO
       pBit := BITADR(%IX6.0);
       pBit := pBit +i -1;
       xBit[i] := pBit^;
    END_FOR
    

    Das liefert mir den Fehler: Kann USINT nicht in Pointer to Bool konvertieren (fehler bei i, ohne Variable i geht's, bringt aber nichts)
    Das sind hier nur Beispiele meine Anwendung ist etwas komplexer.
    Dort soll jedes 2. Eingangs-Bit einem Array-Element zugeordnet werden.[/code]

     

    Related

    Talk.ru: 1
    Talk.ru: 2
    Talk.ru: 3

  • J Schohaus - 2009-09-29

    Hallo

    einem Array jedes Element eine Adresse zuzuweisen geht nicht.

    um dieses über ein Programm zu lösen muss das gesamte Byte gelesen werden. Aus dem Byte danach die Bits auswerten.

    mein Beispiel

    VAR
       xBit   : ARRAY [1..60 ] OF BOOL;
       i   : INT;
      ib : INT ;
       pBYTE   : POINTER TO BYTE;
       bData : BYTE ;
    END_VAR
    pByte := ADR(%IB6) ;
    i := 1 ;
    REPEAT
       bData := pByte^ ; (* Gesamtes Byte auslesen *)
       ib:= 1; (* Zähler bit of Byte of 1 setzen *)
       REPEAT
          xBit[i] := ( bData AND 16#0001 ) > 0 ; (* Auswertung bit *)
          bData := SHR(bData,1) ; (* verschiebe Daten zum nächsten BIT *)
          ib := ib + 1 ; (* Anzahl Bit vom Byte + 1 *)
          i := i + 1 ; (* Anzahl Bit Gesamt + 1 *)
       UNTIL ib <= 16 AND i < 60
       END_REPEAT
       pByte := pByte + 1 ;
    UNTIL i < 60
    END_REPEAT
    

    ich habs nicht gestestet könnten noch tippfehler drin sein!

    mfg Jochen

     
  • bonatus - 2009-09-29

    Hallo es geht auch einfacher:

    INPUTS AT%IB0 :ARRAY [1..8] OF BOOL;

     
  • J Schohaus - 2009-09-30

    Hallo bonatus

    Zitat:
    INPUTS AT%IB0 :ARRAY [1..8] OF BOOL;

    Leider ist es nicht so einfach.

    In dein Beispiel sind die Bytes IB0 bis IB8 in der Strucktur zusammengelegt.

    Das liegt daran das ein BOOL das nicht diereckt mit AT deklariert wird eine länge eines Bytes belegt.

     
  • Nitrozin - 2009-09-30

    Moin

    so könnte es gehen.

    Habe das mit Inputs noch nicht getestet aber mit Merkervariablen funktioniert es.

    TYPE BOOLVAR :

    STRUCT

    X0 : BOOL;

    X1 : BOOL;

    X2 : BOOL;

    X3 : BOOL;

    X4 : BOOL;

    X5 : BOOL;

    X6 : BOOL;

    X7 : BOOL;

    END_STRUCT

    END_TYPE

    INPUTS AT %IB0 : BOOLVAR; ( 1 Byte )

    oder

    INPUTS AT %IB0 : ARRAY[0..n] OF BOOLVAR;

    Gruß Volker

     
  • cmoeller - 2009-10-19

    Hallo Volker,

    auf meinem 750-841 klappt das nicht.

    Wenn ich digitale Eingänge über deine Struktur deklariere, dann bekomme ich eine 8Byte große Struktur von dem nur das erste Byte "gemonitored" wird.

    Setze ich dann den 2ten digitalen Eingang, wird im Online-mode für INPUTS.X1 "INVALID-VALUE 2" ausgegeben.

    Zusatz zum Thema Monitoring:

    Auf meinem 750-841 werden nur die benutzten Variablen "gemonitored".

    Auch muss schon zur Compilezeit feststehen welche Variablen mit welcher Breite von der aktuellen Task bearbeitet werden.

    Daher funktionieren Deklaration wie folgt nicht:

    pawInputs : POINTER TO ARRAY[0..254] OF WORD;

    Wenn im Programmcode dann der Pointer wie folgt initialisiert wird:

    pawInputs := ADR(%IW0);

    Wird nur %IW0 gemonitort - mehr nicht.

    Gruss cmoeller

     

Log in to post a comment.