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