TIA AWL(S7-300) in SCL(S7-1200) übersetzen

Nordischerjung

Level-2
Beiträge
959
Reaktionspunkte
156
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich habe eine Anlage, die wurde mit einer S7-300 erstellt und programmiert.
Nun soll eine neue Anlage eine S7-1200 bekommen.
Jetzt tue ich mich mit SCL noch recht schwer. Ich habe 2 Bausteine, bei denen ich nicht wirklich weiter komme. Könnte mir da mal jemand behilflich sein und mir zeigen, wie ich diese In SCL schreiben kann?

Code:
      AUF   #DB_zum_Speichern
      LAR1  P#0.0                       
      LAR2  P#80.0


          L     #Temp_Anzahl_Formnester
M001: T     #Looping

         L     DBD [AR1,P#0.0]
         L     #Temp_Max_Verriegelpos_E
         +D    
         T     DBD [AR2,P#0.0]

         +AR1  P#4.0
         +AR2  P#4.0

         L     #Looping
         LOOP  M001

und den CODE den ich mal von Ralle erhalten habe :D

Code:
        U     #Reset_Zaehlen
        FP    #flanke
        SPBN  NIX

        L     #Ist_Pos
        T     #Offset_Ist_Pos
NIX:  NOP   0

        L     #Ist_Pos
        L     #Offset_Ist_Pos
        -D    
        L     L#4096
        MOD                               //bildet den Divisionrest, diser steht in Akku 1
        L     L#0                        //lädt 0 in Akku 1, was in Akku 1 war verschiebt sich in Akku 2
        TAK                               //Tauscht Akku 1 mit Akku 2
        <=D                               //Vergleich, wenn 0<= Divisionsrest dann Sprung zu ENDE.
        SPB   ENDE                         //Dabei steht der Divisonsrest noch in Akku1 und kann so 
                                          //bei ENDE sofort Transferiert werden
        L     4096                       //Wenn Divrest negativ, durch Addition einer 
        +D                               //Umdrehung (4096 Schritte) positiv 
ENDE: T     #Ist_Pos_Intern

und was ist mit Adressregister sichern/wieder herstellen?

Code:
      L     DBNO                       
      T     #DB_Register

      TAR1  #AR1_Register              
      TAR2  #AR2_Register              



      LAR1  #AR1_Register
      LAR2  #AR2_Register
 
Zuletzt bearbeitet:
Bei Umsetzung von AWL auf SCL macht es nicht viel Sinn zu versuchen einzelne AWL-Anweisungen in SCL umzusetzen.

Versuch herauszufinden was der AWL-Baustein macht - in deinem Beispiel werden so wie es aussieht irgendwelche Daten umkopiert - und die Funktion in SCL neu aufzusetzen, ohne groß das AWL zu beachten.
Damit sowas in SCL halbwegs elegant möglich ist, müssen die Daten in einem Array abgelegt sein. Du musst dann ggf. deine Datenablage etwas umstrukturieren. Wenn du auch in SCL anfangen musst mit Absolutadressen zu hantieren, ist etwas falsch gelaufen.

Adressregister sichern musst du in SCL nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum ersten Code:
In einem DB, der von außen übergeben wird, sind mehrere DINT. Jedem DINT wird ein Wert dazu addiert ( #Temp_Max_Verriegelpos_E)
Und in einem anderem DINT abgespeichert. Die Häufigkeit IST halt flexibel, je nachdem wieviele Formnester vorhanden sind. Die DB Nummer soll auch variabel von außen übergeben werden. Wie genau mache ich das dann?

Und wie sieht es dann mit Code 2 aus?
 
Hallo,
ich würde das in etwa so übersetzen :
Code:
   AUF   #DB_zum_Speichern
      LAR1  P#0.0                       
      LAR2  P#80.0


          L     #Temp_Anzahl_Formnester
M001: T     #Looping

         L     DBD [AR1,P#0.0]
         L     #Temp_Max_Verriegelpos_E
         +D    
         T     DBD [AR2,P#0.0]

         +AR1  P#4.0
         +AR2  P#4.0

         L     #Looping
         LOOP  M001

Code:
// die Variablen i,q,z sind vom Typ INT
// die Variable qdd ist vom Typ DINT
// die anderen Variablen kennst du ja schon

for i := 1 to Anzahl_FormNester by 1 do
   q := (i-1) * 4 ;
   z := q + 80 ;
   qdd := dword_to_Dint(WORD_TO_BLOCK_DB(DB_zum_Speichern).DD[q]) ;
   WORD_TO_BLOCK_DB(DB_zum_Speichern).DD[z] := dint_to_dword(qdd + Temp_Max_Verriegelpos_E) ;
end_for ;
Ich denke mal, dieser Code bringt dich erstmal an der Start - ich hoffe, er ist das, was du brauchtest - etwas schöner läßt sich so etwas in SCL machen, wenn du nicht mit Daten aus einem anderen Datenbaustein arbeitest.

Gruß
Larry
 
Moin Larry,

danke erstmal für die Hilfe.

etwas schöner läßt sich so etwas in SCL machen, wenn du nicht mit Daten aus einem anderen Datenbaustein arbeitest.

Was meinst du damit? Wenn der DB nicht Variabel ist?

Wie würde das gehen?

Oder meinst du das alles in dem FB machen und dann per "SFC20 BlkMov" verschieben?


Edit: Das andere mit dem eigenene Zähler hab ich jetzt in FUP gelöst ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was meinst du damit? Wenn der DB nicht Variabel ist?

Wie würde das gehen?
Ich meinte hier, dass du ggf. mit einem FB arbeiten sollst und mit FB-internen (statischen) Variablen arbeiten solltest.

Oder meinst du das alles in dem FB machen und dann per "SFC20 BlkMov" verschieben?
wozu verschieben ?
Was hast du weiter vor mit den Daten ? Oder vielleicht anders ... was ist überhaupt der Sinn des Ganzen ? Vielleicht läßt sich ja noch einiges mehr zusammenfassen / vereinfachen ...

Gruß
Larry
 
Das sind Daten von verschiedenen Positionen (Drehgeber), die u.a. einen Offset aufaddiert bekommen.
Jede Position wird in einen DINT im globalem DB gespeichert,
jede Position bekomt einen Offset auf addiert und wird ebenfalls gespeichert.
Diese werden in einem Globalen DB gespeichert um sie weiter zu verwenden.

Ich habe jetzt nur das Netzwerk vom Offset addieren genommen, da ich dachte, wenn ich das in SCL hab, bekomme ich das Positions speichern schon hin.

DB_POS.jpg
 
Puh, Das ist schon ein ganze Weile her. :)
Wenn ich das richtig aus dem Code gelesen habe, sollte das etwa so in SCL aussehen:

Code:
FUNCTION_BLOCK "Baustein_2"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Reset_Zaehlen : Bool;
      Ist_Pos : DInt;
   END_VAR


   VAR 
      HM_FP_Reset_Zaehlen { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
      Offset_Ist_Pos : DInt;
      Ist_Pos_Intern : DInt;
   END_VAR




BEGIN
    IF #Reset_Zaehlen AND
        NOT #HM_FP_Reset_Zaehlen
    THEN
        #Offset_Ist_Pos := #Ist_Pos;
    END_IF;
    #HM_FP_Reset_Zaehlen := #Reset_Zaehlen;
    
    #Ist_Pos_Intern := (#Ist_Pos - #Offset_Ist_Pos) MOD 4096; //Modulo bilden, Rest steht in #Ist_Pos_Intern
    
    //Wenn #Ist_Pos_Intern negativ, dann 4096 aufaddieren, so dass ein positiver Wert entsteht
    IF (#Ist_Pos_Intern < 0) THEN
        #Ist_Pos_Intern := #Ist_Pos_Intern + 4096;
    END_IF;
    
END_FUNCTION_BLOCK
 
Zurück
Oben