Skip to main content

Speicherformat

Es stehen zwei Implementierungen der Schnittstelle IDataStorage zur Verfügung: ASCIIDataStorage und BinaryDataStorage.

Für beide Formate gilt: Die erste Variable die gespeichert wird, ist die reservierte Variable ___xCompressTags vom Typ BOOL. Ihr Wert gibt an, ob die Instanzpfade komprimiert gespeichert werden. Falls ein Integritätsobjekt geschrieben wird, dann wird es als letzte Variable mit Namen ___Integrity vom Typ BOOL mit Wert TRUE geschrieben.Alle persistenten Variablen außer diesen reservierten Variablen werden in der Reihenfolge nach Ihrem vollen Instanzpfad sortiert gespeichert. Dabei ist es egal ob die Instanzpfade komprimiert werden oder nicht.

Tipp

Falls die Daten durch den Anwender verändert werden, muss dieser sicherstellen, dass die Sortierreihenfolge beibehalten wird.

ASCII-Format

ASCIIDataStorage schreibt jeweils den Instanzpfad der persistenten Variablen (möglicherweise gepackt), den Typ und den Wert als String in eine Datei. Dabei trennt ein Tabulatorzeichen den Namen und das restliche Datum (änderbar durch Parameter codbySeparator). Beim Lesen wird eine Konvertierung durchgeführt. Deshalb kann die Datei auch extern editiert werden. Zeilen müssen mit "\r\n“ getrennt werden (Windows-Konvention). Zeilen die mit einem Strichpunkt beginnen, werden beim Einlesen ignoriert und beim erneuten Speichern nicht wieder eingefügt.

Format einer ASCII-Datei:

{timestamp}\r\n
{instance path}{bySeparator}{Typ}:{value}\r\n
…
{instance path}{bySeparator}{Typ}:{value}\r\n

Der Zeitstempel gibt den Zeitpunkt an, zu dem das Speichern angestoßen wurde. Er wird als DATE_AND_TIME- Literal geschrieben (beispielsweise. DT#2012-01-11-15:11:09).

Beispiel 7. Beispiel einer ASCII-Datei
ac_pm_ascii_file.png


Behandlung von REAL und LREAL-Variablen:

Die Werte der Variablen werden als ST-Literale geschrieben. REAL- und LREAL-Werte werden gesondert behandelt, da die Konvertierung in Dezimalbrüche und von Dezimalbrüchen nur schwierig verlustfrei zu implementieren ist. Um dennoch einen Genauigkeitsverlust zu vermeiden und gleichzeitig die Lesbarkeit und Änderbarkeit der ASCII-Datei zu bewahren, werden sie in einem Hexadezimal-Format gespeichert, das leicht ohne Genauigkeitsverlust berechnet werden kann. Der (ungenaue) Dezimalbruch wird als Kommentar dahinter ausgegeben. Beim Einlesen werden sowohl das Hexadezimalformat als auch das ST-Dezimalformat unterstützt, so dass ein Anwender den Wert einfach auf einen neuen Dezimalbruch ändern kann. Beim Einlesen wird alles ignoriert, was hinter dem Hexadezimalformat steht.

Das Hexadezimalformat ist wie folgt definiert:

F16#{Mantissa}H{Exp} | F16#NaN | F16#+Inf | F16#-Inf
{Mantissa}   ::= {HexNumeral}
{Exp}        ::= {HexNumeral}
{HexNumeral} ::= [+-]?[1-9A-F][0-9A-F]*

Wenn m die durch die Mantisse dargestellte Zahl und e die durch den Exponenten dargestellte Zahl ist, dann ist der Wert der gesamten dargestellten Zahl m * 16^e.

Beispiel 8. Beispiel eines gespeicherten REAL-Wertes

lr1 LREAL:F16#F0H-3 0.05859375



Binärformat

BinaryDataStorage speichert die Daten im Binärformat ab. Darauf folgt ein Zeitstempel (Typ DATE_AND_TIME). Es folgen die einzelnen Variablen.

Komprimierte Archive

Die Variablenwerte werden jeweils mit Pfad und Namen (im Pfad sind weder Applikation noch Gerätenamen enthalten) abgelegt, allerdings in einer kompakten Schreibweise, um Ressourcen und Zeit zu sparen.

Die Instanzpfade müssen in jedem Fall (ob gepackt oder nicht) korrekt nach dem vollen Instanzpfad sortiert sein. Die Sortierung ist alphabetisch, wobei aber Array-Indizes numerisch sortiert werden.

Beispiel 9. Beispiele

Objekte

Verkürzte Repräsentation

Fb1.fb2.fb3.a

Fb1.fb2.fb3.a

Fb1.fb2.fb3.b

<b

Fb1.fb2.d

<<d

Fb4

FB4