TIA optimierten DB 'Nullen'

volker

Supermoderator
Teammitglied
Beiträge
5.805
Reaktionspunkte
1.027
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

CPU ist eine 1500er
Ich möchte in einen optimierten DB alle Variablen auf 0 setzen.
Bei nicht optimierten mache ich das ganz einfach mit sfc21 (fill).
Aber wie kriege ich das bei optimierten Bausteinen hin ohne das ich jede Variable seperat neu beschreiben muss?
Ich könnte natürlich eine 2te Struktur anlegen mit Null-Daten aber das gefällt mir nicht wirklich. Verbraucht unnötig Speicherplatz.
Der DB enthält eine Struct und darin unterschiedliche Datentypen.

z.b.
Code:
sendedaten   struct
    ID_Nr         string[10]
    Hoehe        real
    LongDT      ldt
fülle ich das mit 0 über sfc21 haben einige datentype natürlich ein ungültiges format.
Das ist mir aber erstmal egal. Besser ein ungültiger Typ als ein falscher Wert.
 
Ich könnte natürlich eine 2te Struktur anlegen mit Null-Daten aber das gefällt mir nicht wirklich. Verbraucht unnötig Speicherplatz.
Der muss aber nicht remanent sein und macht so selbst bei 'ner S7-1200 nur geringfügig was aus.
Als PLC-Variable angelegt muss man sich auch nicht um die Nachführung/Anpassung bei Änderungen kümmern, der "Null"-Speicher muss nicht unbedingt 0 sein und das "Nullen" ist in jeder Sprache eine einfache Zuweisung/Move.

Daher hab' ich mich für diese Variante entschieden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Definiere deine Variablen in einem UDT statt einem struct und du kannst einen FC schreiben, der eine temporäre Variable des UDT definiert (mit Default-Werten) und damit die UDT-Instanz im DB überschreiben.
 
die daten sind in einem udt also als datentyp angelegt. obiges war nur als beispiel gedacht.
im db ist dann der datentyp.
kannst du mal ein bisschen code schreiben wie du das meinst.
 
Ich vermute mal so etwas wie:
Code:
VAR_TEMP
  null_udt: "myUdt";
END_VAR

BEGIN

IF #init THEN
  "DatenDB".daten := #null_udt;
END_IF;

Der Baustein muss dafür aber "optimiert" sein, weil nur dann Temp-Variablen mit Null initialisiert werden. Ansonsten kannst du auch in einem anderen DB eine Initialisierungs-UDT Instanz ablegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wobei ich gerade nicht weiß, wie denn dann Strings initialisiert werden. Denn wenn dort in jedem Byte eine Null steht, dann auch in dem Byte für die Maximallänge. Dann würden alle String-Funktionen wie Concat nicht mehr funktionieren, weil diese feststellen dass der String max. 0 Zeichen lang sein darf.
Das würde ich auf jeden Fall nochmal prüfen.
 
... Der DB enthält eine Struct und darin unterschiedliche Datentypen. ...
... fülle ich das mit 0 über sfc21 haben einige datentype natürlich ein ungültiges format. ...
Ich kann mir bestenfalls vorstellen, dass der Compiler meckert, wenn man versucht, die DatenBytes mit Nullen aufzufüllen.
Die Struktur bzw. die DatenTypen werden aber dadurch nicht beeinflusst und nicht geändert!?!
Wer sollte sich daran stören, wenn z.B. in den StringBytes 00h steht, statt z.B. 20h?
Die Definition der Struktur bzw. der DatenTypen ist doch nicht in den Bytes gespeichert, die Du mit 0 überschreibst - Du überschreibst damit doch nur den Inhalt der Daten verschiedener DatenTypen.

Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Werden die Variablen nicht mit den Werten initialisiert, die im udt angegeben sind?
Muss ich noch mal testen.
Udt mit TRUE-Bool angelegt und wird im Temp-Bereich (zumindest im Sim) auch so initialisiert.
Bin der Meinung, das irgendwann auch schon mal real mit dem gleichen Ergebnis getestet zu haben.
 
Ich habs gerade auch getestet und festgestellt, dass eine UDT im Temp mit den Startwerten initialisiert wird. Obwohl die Spalte Defaultwert überhaupt nicht aktiv ist und die Werte nicht angezeigt werden.
Wieder eine Ausnahme mehr die man sich merken muss, konsistenter wäre hier m.M.n. alles auf Null gewesen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wobei ich gerade nicht weiß, wie denn dann Strings initialisiert werden. Denn wenn dort in jedem Byte eine Null steht, dann auch in dem Byte für die Maximallänge.
Dann würden alle String-Funktionen wie Concat nicht mehr funktionieren, weil diese feststellen dass der String max. 0 Zeichen lang sein darf.
Meines Wissens steht "in dem Byte für die Maximallänge" nicht, wie lang er sein darf, sondern in welcher Länge er belegt ist. Wenn ein leerer String drin steht, ist die Längenangabe 0.
Er darf aber dennoch mit einem längeren String überschrieben werden ...

Gruss, Heinileini
 
Zuletzt bearbeitet:
Ich vermute mal so etwas wie:
Code:
VAR_TEMP
  null_udt: "myUdt";
END_VAR

BEGIN

IF #init THEN
  "DatenDB".daten := #null_udt;
END_IF;
Der Baustein muss dafür aber "optimiert" sein, weil nur dann Temp-Variablen mit Null initialisiert werden.
Das hört sich schon mal interessant an.
Das bedeutet also, dass alle temp-variablen auf ihren 0-Wert beim Bausteinaufruf gesetzt werden?
Bei einem DT würden ich in diesem fall mal auf 1.1.1990 tippen.
Werde das morgen mal testen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meines Wissens steht "
in dem Byte für die Maximallänge" nicht, wie lang er sein darf, sondern in welcher Länge er belegt ist. Wenn ein leerer String drin steht, ist die Längenangabe 0.
Er darf aber dennoch mit einem längeren String überschrieben werden ...

Überschreiben bzw. zuweisen ja, aber nicht verlängern mit Concat. Beim Zuweisen wird die Länge nicht geprüft, die Funktionen zur Stringverarbeitung wie Concat und Konsorten prüfen aber die Längenangabe im String-Header.
Ich hatte mal einen Kollegen der hat mit der SFC Fill seine Strings "genullt" und sich dann gewundert warum diese Funktionen nicht mehr korrekt arbeiten.
 
Nein, sie werden auf den Wert initialisiert, der im UDT (oder der Temp-Deklaration) festgelegt wurde.
Das kann, muss aber nicht 0 sein.
Hatte geantwortet bevor noch weitere antworten kamen.
also doch nicht wirklich für mich geeignet. der eingangs-udt kann durchaus initialwerte enthalten.
schade.
und was genau meinst du mit das kann, muss aber nicht sein ?
oder ist das wie früher mit temp-variablen die ich nicht beschreibe? also irgendwas mehr oder weniger zufälliges
 
und was genau meinst du mit das kann, muss aber nicht sein ?
oder ist das wie früher mit temp-variablen die ich nicht beschreibe? also irgendwas mehr oder weniger zufälliges
Nein, nichts Zufälliges.

Wenn Du eine Variable im UDT anlegst, gibt TIA ja erst mal einen Default-Wert vor, z.B. bei INT=0.
Den kann man aber bei Bedarf ändern, wie Du ja selbst schon geschrieben hast.

So wie der UDT angelegt wurde, wird dann im Temp-Bereich eine 1:1 Kopie als Initalwert angelegt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Früher (300/400):
Wert von Variablen im Temp-Bereich undefiniert

Jetzt (1200/1500)
a) Wenn Baustein "nicht optimiert": undefiniert
b) Wenn Baustein "optimiert" und Variable von Datentyp <> UDT: Null
c) Wenn Baustein "optimiert" und Variable von Typ UDT: Startwert aus der UDT Definition

und vermutlich noch weitere Ausnahmen, z.B. UDT in temp und "nicht optimiert".
 
Jetzt (1200/1500)
b) Wenn Baustein "optimiert" und Variable von Datentyp <> UDT: Null
c) Wenn Baustein "optimiert" und Variable von Typ UDT: Startwert aus der UDT Definition
Man kann statt dessen auch formulieren:
Code:
b) in optimierten Bausteinen erhalten alle Variablen ihren vordefinierten Wert.
und dann gibt es auch keine Ausnahmen.
 
Zurück
Oben