- Beiträge
- 22.020
- Reaktionspunkte
- 6.851
-> Hier kostenlos registrieren
Hast Du PLCSIM? Da könntest du Deinen Code gefahrlos ausgiebig testen.
Ich kommentiere einfach mal von oben nach unten durch:
Harald
Ich kommentiere einfach mal von oben nach unten durch:
- Ich vermute mal, Dein Code soll in einem FC sein. (falls Du den Code in einen FB einbaust, dann darfst Du den FB nicht als Multiinstanz deklarieren (bzw. mußt den Instanz-Offset in AR2 berücksichtigen))
- Du mußt aus dem Speicherbereich lesen, auf den AR1 zeigt (V ...), Du liest aber aus dem eigenen TEMP (LW ..). Es muß heißen: L W [AR1,P#0.0]
- Du darfst nicht nur einfach den Wiederholfaktor nehmen, sondern mußt auch prüfen, auf welchen Typ der ANY zeigt. Bei Struct und Array wird in der Regel die Anzahl Bytes übergeben (notfalls auf eine gerade Anzahl Bytes aufgerundet!)
Bei einem "ARRAY[1..24] OF BOOL" macht der AWL-Editor trotz symbolischer Angabe "P#... BYTE 4" draus! - da Du Bits adressieren und zählen wolltest, darfst Du AR1 nur um Bitadressen weiterstellen, durch Dein "SLW 3" erhöhst Du die Byteadresse. (zum Erhöhen der Byteadresse müßte außerdem "SLD 3" verwendet werden)
- Du darfst AR1 in jedem Schleifendurchgang immer nur um 1 Element weiterstellen, Du addierst aber in jedem Durchgang den immer größer werdenden Schleifenzähler
- der ANY-Wiederholfaktor ist ein vorzeichenloser Wert, Du mußt anstatt >I mit >D vergleichen
- Bits (Bool) liest man nicht mit L sondern mit U
- es sieht sauberer aus, wenn man eine Oder-Verknüpfung auch mit O anfängt. Bei S7 braucht man kein "Angst"-U (das hilft im Fall der Fälle auch nicht)
- statt SPB + SPA kann man kürzer schreiben: SPBN
Code:L P##Struct_Any //Eingang LAR1 // Aufbau des ANY-Zeigers L [COLOR="#FF0000"][B]LW[/B][/COLOR] [AR1,P#2.0] T #Anzahl_[COLOR="#0000FF"][B]Bytes[/B][/COLOR] L [COLOR="#FF0000"][B]LW[/B][/COLOR] [AR1,P#4.0] T #DB_Nr L [COLOR="#FF0000"][B]LD[/B][/COLOR] [AR1,P#6.0] //Bereichszeiger LAR1 AUF DB [#DB_Nr] L 0 T #Loop_Zaehler next: NOP 0 L #Loop_Zaehler [COLOR="#FF0000"][B]SLW 3[/B][/COLOR] [COLOR="#FF0000"][B]+AR1[/B][/COLOR] [COLOR="#FF0000"][B]L B[/B][/COLOR] [AR1,P#0.0] [COLOR="#FF0000"][B]L 0[/B][/COLOR] [COLOR="#FF0000"][B]>I[/B][/COLOR] = #[COLOR="#0000FF"][B]Bit[/B][/COLOR]_True L #Loop_Zaehler + 1 [COLOR="#0000FF"][B]U[/B][/COLOR]( T #Loop_Zaehler L #Anzahl_Bytes [COLOR="#FF0000"][B]>I[/B][/COLOR] ) O #Bit_True [COLOR="#0000FF"][B]SPB[/B][/COLOR] exit [COLOR="#0000FF"][B]SPA[/B][/COLOR] next exit: NOP 0
Harald