Step 7 AWL in SCL umprogrammieren

Platinum

Level-1
Beiträge
90
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich benötige mal Hilfe bei folgendem AWL Code. Ich möchte diesen gerne in SCL umwandelt und finde leider keine passende Erklärung zu meinen Fragen.
Hier erst mal der zu ändernde Code:

Nach einer Änderung der Programmnummer wird der Zähler auf Null gesetzt und die neue und aktuelle Programmnummer angepasst.

AWL-Code.png

Meine Fragen dazu wären, wie ich dieses "AUF DB1000 und LAR1" in SCL realisiere und die Schreibweise der Pointer ausführe.

Ich Danke euch schon mal

Gruß
 
Als Schleife habe ich gedacht ein For Schleife zu benutzen oder seht Ihr eine andere als sinnvoller?
Ich bin im Gebiet SCL neu unterwegs und möchte mich da etwas hinter klemmen.

Was ich noch gesehen habe, was ich oben falsch angegeben hatte, die aktuelle Programmnummer wird erst nach dem fertigen durchlaufen der Schleife angepasst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also der DB1000 und die "#aktuelle_PrgNr_plus_1000" (da gibt es vermutlich mehrere) sind DB's.
Das wird bei Dir ein Array [0..778] zB aus "OF INT" sein.

0 - 778 wird bei Dir der Zähler sein.

Was diese Schleife genau macht kann Dir nur der Programmierer erklären.
Er kopiert zuerst ein Wort aus dem DB1000 in den DB "#aktuelle_PrgNr_plus_1000" und dann wieder zurück vom DB "#aktuelle_PrgNr_plus_1000" in den DB1000 (was für mich keinen Sinn macht- aber vielleicht hab ich es einfach nur nicht verstanden).

Das neuerliche


trägt da auch nicht zur Aufklärung bei, weil das m.E. nach ebenfalls keinen Sinn macht.

Jedenfalls macht er das bis die Schleife den #Zaehlerwert 6240 erreicht hat, dann springt er nicht mehr zurück zur m042:.

Die Addition von "16" ist einfach eine Erhöhung des AR1 um eine Wortadresse.
 
Ich würde das gar nicht in einer Schleife machen.
Es wird 2 Mal umkopiert:

1. von DB1000 in DB(#aktuelle_PrgNr_plus_1000)
2. von DB(neue_PrgNr_plus_1000) in DB1000

Da könnte man auch ganz einfac mit 2x Blockmove (SFC20) hintereinander erledigen.

Dazu gibt es 2 Möglichkeiten.

1. Du suchst hier im Forum nach ANY und AT in SCL um dir die Information zu holen, wie man in SCL Any-Pointer zusammenbaut, die brauchst du für Blockmove.
2. Du nutzt z.B. diesen Baustein und kann da einfach die DB-Nummern, Startadressen und Längen eintragen. (Der Baustein selbst ist in AWl, aber den kannst du ja schön in SCL aufrufen.)
 
Hallo borromeus,

Danke schon mal für deine Antwort.

Die Funktion ist so:

Ich habe einen DB1000 indem meine aktuell im Programm verwendeten Daten stehen (Beispielsweise zu einem Werkzeug mit Code 1 -> Werden die Daten aus dem DB1001 in den DB1000 geschoben und die alten Daten aus dem DB1000 in den DB1001 gesichert, damit ich die beim erneutem stecken der Werkzeuges 1 wieder zurückbekomme.)

Stecke ich nun ein anderes Werkzeug dran (mit Werkzeuge Code 2, werden Daten aus dem DB1002 in den DB1000 geladen usw.)
Hier mal der komplette FB zum besseren Verständnis.

NW1_NW2.png

NW3.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,

richtig es wird Wordweise umkopiert. Aber ein ganzer DB mit (im Bsp. 778 Wörtern)
Bsp. Code 1 WAR gesteckt und Code 2 IST gesteckt, dann wäre folgender Ablauf:

DB1000.DBW0 nach DB1001.DBW0
DB1002.DBW0 nach DB1000.DBW0
DB1000.DBW2 nach DB1001.DBW2
DB1002.DBW2 nach DB1000.DBW2

.
.
.
.
.
usw.

Wie kann ich das mit Blockmove realisieren?
Ziel war es eine Baustein zu basteln, wo ich vorne lediglich die Programmnummervorgabe anlege und den DB1000 als aktueller Daten DB.
Den DB1000 dann als IN_OUT Variable anlege.
 
Der Code ist nicht unbedingt hocheffizient geschrieben, aber leicht verständlich. Es sind 2 Kopierfunktionen in die selbe Schleife gepackt, die könnte man auch nacheinander ausführen.

Die Schleife kopiert die ersten 778 Words von DB1000 zu DB[#aktuelle_PrgNr_plus_1000] und von DB[#neue_PrgNr_plus_1000] zu DB1000.
Also quasi
- BLKMOV "P#DB1000.DBX0.0 BYTE 1556" ---> "P#DB[#aktuelle_PrgNr_plus_1000].DBX0.0 BYTE 1556"
- BLKMOV "P#DB[#neue_PrgNr_plus_1000].DBX0.0 BYTE 1556" ---> "P#DB1000.DBX0.0 BYTE 1556"

Für welche CPU soll das neue SCL-Programm denn sein?


PS: zu langsam

Harald
 
Als Schleife habe ich gedacht ein For Schleife zu benutzen oder seht Ihr eine andere als sinnvoller?
Ich bin im Gebiet SCL neu unterwegs und möchte mich da etwas hinter klemmen.

Ich würde hier überhaupt keine Schleife zum kopieren verwenden sondern den SFC20 Blkmov.
Damit kannst du große Datenbereiche schneller kopieren.
Nachteil für den Anfänger ist, dass du für das indirekte Adressieren ANY-Pointer manipulieren musst.
Da du das aber in SCL machen willst, kannst du hierfür Views (AT) verwenden und somit ein tolles Feature von SCL kennenlernen.

Gruß
Dieter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

das sieht schon so nach dem aus was ich suche :D
Das Programm soll ein Standard werden bei uns und meistens ist die 315er CPU im Einsatz, ab und zu auch die IM151F-CPU (ist Kundenabhängig, in Zukunft wird das TIA Portal uns begleiten)
 
Siehe PN/DP.
Ich mache das auch in etwas so, allerdings nutze ich dazu den den o.g. Bausteon, der erzeugt aus den IN-Daten die korrekten Any.
Du legst dann nicht den DB 1000 an, sondern eine 1000 für die DB-Nr, 0 für die Startadresse (falls es bei 0 losgeht) und 1556 für die Länge.
All diese IN können ja auch Variablen sein, so dass du die DB-Nummer variabel gestalten kannst.
Das sind im Prinzip dann zwei Aufrufe des FC112 hintereinander und fertig. Natürlich mußt du auch hier dafür sorgen, dass der Code nur ausgeführt wird, wenn du umkopieren willst, aber das muß ja auch vorher schon so implementiert gewesen sein.
 
Für TIA ist das leider nur halb geeignet. Genau da gibt es 2 dicke Probleme.

1. symbolische Adressierung --> Das ginge mit eine langen Case-Anweisung und dem direkten absolut adressierten Umkopieren von Strukturen (komplette DB).
Für 200 Programme mußt du dann eine 200-er case-Anweisung schreiben. :-(

2. wenn man nicht symbolich adressiert, dann muß man die DB auf "nicht optimiert" einstellen und mit BLKMOV (Variant). Dazu mußt du dann auch Amy-Zeiger nutzen.
 
Ich wollte das nach erfolgreichem testen in TIA migrieren.
Aber so wie sich das von dir anhört gibt es da Probleme :sad::sad:
 
Wenn es für S7-300 oder S7-400 sein soll - warum dann zu SCL konvertieren? Der AWL-Code tut doch seinen Zweck. Man könnte jedoch das Kopieren auf BLKMOVs mit zusammengebastelten ANYs umstellen (wie in dem FC112 von Ralle), damit viel schneller kopiert wird. SCL macht das Ganze nur wieder uneffizienter.

Wenn die Funktion später auch auf S7-1200/S7-1500 gebraucht werden sollte, dann wird das Adress-orientierte Kopieren gar nicht funktionieren oder nur äußerst langsam. Da muß dann die Funktion nochmal neu geschrieben werden. Wer weiß, was sich Siemens bis dahin Neues ausgedacht hat...

Ich sehe das Problem genau so wie Ralle.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für TIA ist das leider nur halb geeignet. Genau da gibt es 2 dicke Probleme.

1. symbolische Adressierung --> Das ginge mit eine langen Case-Anweisung und dem direkten absolut adressierten Umkopieren von Strukturen (komplette DB).
Für 200 Programme mußt du dann eine 200-er case-Anweisung schreiben. :-(

2. wenn man nicht symbolich adressiert, dann muß man die DB auf "nicht optimiert" einstellen und mit BLKMOV (Variant). Dazu mußt du dann auch Amy-Zeiger nutzen.

Durch TIA ändert sich ja an der Programmierweise der alten Hardware 300/400er nichts. Da funktioniert also alles wie du beschrieben hast. Das für die 1500er umzubauen wird IMHO dann etwas komplexer wegen der Variantmodelle die man ja weder bearbeiten noch betrachten kann.
Aber auch da könnte man ja deinen Baustein etwas anpassen und bei nicht optimierten DBs bleiben.

mfG René
 
Durch TIA ändert sich ja an der Programmierweise der alten Hardware 300/400er nichts. Da funktioniert also alles wie du beschrieben hast. Das für die 1500er umzubauen wird IMHO dann etwas komplexer wegen der Variantmodelle die man ja weder bearbeiten noch betrachten kann.
Aber auch da könnte man ja deinen Baustein etwas anpassen und bei nicht optimierten DBs bleiben.

mfG René

Richtig, aber ich habs schon am Laufen mit dem Blkmov(Variant). Der arbeitet eigentlich wie bei der 300-er inkl. Any, den ich über einen eigenen Baustein erzeuge und einfach an den Blkmove schreibe. Aber das ist dann eben eigenlich wieder außerhab der neuen 1500-er SPS-Philosophie. :-(
 
Richtig, aber ich habs schon am Laufen mit dem Blkmov(Variant). Der arbeitet eigentlich wie bei der 300-er inkl. Any, den ich über einen eigenen Baustein erzeuge und einfach an den Blkmove schreibe. Aber das ist dann eben eigenlich wieder außerhab der neuen 1500-er SPS-Philosophie. :-(

Jap. Aber kennst mich ja. Da hab ich schon in anderen Treads drüber gewettert. Gerade erst begriffen wie das mit den Pointern funktioniert und sogar in SCL. Dann schmeissen sie Variant hinterher und da geht wieder garnix dergleichen. Zum Kotzen.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin dabei den unten stehenden Code von Harald in SCl ins Tia portal zu bringen.
Leider habe ich bei der Pointerschreibweise ein problem bzw. weiß noch nicht so richtig wie ich den Pointer im Tia SCL hin bekomme.

Der Code ist nicht unbedingt hocheffizient geschrieben, aber leicht verständlich. Es sind 2 Kopierfunktionen in die selbe Schleife gepackt, die könnte man auch nacheinander ausführen.

Die Schleife kopiert die ersten 778 Words von DB1000 zu DB[#aktuelle_PrgNr_plus_1000] und von DB[#neue_PrgNr_plus_1000] zu DB1000.
Also quasi
- BLKMOV "P#DB1000.DBX0.0 BYTE 1556" ---> "P#DB[#aktuelle_PrgNr_plus_1000].DBX0.0 BYTE 1556"
- BLKMOV "P#DB[#neue_PrgNr_plus_1000].DBX0.0 BYTE 1556" ---> "P#DB1000.DBX0.0 BYTE 1556"

Für welche CPU soll das neue SCL-Programm denn sein?


Es soll für die 1200ersowie für die 1500er CPU funktionieren.

Danke für eure Hilfe :)




PS: zu langsam

Harald
 
:D Nein. Ich hab das bisher nur für S7-300 benutzt. Jetzt möchte ich das aber in der 1500er nutzen, was aber so ja nicht mehr funktioniert.
 
Zurück
Oben