有两种 IDataStorage 接口的实现方式:ASCIIDataStorage 和 BinaryDataStorage。
两种类型第一个存储的变量是 BOOL 类型的前缀___xCompressTags 。变量定义是否实例路径完全进行存储。如果一个整形对象被写入变量___Integrity 将会在文件中作为最后一个变量被存储。所有变量都将会按照他们完整实例路径的字母顺序进行排列 (无论是完整路径或者非完整路径)。
如果数据被用户修改,必须确保将维持正确的排序顺序。 |
ASCII 数据存储将每个实例路径的作为一个保持变量 (可能是压缩格式),数据类型和变量值作为字符串存在文件中。名称和数据通过一个表格符号进行分割 (可以通过参数bySeparator改变)。当压缩包读取时,将进行一个转换,因此文件可以在外部进行修改。行必须通过 "\r\n" (窗口转化)。 以分号开始的行将在读取时进行忽略 - 当压缩包读取时这一行将不会被写入。
ASCII 文件格式
{timestamp}\r\n {instance path}{bySeparator}{Typ}:{value}\r\n … {instance path}{bySeparator}{Typ}:{value}\r\n
时间戳定义存储触发的时间,将会按照 DATE_AND_TIME 逐字存储 (例如DT#2012-01-11-15:11:09)
REAL 和 LREAL 变量的处理:
变量的值是按照 ST 方式进行排列。 REAL 和 LREAL 的处理方式是不同的,因为从十进制或者到十进制的转化的实现过程为保证没有精度丢失是不同的。然而,为避免任何精度的损失并且保持可读性以及修改 ASCII 文件的可行性,这些变量都是存储在一个十六进制的文件中。 (精准的) 小数将会被添加到一个十六进制数之后作为一个注释。当读文件时,十六进制格式以及 ST 十进制格式是支持的。这允许用户修改小数部分。
十六进制格式定义如下:
F16#{Mantissa}H{Exp} | F16#NaN | F16+Inf | F16-Inf {Mantissa} ::= {HexNumeral} {Exp} ::= {HexNumeral} {HexNumeral} ::= [+-]?[1-9A-F][0-9A-F]*
如果 m 是尾数值并且 e 表示指数变量的定义格式为m * 16^e。