TIA Baustein Aufrufe im OB1

Zuviel Werbung?
-> Hier kostenlos registrieren
Dieses Dokument kenne ich auch und da ist ganz klar zu sehen, das AWL nicht zu schlagen ist.
Bei AWL ist nur die Trickprogrammierung schneller. Klar ist eine Schiebeoperation schneller, als eine Multiplikationen. Das hat nichts mit der Sprache des Quellcodes zu tun. Zu S5 Zeiten habe ich das durchaus hin und wieder gemacht, so eine Trickprogrammierung ist in meinen Augen aber hochgradig unprofessionell.
Wer Trickprogrammierung einsetzen muss, hat vermutlich ein massives Layer 9 Problem.

Die Variante mit KOP/FUP ist auch nicht wirklich aussagekräftig, weil bei NORM_X und SCALE_X nach Real gewandelt wird. Hier müssten eigentlich die gleichen Integer-Operationen wie in AWL/SCL genutzt werden. Ich habe mal die Kombination aus NORM_X und SCALE_X, LIMIT, IN_RANGE mit dem in AWL geschriebenen alten NORM verglichen und bin auf vergleichbare Zeiten gekommen.

AWL wird nicht interpretiert, sondern wie die anderen Sprachen kompiliert. Was bei AWL AFAIK auf die Zykluszeit geht, ist indirekte Adressierung und anderer Registerkram, da die Register emuliert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei AWL ist nur die Trickprogrammierung schneller. Klar ist eine Schiebeoperation schneller, als eine Multiplikationen. (...) so eine Trickprogrammierung ist in meinen Augen aber hochgradig unprofessionell.
Bei der AWL-"Trickprogrammierung" besteht der Trick lediglich darin, daß in einem Rutsch (parallel) alle 8 Ausgänge berechnet und zugewiesen werden, anstatt jeden Ausgang einzeln zu behandeln, wodurch das Programm automatisch schneller ist. Das hat überhaupt nichts mit "Schiebeoperation ist schneller als eine Multiplikation" zu tun. Speziell diese Parallelverarbeitungs-"Trickprogrammierung" würde ich nicht als unprofessionell bezeichnen sondern als normale Anwendung von Grundalgorithmen.

Die Variante mit KOP/FUP ist auch nicht wirklich aussagekräftig, weil bei NORM_X und SCALE_X nach Real gewandelt wird.
Das stimmt allerdings, die Programmvarianten sind eigentlich kaum vergleichbar, wenn bei jeder Programmiersprache ein anderer Algorithmus verwendet wird.

Harald
 
..Das hat überhaupt nichts mit "Schiebeoperation ist schneller als eine Multiplikation"
Wenn ich SLD als Wortbefehl zähle und *D als Arithmetik, dann sind da schon ein paar Unterschiede vorhanden.
(bin mir aber unsicher ob SLD jetzt als Wort-oder Arithmetikbefehl bei Siemens zählt).:rolleyes:

Ausführungszeit.png
 
Für mich ist SLD 3 auch keine Trickprogrammierung. Für den, der Boolsche Techniken beherrscht ist das ganz normal.
Die meisten C-Compiler wandeln auch automatisch eine Ganzzahldivision / Multiplikation durch / mit einer Zweierpotenz in einen Schiebebefehl um, wenn das auf dem jeweiligen Prozessor schneller ist. Der Test ist auf jeden Fall völliger Nonsense, wenn man etwas vergleichen will, dann auch bitte die gleiche Programmierweise. Bei SCL kommt noch hinzu, ob beispielsweise in den Optionen "ENO" setzen aktiviert wurde, das ist bei FUP/KOP ja automatisch mit enthalten und macht das durch diese Zusatzfunktion eben langsamer, weil das eine Zusatzfunktion ist die AWL überhaupt nicht hergibt.
 
Warum ist in scl eine Wandlung von dint nach int drin?
Weil es wie bei AWL eine Ganzzahl-Rechnung sein soll, aber schon die erste Multiplikation mit 8 den Wertebereich von INT übersteigen kann. Deshalb muß die umständliche Rechnung als DINT gemacht werden, und zum Schluß soll das Ergebnis (0..9) ein INT sein.
Man könnte stattdessen auch einfach durch 3456 dividieren ... doch vermutlich sollte der Code nicht vorrangig effizient sein, sondern irgendwas vergleichbares darstellen, was der Autor in verschiedenen Programmiersprachen darstellen konnte. Abgesehen von dem Unfug mit dem NORM_X + SCALE_X, wo der Autor vielleicht nicht wußte, daß/wie man in KOP/FUP Ganzzahl-Berechnungen macht.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal ein interessantes Dokument ( vor allem auch wegen dem CEM )
Zykluszeit Vergleichsmessung
Hmmm.
"SLD 3 // alter S5 Trick --> mit 8 multiplizieren" :

Das ist kein Trick und es ist garantiert älter als S5!
Zum GrundWissen eines SPS-Programmierers sollte gehören, dass 2 * X = X + X ist und, dass dadurch jeweils das BitMuster um 1 Position nach links verschoben wird.

Nicht in allen S5-BefehlsSätzen gab es Befehle zum Multiplizieren oder gar Dividieren. Man musste auf SiemensStandardBausteine zurückgreifen oder selbst etwas basteln. Die o.g. (Er-)Kenntnisse waren beim SelbstBasteln einer Multiplikation sehr hilfreich.
Das LinksSchieben birgt aber die Gefahr, dass sich der Zustand des höchstwertigen Bits umkehren kann und somit (nicht nur) das Vorzeichen der Zahl wechselt: Überlauf!

Der UmkehrSchluss, dass zum Dividieren durch eine ZweierPotenz (2^n) "ganz einfach" das BitMuster um n Positionen nach rechts verschoben werden muss, ist allerdings trügerisch.
Wenn der SchiebeBefehl von links mit Nullen auffüllt, dann funktioniert es nur für positive Zahlen.
Wird jedoch beim Schieben nach rechts nicht grundsätzlich mit 0 aufgefüllt, sondern das höchstwerige Bit unverändert erhalten bleibt, dann funktioniert es auch für negative Zahlen bei der "ZweierKomplementDarstellung" dualer Zahlen.

Der eigentliche "(S5-)Trick" ist jedoch folgender:

Ich unterstelle, dass mit 'L AE_Slider1' ein INT-Wert (16Bit!) geladen wird.
Aus dem symbolischen Namen ist dies leider (für mich) nicht ersichtlich - L AWxxx oder L EWxxx oder L MWxxx oder L DWxxx wäre eindeutig.
Erst ab Programm3 ist es ohne nachzudenken klar.
Wenn man (z.B. in S5) einen INT-Wert in den 32BitAkku lädt und mit DoppelWortBefehlen weiterarbeitet (sofern verfügbar),
muss man dafür sorgen, dass
- entweder negative Werte negativ bleiben, statt zu grossen positiven Werten verfälscht zu werden
- oder negative Werte zu 0 machen, wenn negative Werte für den VerwendungsZweck so korrekt behandelt werden können.

Letzteres tut "Programm1: AWL mit TrickProgrammierung".
Kurzum: das Programm ist durch die wenigen Befehle sehr kurz und übersichtlich.
Ich kann in NullKommaNix erfassen, was es tut und, dass es korrekt arbeitet! ProgrammierTricks kann ich darin beim besten Willen nicht entdecken. Und es wird erst recht nicht "tief in die Trickkiste gegriffen".
"Nachvollziehbar ist dieser Code nur für die wenigsten." Weil die wenigsten jemals in AWL oder Assembler promrammiert haben?


Zu "Programm2: AWL ohne TrickProgrammierung":

Netzwerk 2: Es gibt viel zu lesen. Dennoch recht leicht zu erfassen und abzuhaken. Einverstanden, ist OK!
Netzwerk 1: Kurz und knapp. Aber OK?
NEIN! Trotz Grübelns kann ich keinen "Trick" entlarven, der für ein korrektes Verhalten beim Laden eines negativen Wertes sorgt.

Fazit: Die Behauptung "ohne TrickProgrammierung" ist also gerechtfertigt.
Programm2 ist umfangreicher als Programm1 und allein dadurch ein wenig schwerer (nicht leichter!) zu erfassen.
Es ist "einfacher" gestaltet, insofern auf eine (sinnvolle) Behandlung negativer Werte verzichtet wird.
ABER: Im Gegensatz zu Programm1 arbeitet es bei negativen Werten nicht korrekt!
Fehlende Funktionalität durch mehr Befehle bei geringfügig weniger Übersichtlichkeit! Worin soll der Vorteil liegen?


Zu "Programm3: KOP/FUP":

Netzwerk 2: Es gibt viel zu lesen. Dennoch recht leicht zu erfassen und abzuhaken. Einverstanden, ist "identisch" mit Programm2 und ist OK!
Netzwerk 1: Kurz und knapp. Aber OK? Ich weiss es nicht.
Schnell zu erfassen ist, dass negative EingangsWerte kein Problem sind (wegen INT -> REAL).
Ohne eine Beschreibung und ohne Einblick in den Baustein 'NORM_X Int to Real' und ohne die Möglichkeit, ihn testen zu können, kann ich nur hoffen, dass die Parametrierung seines Eingangs MIN mit 0 genau das tut, was auch in Programm1 geschieht und was in Programm2 geschlampert wurde.
Edit: letzten Satz gestrichen, da er wegen des vorausgehenden Satzes gegenstandslos und verwirrend ist.

Zu "Programm4: SCL":

Abschnitt 2 ("Netzwerk 2") "// Ausgänge ansteuern" :
Schnell zu erfassen und abzuhaken. Einverstanden, ist "identisch" mit Programm2 und Programm3 und OK!
Abschnitt 1 ("Netzwerk 1") "// Analogwert einlesen und normieren (0..10V -> 0..27648 -> 0..8)":
Kurz und knapp. Aber OK? Ich weiss es nicht.
Genügt die Multiplikation mit DINT#8, um den Compiler dazu zu bewegen, "AE_Slider1" implizit von INT in DINT zu konvertieren?
Wenn ja, alles gut und ich hätte trotzdem lieber ' DINT#8 * "AE_Slider1" ' an Stelle von ' "AE_Slider1" * DINT#8 ' geschrieben
und noch lieber '#l_iTemp := DINT_TO_INT(INT_TO_DINT("AE_Slider1") * 8 / 27648);'.


Zu "Programm5: CEM":

Anderer Lösungsweg als bei Programm1 bis Programm4. Dieser Lösungsweg hätte auch bei den Programmen 2..4 beschritten werden können und die FussAngel der negativen EingangsWerte wäre damit vermieden worden:
Statt zu normieren, werden einfach die 8 Vergleichswerte ausserhalb des Programms entsprechend berechnet und als Konstanten in das Programm eingetragen (= "ProgrammierTrick"?).
Warum aber das CEM-Programm sooo viel langsamer ist als alle anderen Varianten, kann ich mir Mangels Kenntnissen über CEM nicht erklären.
Selbst eine S5-Variante von Programm2 dürfte mindestens doppelt so schnell sein - trotz Interpreter statt Compiler.
 
Zuletzt bearbeitet:
Hmmm.
"SLD 3 // alter S5 Trick --> mit 8 multiplizieren" :

Das ist kein Trick und es ist garantiert älter als S5!


"Nachvollziehbar ist dieser Code nur für die wenigsten." Weil die wenigsten jemals in AWL oder Assembler promgrammiert haben?
Wenn mir jemand, der sich SPS Programmier nennt, nicht erklären kann was "SLD 3" bewirkt, würde ich
den bei mir nicht programmieren lassen.
 
Hier mal ein interessantes Dokument ( vor allem auch wegen dem CEM )
Zykluszeit Vergleichsmessung
S7-1500-Analogeingänge "0-10V" liefern nominal die Werte 0..27648, können aber durch Untersteuerung und Übersteuerung und Messungenauigkeit Werte von -32768 .. +32767 liefern (in den Programmen die Variable %EW10 "AE_Slider1", die anscheinend als INT deklariert ist). Klar, für eine reale Steuerungsanwendung sollten die negativen Werte behandelt/unterdrückt werden. Hier bei der Programmvergleichs-Aufgabe müssen die möglichen negativen Werte aber in FUP/KOP/SCL/CEM nicht besonders behandelt oder korrekt skaliert werden, Hauptsache die skalierten Werte ergeben wieder negative Werte oder 0, weil die niedrigste Vergleichsstufe ">= 1" ist. Alles was < 1 liefert ist uninteressant und führt korrekt dazu, daß keine Leuchte leuchtet.

Bei AWL scheint sich der Autor allerdings nicht gut auszukennen, so daß er vielleicht davon ausging, das sich andere Programmierer wohl auch nicht gut auskennen ;) und was über einfache Standards hinausgeht wird als "Trickprogrammierung" bezeichnet. Das Programm 1 "AWL-Trickprogrammierung" hat ihm vielleicht ein AWL-Spezialist zugearbeitet? Das Programm 2 "AWL ohne Trickprogrammierung" hat vielleicht eine andere Person programmiert, die vergessen hat den Code mit negativen Eingangswerten zu testen? Prompt liefert der Code bei negativen Eingangswerten das falsche Ergebnis "alle Leuchten EIN" :oops: weil AWL nämlich nicht automatisch Datentypen konvertiert (z.B. INT nach DINT erfordert explizit eine ITD-Anweisung), da muß der Programmierer selber genau wissen was er tut und was AWL tut.

In dem Vergleichsdokument sollte allerdings vorrangig die Ausführungszeit bei ungefähr gleich aussehenden Lösungen in verschiedenen Programmiersprachen verglichen werden. Korrektheit der Lösungen war nicht so wichtig. Leider wurde da auch noch die FUP-Lösung künstlich verschlechtert ... vielleicht sollte das vom Autor bevorzugte SCL als Sieger hervorgehen? und die viel schnellere AWL-Lösung 1 musste als in der Praxis nicht nachvollziehbare "Trickprogrammierung" abgetan werden.

Merkwürdig ist, daß die Messungen an einem Sonntag 10.1.2021 mit TIA V17 Update 2 gemacht worden sein sollen. TIA V17 gibt es aber erst seit Mai 2021, das Update 2 seit Dezember 2021. Die PDF-Datei wurde anscheinend am 10.1.2022 erstellt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Harald,
was konkret meinst Du mit ...
Leider wurde da auch noch die FUP-Lösung künstlich verschlechtert ...
...?
- Den "Umweg" über GleitKommaArithmetik?
- Oder die Verwendung der möglicherweise "oversized" Bausteine NORM_X und SCALE_X?
- Oder den "Umweg" über die Umrechnung des EingangsWertes auf die Zahlen 0..8 (die bei Programm2 "AWL o. Tricks" und Programm4 "SCL" so vermeidbar gewesen wäre, wie es in Programm5 "CEM" demonstriert wird und auf die nur Programm1 wirklich angewiesen ist)?
- Oder ... ?

Gruss, Heinileini
 
Ich meine die unnötige Verwendung von NORM_X + SCALE_X und der damit verbundene Umweg über Gleitkomma, anstatt einer einfachen Ganzzahl-Division durch 3456 (oder wie bei SCL einer Ganzzahl-Multiplikation mit 8 und anschließenden Division durch 27648).

Gruß, Harald
 
Die Vergleichsmessung habe ich bereits vor ein paar Jahren durchgeführt und Anfangs dieses Jahres wegen der neuen Programmiersprache CEM
überarbeitet.
NEWS: Vergleichsmessung TIA-Portal-Programmiersprachen
Nach diesem News hat mich bereits ein Siemens Mitarbeiter aus der Schweiz darauf hingewiesen, dass die Vergleichsmessung mit NORM_X und SCALE_X nicht vergleichbar ist. Die Messung habe darum anschliessend noch erweitert.

Weitere Siemens Bemerkung
Ziel von CEM ist nicht die Geschwindigkeit, sondern intuitive graphische Darstellung von Zusammenhängen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weitere Siemens Bemerkung
Ziel von CEM ist nicht die Geschwindigkeit, sondern intuitive graphische Darstellung von Zusammenhängen.
:unsure: Das kann ich als Argument bezüglich der AusführungsGeschwindigkeit überhaupt nicht verstehen. :unsure:
Die Umsetzung einer "intuitiven graphischen Darstellung" in ein compiliertes oder auch in ein zu interpretierendes Programm mag noch so aufwändig und zeitraubend sein ... aber was wird denn bei CEM für ein Code aus der graphischen Darstellung gebastelt, dass sich seine Ausführung sooo un-performant gestaltet??? So viel nutzlosen und die Funktion nicht beeinträchtigenden OverHead kann man doch nicht allen Ernstes dazuerfinden? :unsure:
Das gezeigte AnwendungsBeispiel ist so was von trivial und eigentlich nur eine gründlich abgespeckte Version der Programme 2 bis 4 (AWL ohne Tricks, KOP/FUP, SCL). Acht Vergleiche eines eingelesenen Wertes mit acht verschiedenen Konstanten. Ich versteh die Welt nicht mehr ... :mad:
 
NEWS: Vergleichsmessung TIA-Portal-Programmiersprachen
Nach diesem News hat mich bereits ein Siemens Mitarbeiter aus der Schweiz darauf hingewiesen, dass die Vergleichsmessung mit NORM_X und SCALE_X nicht vergleichbar ist. Die Messung habe darum anschliessend noch erweitert.
Woher kommt eigentlich daß in der Januar-Version AWL und SCL gleich schnell waren und in der Februar-Version mit dem selben Programmcode AWL ca 8% langsamer als SCL war?

Harald
 
Woher kommt eigentlich daß in der Januar-Version AWL und SCL gleich schnell waren und in der Februar-Version mit dem selben Programmcode AWL ca 8% langsamer als SCL war?

Harald
Das weiss ich leider nicht mehr. Ich habe einfach einen neue Messung durchgeführt und die Werte notiert. Vielleicht lag es an der Temperatur :)
 
Zurück
Oben