TIA TIA Compiler

Fluffi

Level-2
Beiträge
532
Reaktionspunkte
88
Zuviel Werbung?
-> Hier kostenlos registrieren
Wird durch den TIA Compiler eigentlich ein Code, der durch ein false "deaktiviert" und logisch nicht mehr zu einem Ergebnis bei der Zuweisung außer false führen kann durch das Kompilieren in Maschinensprache so umgesetzt, dass die CPU hier die einzelnen Abfragen nicht mehr durchführt? Vorausgesetzt, der Code wird nicht beobachtet, denn da lässt sich sehen, dass es nicht so ist. Daher gehe ich eigentlich auch generell davon aus, dass dem grundsätzlich nicht so ist, aber genau weiß ich es nicht, daher frage ich hier lieber mal nach. (AWL hier nur aus Beispielzwecken)

U false
U Var1
U Var2
...
= Var3


Was ist wenn eine Zuweisung nur mit false erfolgt?
U false
= Var3


Wenn man aus Gründen der Zykluszeititoptimierung auf folgende Weise mit Zeitimpulsen arbeitet, wird der Code so intelligent kompiliert, dass nach der ersten fehlenden Bedingung abgebrochen wird?
U Zeit-Impuls
U Var1
U Var2
...
S Var3
 
Also im Code werden schon alle Zeilen betrachtet und abgearbeitet, auch wenn es ersichtlich ist, dass das UND schon anhand der ersten Bedingung nur ein FALSE liefern kann. Außer du arbeitest mit Sprüngen.

Wenn du sowas hast:
Code:
U E0.1 = False
U E0.2 = True
U E0.3 = True
= A0.0 = False
Ist das von der Verarbeitungszeit nicht das Selbe wie:
Code:
U E0.1 = False
= A0.0 = False

Das selbe mit deinen Zeiten.
Wenn du die Bearbeitungszeit der darunterliegenden Zeilen einsparen möchtest, musst du diese in dem Fall bedingt überspringen:

Code:
      U Zeit_Impuls = False
      SPBN M001
      U E0.4 = True
      U E1.5 = False
M001: = A4.0 = False
 
@PeterPan-35: Ich meine mit false keinen Eingang der ein false aufweist, sondern wirklich ein echtes false im Code. In anderen Programmiersprachen werden solche Konstrukte je nach Kompilereinstellung intelligent kompiliert. Daher frage ich nach. Bei Eingängen ist mir es schon klar, dass es nicht geht.

AWL war hier vielleicht auch ein schlechtes Beispiel, da ich hier natürlich auch Sprünge verwende, zumindest als ich noch AWL benutzt habe. Meine Frage war unabhängig der TIA Programmiersprache gemeint.
 
Heute ists ja ein Compler früher wars ein Interpreter meine ich.
Trotzdem kann es nicht sein.Er zeigt ja im AWL den Status an.Das könnte er ja nicht, wenn er so wie du denkst arbeitet.
Ausser bei TIA ist das anderst, was mich wundern würde.
 
Nein.Aber ist gut das ich das jetzt mal aus deinem Mund höre.Erzählt mir ständig ein alter MSR-Kollege.
Ich habe mich mit ihm auch schon gestritten.
 
Siehe auch diesem älteren Post.

Moin alle zusammen,

letzte Tage bin ich auf folgendes Forum von Siemens gestoßen:

https://www.automation.siemens.com/...how.aspx?HTTPS=REDIR&PostID=74265&language=de

Dort wird auf die "Bearbeitungsarten" der CPUs eingegangen. In dem Forum werden die kommenden Aussagen getroffen:

Faustregel:

Die S7-300 CPUs sind Interpreter.
Die S7-400 CPUs sind Compiler.

"The control processor of the S7-300 CPU modules (except the CPU 318 ) is a micro-controller which converts the MC7 code of the user program to its own machine language...
The CPU 318 modules and the CPU modules for the S7-400 can process the user programm directly by means of a specific ASIC circuit..."

Sagt der englische Text nicht aus, dass bei 300er CPUs der MC7 Code in eine eigene Maschinensprache übersetzt (kompiliert) wird? Schneidet sich dies nicht dann mit der oben erwähnten Faustregel?
Oder lieg ich gerade total falsch?

Im voraus schonmal vielen dank für eure Antworten.

Gruß Oele
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin sps_klassik,

der Link funktioniert (bei mir) nicht.

Also, dass S7-300 CPUs Interpreter sein sollen ist nicht glaubhaft. Warum muss man in Step7 den Code übersetzen (=> compilieren)?
Interpreter würden doch den Quellcode nehmen und dann zur Laufzeit Zeile für Zeile übersetzen. Damit man "unter der Hand" den Quellcode ändern kann und der Prozessor diese Änderung erstmal gar nicht mitbekommt.

Vielleicht kommt diese Idee daher, dass man die S7-300 ruckfrei (d.h. ohne Stop) laden kann? Das wird aber über andere Mechanismen gelöst. Der Code wird trotzdem compiliert und dann in die Steuerung geladen.

Dabei ist die CPU selber ja weder Interpreter noch Compiler. Denn das Compilieren geschieht ja in der Entwicklungsumgebung durch "Übersetzen". Und dann wird das übersetzte Programm in die CPU geladen.
 
@PeterPan-35: Ich meine mit false keinen Eingang der ein false aufweist, sondern wirklich ein echtes false im Code. In anderen Programmiersprachen werden solche Konstrukte je nach Kompilereinstellung intelligent kompiliert. Daher frage ich nach. Bei Eingängen ist mir es schon klar, dass es nicht geht.

AWL war hier vielleicht auch ein schlechtes Beispiel, da ich hier natürlich auch Sprünge verwende, zumindest als ich noch AWL benutzt habe. Meine Frage war unabhängig der TIA Programmiersprache gemeint.
Ob Eingang oder direkt ein konstantes False ist egal, macht keinen Unterschied.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ob Eingang oder direkt ein konstantes False ist egal, macht keinen Unterschied.
D.h. selbst ein
U false
= Var
wird noch verarbeitet, egal ob FUP,AWL,SCL und auch bei 1500er CPUs?
Oder anders gesagt, es findet beim Kompilieren bzw. Übersetzen in MC7 Code, keine Optimierung statt, sondern es wird einfach 1:1 der Code durchgegangen?
 
Hier mal ein Analyst:

The VERY technical answer is that all the languages are interpreted.
Why? Well because the PLC firmware is actually running a virtual machine which runs "emitted code".
We designed our OEM control system in the early 1980's in a very similar manner.
When you "compile" code on the programming software, regardless of the chosen language, it all ends up as MC7 code. The is code that is interpreted by the virtual machine (VM) in the firmware that is running a RTOS scheduler. The VM has actual machine code instructions for the CPU that handle particular MC7 operations (e.g. variable assignment, data movement / copying, comparison operations function calls etc.). The MC7 code consists of the runtime address of the machine code routine to handle a particular instruction followed by any data / parameters needed for that instruction.
For example, say we have the line IF X > 45.7 THEN X := Y END_IF;
The "emitted" MC7 code would look something like this:
runtime address for 'IF' machine code routine
"greater than" token
the encoded value 45.7 (4 bytes in IEEE754 format)
a jump to the next instruction address after IF statement (for when condition is not satisfied)
runtime address of the assignment machine code routine
the address of variable 'X'
the address of variable 'Y'
runtime address of the next instruction
The scheduler calls the machine code routine to handle the instruction. Control then passes to the called machine code routine It will run the instruction, advancing a VM program counter through the list of MC7 emitted code and performing the necessary actions required to implement the instruction. When it gets to the end of the instruction it will pass control back to the scheduler. The scheduler will then move onto the next machine code routine and the process repeats.
I know all this as I actually reverse engineered some of the MC7 code a few years back when I was bored and I could see the emitted code structure. I couldn't fully decode it as I did not have the runtime addresses of the machine code functions or where the symbols (variables) are held. Although given enough time, I could have worked those out.

Last edited by: smiffy at: 10/19/2021 17:56:54​

Last edited by: smiffy at: 10/19/2021 20:26:27​

Programming today is the race between software engineers building bigger and better idiot proof programs, and the universe producing bigger and better idiots.

So far, the universe is winning..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal ein Analyst:

The VERY technical answer is that all the languages are interpreted.
Why? Well because the PLC firmware is actually running a virtual machine which runs "emitted code".
We designed our OEM control system in the early 1980's in a very similar manner.
When you "compile" code on the programming software, regardless of the chosen language, it all ends up as MC7 code. The is code that is interpreted by the virtual machine (VM) in the firmware that is running a RTOS scheduler. The VM has actual machine code instructions for the CPU that handle particular MC7 operations (e.g. variable assignment, data movement / copying, comparison operations function calls etc.). The MC7 code consists of the runtime address of the machine code routine to handle a particular instruction followed by any data / parameters needed for that instruction.
For example, say we have the line IF X > 45.7 THEN X := Y END_IF;
The "emitted" MC7 code would look something like this:
runtime address for 'IF' machine code routine
"greater than" token
the encoded value 45.7 (4 bytes in IEEE754 format)
a jump to the next instruction address after IF statement (for when condition is not satisfied)
runtime address of the assignment machine code routine
the address of variable 'X'
the address of variable 'Y'
runtime address of the next instruction
The scheduler calls the machine code routine to handle the instruction. Control then passes to the called machine code routine It will run the instruction, advancing a VM program counter through the list of MC7 emitted code and performing the necessary actions required to implement the instruction. When it gets to the end of the instruction it will pass control back to the scheduler. The scheduler will then move onto the next machine code routine and the process repeats.
I know all this as I actually reverse engineered some of the MC7 code a few years back when I was bored and I could see the emitted code structure. I couldn't fully decode it as I did not have the runtime addresses of the machine code functions or where the symbols (variables) are held. Although given enough time, I could have worked those out.

Last edited by: smiffy at: 10/19/2021 17:56:54​

Last edited by: smiffy at: 10/19/2021 20:26:27​

Programming today is the race between software engineers building bigger and better idiot proof programs, and the universe producing bigger and better idiots.

So far, the universe is winning..
Das ist ja interessant (und ist komplett neu für mich).
 
Der Code wird optimiert und geändert.
Beispiel, aus einem
Code:
L DB10.DBW50
wird z.B.
Code:
AUF DB10
L DBW50
Das ist aber eher eine fest hinterlegte programmiertechnische "Optimierung". Auf logischer Ebene findet allerdings nichts statt?

Was die Interpreter Diskussion angeht würde ich sagen, dass gem. dem Analyst man das auf unterster Ebene so vielleicht definieren kann, aber es halt sehr stark in Konflikt steht, wie sonst Systeme mit echten Interpretern oder Interpreter-Sprachen aufgebaut sind und was hier an zusätzlichem Aufwand rechentechnisch geleistet werden muss
 
Das zur Laufzeit der letzte Schritt interpretiert wird, ist vorstellbar.In Nullen und Einsen direkt übersetzen?
Das ist der letzte Schritt zum Assembler dann.Mann meint glaube ich landläufig halt die Scriptsprache wo vorkompiliert wird.
Da glaube ich schon das es stimmt was du sagts.Basic war ja ein echter Interpreter in diesem Sinne.
Aber so hat der Kollege das ja nicht gemeint.
 
Wird durch den TIA Compiler eigentlich ein Code, der durch ein false "deaktiviert" und logisch nicht mehr zu einem Ergebnis bei der Zuweisung außer false führen kann durch das Kompilieren in Maschinensprache so umgesetzt, dass die CPU hier die einzelnen Abfragen nicht mehr durchführt?
Dies ist ja eine Zuweisung. Dein Code-Beispiel hat "=" welche den VKE übergibt, egal ob FALSE oder TRUE. Deswegen wird es immer ausgeführt.
Dasselbe gelt in KOP wenn man eine Spule ----( ) hat.

Ich lese dein Code der durch ein false "deaktiviert" ist, als eine Missverständniss.
Wenn man Zeilen von Code deaktivieren will geht es nur mittels überspringen, nicht mit Verknüpfung mit eine FALSE.
 
Dies ist ja eine Zuweisung. Dein Code-Beispiel hat "=" welche den VKE übergibt, egal ob FALSE oder TRUE. Deswegen wird es immer ausgeführt.
Dasselbe gelt in KOP wenn man eine Spule ----( ) hat.

Ich lese dein Code der durch ein false "deaktiviert" ist, als eine Missverständniss.
Wenn man Zeilen von Code deaktivieren will geht es nur mittels überspringen, nicht mit Verknüpfung mit eine FALSE.
So ist es(y)
 
Zurück
Oben