Step 7 SCL - Auf Ziel eines ANY-Pointers zugreifen

Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du PLCSIM? Da könntest du Deinen Code gefahrlos ausgiebig testen.

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
 
Ich verstehe aber deine Intension - ich hatte auch schon mal über etwas in der Art nachgedacht - es aber dann verworfen weil man an der Schnittstelle eines Bausteins schon durchaus den erwarteten Typ festlegen kann - das machen die meißten Hochsprachen ja auch nicht anders. Wenn man eine Überlagerung erzeugen könnte ...

Aber naja ... es ist halt wie es ist ...

Nurfürs Verständnis: Was meinst du hier genau?
 
Wenn der FC sowieso verschiedene Dinge tun soll - warum mußt Du das alles in nur 1 FC quetschen?
Mache doch 4 FC mit jeweils verschiedenen Eingangsparametern.
Oder "wrappe" 4 FC um einen Kern-FC.

Allerdings könnte es passieren, daß solch ein Konstrukt womöglich jeder versteht... ;)

Harald

Man kann ganz einfach den Datentyp auswerten und fertig.
Die Alternativ-Konstrukte von Harald erhöhen mMn nur den Projektierungsaufwand wenn man hinterher die "Masse" macht..
 
Zuletzt bearbeitet:
Die Alternativ-Konstrukte von Harald erhöhen mMn nur den Projektierungsaufwand wenn man hinterher die "Masse" macht..
Die Alternativ-Konstrukte funktionieren allerdings mit jeder PLC und jeder Programmiersprache und auch voll-symbolisch :cool:

Das macht Siemens übrigens ebenso bei Bausteinen, wo es ...zig Versionen für ...zig IO-Datentypen gibt, daß man am Baustein den Datentyp extra projektieren muß, sozusagen ein Wrapper-Makro.

Harald
 
@Flux:
zu Beitrag #22 : was meinst du bzw. was wolltest du wissen ?
Ansonsten halte ich deine Anmerkungen nicht unbedingt für konstruktiv ...

Gruß
Larry
 
ich hatte den Inhalt der Aussage nicht verstanden:
"ich hatte auch schon mal über etwas in der Art nachgedacht"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das besagt genau das, was ich da geschrieben habe : ich habe darüber nachgedacht (für meine Anwendungen) es aber nicht mehr weiter verfolgt weil mir der Aufwand (hier vor Allem der die Rechenzeit beeinflussende) zu unverhältnismäßig (bei Verwendung von SCL) erschien ...
 
Zurück
Oben