Step 7 AWL Code nachvollziehen

itsdarkdownhere

Level-2
Beiträge
88
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Zusammen

Ich bin mir beim Verständnis von einem AWL Netzwerk in einer bestehenden Anlage bezüglich der Funktion unklar, da ich noch nicht so viel Erfahrung mit AWL habe. Das Netzwerk lässt sich auch nicht übersetzen, um es in FUP oder KOP leichter nachzuvollziehen.

Ich verstehe die 5. Zeile nicht ganz. Vorher wird der Messwert des Weggebers in #Position_Istwert abgelegt. In Zeile 5 wird dann abgefragt, ob Bit 16.7 von #Position_Istwert 0 ist. Abhängig davon folgt ein bedingter Sprung.
Welchen Zweck erfüllt das? Und wieso wird mit der Nulloperation der Speicher mit Nullen überschrieben?

Der Rest im Code ist einfach nur die Berechnung der aktuellen Elektrodenlänge durch den Messwert, abzüglich der ganzen Offsetwerte und der ursprünglichen Elektrodenlänge. Aber wieso berechnet man eine Elektrodenlänge, welche sich bspw. um 0,1mm verändern kann, mit DINT Werten? Damit gehen doch die Nachkommastellen verloren. Hier würden doch REAL viel mehr Sinn ergeben, da man Gleitkommazahlen hat?

Der TAK befehl dient doch dafür, um die Werte in AKKU1 und AKKU2 für die Differenzberechnung zu tauschen oder?

Danke schonmal!


1736508221663.png
 
Zuletzt bearbeitet von einem Moderator:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin mir beim Verständnis von einem AWL Netzwerk in einer bestehenden Anlage bezüglich der Funktion unklar, da ich noch nicht so viel Erfahrung mit AWL habe. Das Netzwerk lässt sich auch nicht übersetzen, um es in FUP oder KOP leichter nachzuvollziehen.

Ich verstehe die 5. Zeile nicht ganz. Vorher wird der Messwert des Weggebers in #Position_Istwert abgelegt. In Zeile 5 wird dann abgefragt, ob Bit 16.7 von #Position_Istwert 0 ist. Abhängig davon folgt ein bedingter Sprung.
Welchen Zweck erfüllt das? Und wieso wird mit der Nulloperation der Speicher mit Nullen überschrieben?
Das hat jetzt nichts mit Erfahrung in AWL zu tun, wenn irgendwelche Bits in nem DINT manipuliert werden, ohne das es kommentiert wird, warum... also wenn das besagte Bit in Position_Istwert true ist, wird ein Byte im Doppelwort auf 16#FF geschrieben, OD ist ne Bitweise Oderverknüpfung von nem Doppelwort. Wofür das ganze gut ist, weiss ich auch nicht.
Der Rest im Code ist einfach nur die Berechnung der aktuellen Elektrodenlänge durch den Messwert, abzüglich der ganzen Offsetwerte und der ursprünglichen Elektrodenlänge. Aber wieso berechnet man eine Elektrodenlänge, welche sich bspw. um 0,1mm verändern kann, mit DINT Werten? Damit gehen doch die Nachkommastellen verloren. Hier würden doch REAL viel mehr Sinn ergeben, da man Gleitkommazahlen hat?
Im DINT muss ja nicht zwangsweise die Länge in mm stehen, können ja auch zehntel-mm oder µm oder sonstwas sein. Macht man häufig so, dass die Nachkommastellen im DINT enthalten sind, also 1,234mm als REAL würde man im DINT als 1234 ablegen...
Der TAK befehl dient doch dafür, um die Werte in AKKU1 und AKKU2 für die Differenzberechnung zu tauschen oder?
vermutlich...
 
16.7 fragt das Vorzeichen ab, wenn der Wert <0 ist wird er auf 0 gesezt.
naja, vielleicht irgend sowas...

der DINT liegt im LD 16
L 16.7 ist aber nicht wirklich sowas wie nen Vorzeichen, aber naja ;)

und mit

Code:
L "E_WEG"
L DW#FF000000
OD

wirds auch nicht wirklich auf 0 gesetzt sondern ein Byte auf 16#FF, die restlichen 3 Byte bleiben so.
 
Ich habe trotzdem noch nicht allzuviel Programmiererfahrung. Da schaue ich mir natürlich gern bestehende Programme an und versuche aus diesen zu lernen.
dann lerne daraus, dass man kommentieren sollte, was man so zusammenprogrammiert ;)

PS, es ist auch großer Käse, absolut auf Lokaldatenvariablen zuzugreifen... Wenn jetzt jemand oben neue Temp-Variablen mittendrinn einfügt, funktioniert garnichts mehr... um ein Bit aus nem Doppelwort rauszuholen gibts schönere Varianten...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht mal anders :
Ich hattre mir den Code vorhin auch schon mal angesehen und aufgegeben. Der Programmierer, des das mal verzapft hat, gehört an die Wand gestellt (meine Meinung). Wenn du über den Code stoplerst so würde ich schauen was der im Ergebnis macht und das dann vernünftig (und dokumentiert) nachprogrammieren damit es verständlich wird ...
Ich würde sagen, dass selbst der ursprüngliche Programmierer dir nicht mehr auf Anhieb sagen kann warum er das so gemacht hat.
Und by the way : wie schon von @ducati erwähnt ist der absolute Zugriff auf Bits einer lokal definierten Variable ein ganz böses Foul !!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um bspw. das Vorzeichenbit auszulesen.

Nachtrag: arbeitest du mit Classic oder mit TIA ?

Eigentlich mit TIA.
Die aktuelle Steuerung würde bei einem Retrofit sowieso rausfliegen, deshalb möchte ich dort auch keine großen Änderungen vornehmen.
Ich versuche aber trotzdem den ursprünglichen Code vom Hersteller nachzuvollziehen, da ich mir dachte hier noch etwas draus lernen zu können.
Das vorhandene Programm zeigt mir aber eher, wie man es nicht programmieren sollte :D
 
Das vorhandene Programm zeigt mir aber eher, wie man es nicht programmieren sollte :D
Sorry ... aber ich würde das auch so sehen ...

Wenn du mit TIA arbeitest dann wären bei einem optimierten Baustein solche Sachen sowieso nicht mehr machbar (also das mit dem Bit in der Lokalvariablen). Wenn du dort etwas rechnen willst dann solltest du dir da immer ein SCL-Netzwerk einfügen - damit bekommt man eigentlich jede Berechnung verständlich umgesetzt ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hattre mir den Code vorhin auch schon mal angesehen und aufgegeben. Der Programmierer, des das mal verzapft hat, gehört an die Wand gestellt (meine Meinung). Wenn du über den Code stoplerst so würde ich schauen was der im Ergebnis macht und das dann vernünftig (und dokumentiert) nachprogrammieren damit es verständlich wird ...
Ich würde sagen, dass selbst der ursprüngliche Programmierer dir nicht mehr auf Anhieb sagen kann warum er das so gemacht hat.
naja, so schlimm ists nun auch wieder nicht, da hab ich schon deutlich schlimmeres gesehn.

1. zuerst wird der Messwert eingelesen und "manipuliert", warum steht da leider nicht
2. dann werden die Berechnungen ausgeführt, das sieht in AWL leider so aus, nicht wirklich schlimm, wenn man AWL etwas versteht. Nur leider steht da auch nicht, was genau berechnet wird.

Also unschön sind die fehlenden Kommentare und der Zugriff auf das Lokaldatenbit...
 
Zuletzt bearbeitet:
Ich habe trotzdem noch nicht allzuviel Programmiererfahrung. Da schaue ich mir natürlich gern bestehende Programme an und versuche aus diesen zu lernen.
Das ist durchaus ein gutes Mittel zum lernen, es besteht aber die Gefahr einen schlechten Stiel zu übernehmen, nutz eine offene Library wie OSCAT oder andere um zu lernen, diese sind optimiert und manchmal auch kommentiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde mal ins Handbuch des Weggebers schauen. Dann wird es vielleicht klarer.
Ich habe jetzt mal im Starter geschaut. Verbaut ist ein AM22DQA45 mit SMI20/DQI von Siemens.
Eingestellt ist eine Übertragung der Absolutwerte über das EnDat-Protokoll. Als Telegramm wird [999] Freie Telegrammprojektierung mit BICO verwendet.

Laut der Kontexthilfe sollte der Positionswert als Gray-Code codiert werden.
 
Zuletzt bearbeitet:
Das ist durchaus ein gutes Mittel zum lernen, es besteht aber die Gefahr einen schlechten Stiel zu übernehmen, nutz eine offene Library wie OSCAT oder andere um zu lernen, diese sind optimiert und manchmal auch kommentiert.
Also OSCAT als Beispiel für guten Programmierstil zu nehmen, würde ich persönlich für S7 so nicht unterschreiben. Man merkt ganz eindeutig, dass OSCAT primär für Codesys entwickelt wurde und dann auf S7 portiert wurde. Viele Ideen, die in OSCAT drin stecken, sind gut und kann man sich anschauen. Die meisten Bausteine haben aber so viele Abhängigkeiten, dass es recht schnell sehr unübersichtlich wird.
 
Zurück
Oben