TIA Bit aus DB (150-200) lesen und als Merker ablegen

Magni

Level-2
Beiträge
313
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin, also es geht um eine CPU 1500 mit TIA V16.

Ich will einen Bitwert (dbx5.1) aus einer Reihe von DBs (zB. 150-160) auslesen und als Merker ablegen. Dazu habe ich mir überlegt folgendes zu verwenden:

FOR #i := 0 TO 10 BY 1 DO

#temp := PEEK_BOOL(area := 16#84, dbNumber := 150 + #i, byteOffset := 5, bitOffset := 1);

POKE_BOOL(area := 16#83,
dbNumber := 0,
byteOffset :=200,
bitOffset := 0+#i,
value := #temp);

END_FOR;

Doch das funzt nur bei den ersten 8 Bit (M200.0 bis M200.7) ... dann passiert nichts mehr.
Wie kann ich es anstellen, dass quasi bei M201.0 weitergeschrieben wird?

Hat jemand einen Tipp?

Gruß Heiko
 
Für POKE musst Du #i aufteilen in den ganzzahligen Anteil der Division durch 8 für's ByteOffset und den Rest der Division (MOD 8) für's BitOffset.

Code:
FOR #i := 0 TO 10 BY 1 DO

   #temp := PEEK_BOOL(area := 16#84, dbNumber := 150 + #i, byteOffset := 5, bitOffset := 1);

   POKE_BOOL(area       := 16#83,
             dbNumber   := 0,
             byteOffset := 200 [B][COLOR=#008000]+ #i / 8[/COLOR][/B],
             bitOffset  := 0 + #i[B][COLOR=#008000] MOD 8[/COLOR][/B],
             value      := #temp);

END_FOR;
 
Zuletzt bearbeitet:
Eine andere Möglichkeit das Ganze zu machen wäre, DB Nummer als UINT in einer Schleife zu iterieren. Dann innerhalb der Schleife aus dem UINT ein DB_ANY machen mit "UINT_TO_DB_ANY". Dann aus dem DB_ANY ein VARIANT zu machen mit DB_ANY_TO_VARIANT. Dann dieses VARIANT mit "GetVariant()" in eine temp Variable vom PLC-Datentyp der DBs zu schreiben. Dann das entsprechende Bit in der temp Variable in den Merkerbereich abzulegen (evtl. über Slice Zugriff auf Merker, falls kein Bool sonder Byte, Word, ...).

Vorausgesetzt deine ganzen DBs sind vom selben PLC-Datentyp abgeleitet.

Das Ganze hätte den Vorteil ohne "Peek" und "Poke" aus zukommen und würde demnach bei optimierten Bausteinen funktionieren, was bei der obigen Lösung nicht der Fall wäre.
 
Zurück
Oben