Step 7 AWL Netzwerk in TwinCAT 3 umsetzen

Stirni

Level-2
Beiträge
69
Reaktionspunkte
15
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin gerade dabei ein Netzwerk aus einem Step 7 Programm in TwinCAT 3 zu realisieren.
Dabei bin ich auf ein paar Probleme gestoßen, an denen ich nicht mehr weiter weiß.
Hier mal das Netzwerk:
Code:
    "DB_VISU_MSG" // DB200 -- enthält BOOLsche Werte
    d_max // INT
    d_loop // INT
    d_sum // DINT

Code:
      AUF   "DB_VISU_MSG"
      L     244
      T     #d_max
      L     L#0
      T     #d_loop
      L     L#0
      T     #d_sum

F1sm: L     #d_loop
      SLW   3
      LAR1  
      L     DBD [AR1,P#0.0]
      L     #d_sum
      OD    
      T     #d_sum

      L     #d_loop
      L     4
      +I    
      T     #d_loop
      L     #d_max
      <=I   
      SPB   F1sm

      L     #d_sum
      L     DBW  248
      OD    
      T     #d_sum

      L     #d_sum
      L     L#0
      <>D   
      =     #hmifm1
1.
Der Befehl "AUF", schlägt in Step 7 den Datenbaustein auf.
In TwinCAT kann ich ja anders als in Step 7 weder einen separaten DB erstellen,
noch kenne ich einen Befehl der ihn aufschlägt.
Wie muss ich das dann realisieren? Evtl. eine Struktur erstellen, die dann ein Array enthält?
2.
Code:
      L     #d_loop
      SLW   3
      LAR1  
      L     DBD [AR1,P#0.0]
Ich verstehe nicht so ganz, was das Ganze bewirken soll.
Also zuerst, nehme ich d_loop und mach durch SLW 3 einen Pointer draus, danach lade ich das Adressregister 1 und dann ... ?

Mir scheint, es ist gar nicht so einfach, das in TwinCAT zu lösen.
Ich hoffe, ihr könnt mir helfen.

Vielen Dank

-Stirni
 
Hallo Stirni, abtippen ist doof.
Selber machen ist besser. Ist doch alles IEC 61131 Code. Sollte doch compatible sein... 😂
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist eine Schleife, die von 0 bis d_max (244) geht. Der Schleifenzähler d_loop wird immer um 4 erhöht, weil er eigentlich eine Bytenummer für die indirekte Adressierung enthält.
Der Pointer in AR1 adressiert ein DWORD-Array (wg. "L DBD..." und "#d_loop += 4") (248 Byte groß)
Danach wird noch DBW 248 (Byte 248 und Byte 249) dazu-verodert.
Das DWORD-Array + DBW 248 ist vermutlich in Wirklichkeit ein "ARRAY [0..1999] OF BOOL" (= 2000 Bit = 250 Byte groß)
Die indirekte absolut-Adressierung tut faktisch so wie ein "AT" (Union) eines DWord-Arrays über einem BOOL-Array.

Der Programmcode ermittelt, ob in dem Array irgendeins der 2000 Bits gesetzt ist. Dazu werden alle Bits DWord-weise verodert, und zum Schluß wird verglichen, ob das Bit-Sammel-DWord (d_sum) <> 0 ist.

Solche S7-Adressierungs-Schweinereien würde ich nicht nach TwinCat mitnehmen (obwohl es wohl möglich ist, mit einem DWORD-Pointer durch ein BOOL-Array zu peeken. Außerdem kommt noch hinzu, daß in TwinCar vermutlich ein BOOL nicht ein Bit sondern ein Byte ist.)

Die sinngemäße Umwandlung des AWL-Codes ist so:
Code:
DB_VISU_MSG : ARRAY [0..1999] OF BOOL;

temp_Bool := 0;
FOR i:=0 TO 1999 DO
  temp_Bool := temp_Bool OR DB_VISU_MSG[i];
END_FOR;
hmifm1 := temp_Bool;

Harald
 
Zurück
Oben