TIA Fragen zu Konstanten

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
16.537
Reaktionspunkte
6.121
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich hätte da mal zwei Fragen zu Konstanten.

  1. Kann man Konstanten auch Strukturieren?
  2. Kann man Konstanten auch System übergreifend verwendet, entsprechend dem TIA Prinzip, dh. kann ich Konstanten aus der PLC in der HMI nutzen?

Wenn nicht warum nicht?

gruß RN
 
Hallo,
ich hätte da mal zwei Fragen zu Konstanten.

  1. Kann man Konstanten auch Strukturieren?
  2. Kann man Konstanten auch System übergreifend verwendet, entsprechend dem TIA Prinzip, dh. kann ich Konstanten aus der PLC in der HMI nutzen?

Wenn nicht warum nicht?

gruß RN
1. Leider nicht möglich, da eine Konstante nur die Basis Systemtypen verwenden kann. Es ist jedoch möglich Anwenderkonstanten in verschiedenen Variablentabellen anzulegen und quasi so eine Struktur aufzubauen, so habe ich es auch gemacht.

2. Ebenfalls nicht möglich, da Siemens die Konstanten (Egal ob Anwender- oder Bausteinkonstanten) nur innerhalb der CPU zur Verfügung stellt. Wird leider in Zukunft auch so bleiben. :roll:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

  1. Kann man Konstanten auch System übergreifend verwendet, entsprechend dem TIA Prinzip, dh. kann ich Konstanten aus der PLC in der HMI nutzen?

Genau aus dem Grund verwalte ich meine Konstanten immer in einem per UDT im FB mit IDB. Dann kann ich meine Konstanten überall nutzen und sie liegen in Strukturen vor.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Leider nicht möglich, da eine Konstante nur die Basis Systemtypen verwenden kann. Es ist jedoch möglich Anwenderkonstanten in verschiedenen Variablentabellen anzulegen und quasi so eine Struktur aufzubauen, so habe ich es auch gemacht.

Das hilft schon einmal weiter. Danke.
 
Wo genau ist denn der Unterschied? Bekommt nicht jede Konstante auch Ihren Namen und wird darüber angesprochen?
Oder macht die Adresse eine Variable zu dieser?
 
Wo genau ist denn der Unterschied? Bekommt nicht jede Konstante auch Ihren Namen und wird darüber angesprochen?
In den "guten alten Zeiten", als ROM noch ROM und RAM noch RAM war (und beides unerschwinglich), da konnte man das noch plausibel erklären.
Variablen sind SpeicherPlätze, in die per Programm Werte geschrieben werden. Beim Laden des Programms ist ihr Inhalt noch "jungfräulich". Normalerweise sind sie dann "gelöscht" und enthalten 0 oder Leerstrings.
Konstanten sind "in Stein gemeisselt" und können per Programm nur gelesen werden.
Gruss, Heinileini
 
Er macht Quasi aus Konstanten Variablen, weil er von TIA dazu genötigt wird.

Ist halt ein Krücke, richtig laufen kann man damit nicht.
Riesen Krücke, denn mit Variablen kann man ja z.B. keine Arrays deklarieren oder CASE "bestücken".


Wo genau ist denn der Unterschied? Bekommt nicht jede Konstante auch Ihren Namen und wird darüber angesprochen?
Oder macht die Adresse eine Variable zu dieser?
Konstanten werden IMHO bereits beim Übersetzen durch ihren Wert ersetzt und belegen somit nur Programmplatz, während Variablen erst zur Laufzeit durch ihren Wert ersetzt werden und nicht im Programm- sondern Variablenspeicher beheimatet sind.
 
Der Styleguide empfiehlt hinscihtlich Konstanten:
Anhang anzeigen 41108

Den Zwang Konstanten nur Lokal anzulegen, halte ich nicht Zeitgemäß, wenn ich
jetzt zb. für eine Servoachse die Fehlernummern in Konstanten legen möchte, muss
ich die evtl an zig stellen anpassen. Wenn ich diese Konstanten in unterschiedlichen
Anwendungen oder Programmteilen nutzen möchte.

Mann braucht schon einmal Globale Konstanten, die Systemweit gelten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Ansatz von Helmut ist für mich schon durchaus nachvollziehbar. Das ist das, was man in der Hochsprachen-Programmierung Enumeration nennt. Die Allermeißten Entwicklungssysteme kennen und unterstützen das. Von daher ist der Gedanke, das Siemens so etwas vielleicht auch haben könnte, für mich absolut nicht abwegig. Soweit ich da nicht komplett falsch liege ist das etwas, dass es in der CodeSys- / TwinCat-Welt sogar genauso gibt ...


Gruß
Larry
 
Den Zwang Konstanten nur Lokal anzulegen, halte ich nicht Zeitgemäß, wenn ich
jetzt zb. für eine Servoachse die Fehlernummern in Konstanten legen möchte, muss
ich die evtl an zig stellen anpassen. Wenn ich diese Konstanten in unterschiedlichen
Anwendungen oder Programmteilen nutzen möchte.

Mann braucht schon einmal Globale Konstanten, die Systemweit gelten.
Na immerhin kann man global für eine CPU anlegen (auch wenn das dem Styleguide widerspricht).
Gerade bausteinübergreifende Arraygrößen deklariere ich nur so.
 
Na immerhin kann man global für eine CPU anlegen (auch wenn das dem Styleguide widerspricht).
Gerade bausteinübergreifende Arraygrößen deklariere ich nur so.

An Deinen Beispiel kann es doch gerade Sinnvoll sein Konstanten Global anzulegen,
wenn du jetzt mit einen Baustein in das Array schreiben und mit einem anderen lesen
möchtest, hieße es ja nach dem Styleguide das du für jeden Baustein
eigene Arraygrenzen als Konstante anlegst und damit die Konstanten absurd sind.
Da kann ich ja gleich Variablen nutzen die ich mit festen Startwerten beschreibe, wie
in der Classic Welt.
 
Da haben wir's doch: die festen Startwerte! Das sind die Konstanten!

Sind sie nicht. Das sind Variablen mit festen Startwerten die man im Programm auch überschreiben kann.
Mit konstanten hingegen, kann man auch arraygrenzen, label und dergleichen beschreiben. Konstanten sind beim übersetzen schon definiert und das kompilat kann sich schon darauf beziehen (grösser oder kleiner werden)

Mit freundlichen Grüßen René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bezüglich Arraydefinition.
Die werden bei uns aus übersichtlichkeits Gründen meistens von 0 bis Konstante definiert. Und diese Konstanten sind global.
Übergabe und Abfrage erfolgt dann aber als variables Array[*].
Werden Strukturen als Konstanten gebraucht werden diese im jeweiligen Baustein dann zuoberst Initialisiert und passt.
 
Bezüglich Arraydefinition.
Die werden bei uns aus übersichtlichkeits Gründen meistens von 0 bis Konstante definiert. Und diese Konstanten sind global.
Übergabe und Abfrage erfolgt dann aber als variables Array[*].
Werden Strukturen als Konstanten gebraucht werden diese im jeweiligen Baustein dann zuoberst Initialisiert und passt.

mag ja sein das es bei euch so Funktioniert, das entspricht aber nicht meiner Vorstellung von Konstanten.
bei Arrayfldern kann es ja sein das ein Teil des Feldes für eine bestimmten Funktion Reserviert ist und der
Rest für eine andere und dann spielt man den Vorteil der Konstanten aus, indem man dieses in Stein (bzw. Speicher) meiset.

Wenn ich irgendwelche Variablen Initalisiere, sind das für mich keine Konstanten.

Da haben wir's doch: die festen Startwerte! Das sind die Konstanten!
dto.
 
Aus wenn's dem Styleguide widerspricht und nicht die von Siemens vorgesehene Vorgangsweise ist:

Ich verwende für unser Servo-Treiber Paket eine Kombination aus PLC-Konstanten und dem "Variablen-Ansatz", der in etwa so aussieht:

1. Konstanten, welche zur Konfiguration von Array-Größen notwendig sind, sind als PLC-Konstanten definiert (im Moment 12 Stück, wobei i.d.R. nur 3 oder 4 davon vom Anwender angepasst werden müssen).
2. Alle "Konstanten" liegen in einem schreibgeschützten, flüchtigen globalen DB, der von einem PLC-datentyp ("typeConsts") abgeleitet ist.
3. Diesen PLC-Datentyp kann man nun beliebig strukturieren - ich arbeite grundsätzlich nicht mit STRUCT sondern mit weiteren Unter-Datentypen, deren Namen entsprechend hierarchisch aufgebaut sind.
4. Um das Aktualisieren zu erleichtern, wird die ganze Geschichte in einer externen Quelle verwaltet. Dies erleichtert auch das Zuweisen von Startwerten in Arrays.
5. In dieser Quelle ist auch die Definition des DB drinnen, womit die Attribute "schreibgeschützt" und "non-retain" sauber gesetzt werden.
6. Auf die PLC-Konstanten wird im PLC-Programmcode nicht zugegriffen - für sie existiert eine extra Struktur im DB, deren Elemente als Startwert die jeweiligen Konstanten enthalten.

Der Ansatz ist fast 1:1 auch auf Rockwell-Steuerungen umsetzbar - lediglich die Definition der Array-Grenzen muss ich dort manuell machen und Quellen gibts halt keine.

Bei der Codegestaltung sind halt dann ein paar Einschränkungen zu beachten:
- mit meinen "Konstanten" können halt keine Case-Anweisungen versorgt werden - es gibt nur if-elsif-else-kaskaden
- bei Rockwell muss man den "DB" als Controller-Tag anlegen und an alle AddOns per Constant-Inout durchreichen - was aber bei aktueller Hardware echt kein Problem mehr ist.

Dieser Ansatz erfreut sich mittlerweile auch bei den Applikationisten einer gewissen Beliebtheit.

Will man den Ansatz ohne externe Quellen und/oder ohne UDTs durchziehen, ist das auch kein Problem. Will man nur Werte (also Startwerte) verändern, muss man halt eine strukturelle Änderung des DB erzwingen dass er neu geladen wird.

lg
 
Zurück
Oben