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]OFBOOL;(* 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] OFBOOL;
  i  : USINT;
  pBit  : POINTERTOBOOL;END_VARFORi:=1TO4DO
  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]
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 ] OFBOOL;
  i  : INT;
 ib : INT;
  pBYTE  : POINTERTOBYTE;
  bData : BYTE;END_VARpByte :=ADR(%IB6);i :=1;REPEAT
  bData :=pByte^; (* Gesamtes Byte auslesen *)
  ib:=1; (* Zähler bit of Byte of 1 setzen *)
  REPEAT
    xBit[i] :=(bDataAND16#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 *)
  UNTILib<=16ANDi<60
  END_REPEAT
  pByte :=pByte+1;UNTILi<60END_REPEAT
ich habs nicht gestestet könnten noch tippfehler drin sein!
mfg Jochen
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Gibt es eine Möglichkeit Adressen direkt einem Array zuzuweisen?
Beispiel:
Oder gibt es praktikable Alternativen?
Das funktioniert z.B. auch nicht:
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
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
ich habs nicht gestestet könnten noch tippfehler drin sein!
mfg Jochen
Hallo es geht auch einfacher:
INPUTS AT%IB0 :ARRAY [1..8] OF BOOL;
Hallo bonatus
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.
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
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