7.1 数据类型和编码规则
7.1.1 数据类型和编码规则简述
为了在网络上交换有意义的数据,必须保证数据格式为生产者和消费者所识别。本规范提供基于此概念的数据类型。
编码规则定义了数据所表达值的类型和传输语义。值以位序列的形式表达。位序列以字节为传输单元。各数据类型的编码风格均为小端模式。
应用程序通常请求的都是基本数据类型。使用复合数据类型机制,可以通过扩展可用数据类型表来实现。例如一些常用的数据类型定义如“Visible String”或“Time of Day”(参见7.1.6.3和7.1.6.5)。本文对复合数据类型的定义从技术角度一般取其应用含义,如“DEFTYPES”而不是“DEFSTRUCTS”。
7.1.2 数据类型定义
数据类型定义由数据值和数据类型编码之间的关系决定。类型定义的命名中体现数据类型。数据语法和数据类型定义如下(见/EN61131-3/)。
data_definition ::= type_name data_name
type_definition ::= constructor type_name
constructor ::= compound_constructor|basic_constructor
compound_constructor ::= array_constructor|structure_constructor
array_constructor ::=‘ARRAY’‘[‘length‘]’‘OF’type_name
structure_constructor ::=‘STRUCT’‘OF’component_list
component_list ::= component{‘,’component}
component ::= type_name component_name
basic_constructor ::=‘BOOLEAN’|
‘VOID’bit_size|
‘INTEGER’ bit_size|
‘UNSIGNED’ bit_size|
‘REAL32’|
‘REAL64’|
‘NIL’
bit_size ::=‘1’|‘2’|<...>|‘64’
length ::= positive_integer
data_name ::= symbolic_name
type_name ::= symbolic_name
component_name ::= symbolic_name
symbolic_name ::= letter{[‘_’](letter|digit)}
positive_integer ::=(‘1’|‘2’|<...>|‘9’){digit}
letter ::=‘A’|‘B’|<...>|‘Z’|‘a’|‘b’|<...>|‘z’
digit ::=‘0’|‘1’|<...>|‘9’
不要使用递归定义。
type_definition定义使用basic(res.~compound)数据类型的结构体称为basic_constructor (res.~compound_constructor)。
7.1.3 位序列
7.1.3.1 位序列定义
一位的值为0或1。一个位序列b是一个包含0或更多位的有序组。如果位序列b包含多于0位,可以用$$b_j$$(j>0)表示b0,...,bn-1中的位,其中n是正整数。
因而有:
叫做一个长度为|b| = n的位序列。长度为0的空序列用$$\varepsilon$$表示。
例:10110100b、1b、101b等都是位序列。
对下面位序列的翻转操作(﹁)
7.1.3.2 位序列的传输语法
为了跨网络传输,位序列被标记为字节序列。这里和以下的十六进制表示法用于字节表达。让$$b = b0 ...b{n-1}$$的位序列中n<64。k为非负整数,8(k-1)<n<8k。b在传输过程中被打包为表12的形式。 $$b_i、i\geq n$$被忽略。 八位位组1先传输而k最后。因此位序列以下列顺序方式传输:
八位码 | 1. | 2. | k. |
---|---|---|---|
b7...b0 | b15...b8 | b8k-1...b8k-8 |
图12:位序列的传输语法
例如:
位9 ... 位0
10b 0001b 1100b
2h 1h Ch
= 21Ch
位序列b = b0 .. b9 = 0011 1000 01b表示UNSIGNED10的值21Ch,转换为两个八位字节传输: 1Ch和02h。
7.1.4 基本数据类型
7.1.4.1 简述
基本数据类型“type_name”与其创建字符相同(aka Symbolic_name),例如:
BOOLEAN BOOLEAN
是BOOLEAN数据类型的的类型定义。
7.1.4.2 NIL
基本数据类型NIL表示$$\varepsilon$$。
7.1.4.3 Boolean
基本数据类型BOOLEAN的值为TRUE或FALSE。该值表示的位序列的长度为1。值为TRUE(res.FALSE)代表的位序列是1(res.0)。
7.1.4.4 Void
基本数据类型VOIDn表示长度为n的位序列。类型为VOIDn的数据值是未定义的。类型为VOIDn的位序列数据中的位要么显式指定,要么标记为“随意”。
数据类型VOIDn常用于保留字段和复合结构数据对齐的字节边界。
7.1.4.5 Unsigned Interger
基本数据类型UNSIGNEDn取值非负整数。范围0,...,2n-1。该数据表示长度为n的位序列。位序列
八进制数 | 1. | 2. | 3. | 4. | 5. | 6. | 7. | 8. |
---|---|---|---|---|---|---|---|---|
UNSIGNED8 | b7...b0 | |||||||
UNSIGNED16 | b7...b0 | b15...b8 | ||||||
UNSIGNED24 | b7...b0 | b15...b8 | b23...b16 | |||||
UNSIGNED32 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | ||||
UNSIGNED40 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | b39...b32 | |||
UNSIGNED48 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | b39...b32 | b47...b40 | ||
UNSIGNED56 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | b39...b32 | b47...b40 | b55...b48 | |
UNSIGNED64 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | b39...b32 | b47...b40 | b55...b48 | b63...b56 |
图13:数据类型 UNSIGNEDn的传输规则
7.1.4.6 Signed Integer
基本数据类型INTEGERn值为整数。取值的范围是-2n-1~2n–1–1.该数据表示长度为n的位序列。位序列
例如:值-266 = FEF6h数据类型NTERGER16在总线上以两个八位字节传输,F6h然后是FEh。 INTEGERn的数据类型被定义见图14。
八进制数 | 1. | 2. | 3. | 4. | 5. | 6. | 7. | 8. |
---|---|---|---|---|---|---|---|---|
INTEGER8 | b7...b0 | |||||||
INTEGER16 | b7...b0 | b15...b8 | ||||||
INTEGER24 | b7...b0 | b15...b8 | b23...b16 | |||||
INTEGER32 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | ||||
INTEGER40 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | b39...b32 | |||
INTEGER48 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | b39...b32 | b47...b40 | ||
INTEGER56 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | b39...b32 | b47...b40 | b55...b48 | |
INTEGER64 | b7...b0 | b15...b8 | b23...b16 | b31...b24 | b39...b32 | b47...b40 | b55...b48 | b63...b56 |
图14:数据类型INTEGERn传输规则
7.1.4.7 浮点数
基本数据类型REAL32和REAL64值为实数。
数据类型REAL32表示32位长度的位序列。编码遵守/IEEE754/。传输语法见图15。
数据类型REAL64表示64位长度的位序列。编码遵守/IEEE754/。
32位的位序列有值(有限非0实数、±0、±_)或NaN(not-a-number)。位序列
E = b3027+...+b2320, 0<E<255、为无偏(un-biase)指数。
F = 2-23(b22222 +...+b121+b020)表示小数部分。
E = 0用于表达±0。E=255用于表示无穷大和NaN’s.请注意,位顺序从左侧最低位开始。
例如:
6.25 = 2E-12(1+F)
E = 129 = 27+20和
F = 2-1+2-4 = 2-23(222+219)项数表示为:
S | E | F |
---|---|---|
b31 | b30.b23 | b22.b0 |
0 | 100 0000 1b | 100 1000 0000 0000 0000 0000b |
6.25 =b0..b31 = 0000 0000 0000 0000 0001 0011 0000 0010b
转换顺序:
八进制数 | 1. | 2. | 3. | 4. |
---|---|---|---|---|
REAL32 | 00h | 00h | C8h | 40h |
b7..b0 | b15..b8 | b23..b16 | b31..b24 |
图15:数据类型 REAL32的传输规则
7.1.5 复合数据类型
复合数据类型展开为包含基本数据类型的独立表单类型定义。相应地,复合数据类型´type_name´命名规则是由基本类型´basic_type_i´表单组成的复合数据名´component_name_i´确定。
复合数据类型由ARRAY 和 STRUCT OF构建。
STRUCT OF
basic_type_1 component_name_1,
basic_type_2 component_name_2,
… …
basic_type_N component_name_N
type_name
ARRAY[length] OF basic_type type_name
复合数据类的位序列由组成复合数据的各数据的位序列连接而成。
假设组件´component_name_i´表达的位序列为
b(i), 其中 i = 1,…,N
然后复合数据的位序列连接为
STRUCT OF
INTEGER10 x,
UNSIGNED5 u
NewData
假定x = –423 = 259h,u = 30 = 1Eh。让b(x)和b(u)表示位序列x和u。然后:
b(x) = b0(x)..b9(x) = 1001101001b
b(u) = b0</sub(u)..b4(u) = 01111b
b(xu) = b(x)b(u) = b0(xu)..b14(xu) = 1001101001 01111b
该值的结构被转换为两个八位字节,59h然后是7Ah。
7.1.6 扩展数据类型
7.1.6.1 简述
扩展数据类型分为基本数据类型和复合数据类型,分别在以下小节定义。
7.1.6.2 八进制字符串
数据类型OCTET_STRIN长度定义如下,length:八进制节字符串的长度。
ARRAY[length] OF UNSIGNED8 OCTET_STRINGlength
7.1.6.3 可显示字符串
数据类型VISIBLE_STRINGlength定义如下,VISIBLE_CHAR类型数据取值 0h和20h~7Eh。数据由ISO 646-1973(E)7位编码的字符解释。length:可见字符串长度。
UNSIGNED8 VISIBLE_CHAR
ARRAY[length] OF VISIBLE_CHAR VISIBLE_STRINGlength
无需0h作为字符串结束标志。
7.1.6.4 Unicode字符串
数据类型UNICODE_STRINGlength定义如下;length unicode字符串长度。
ARRAY[length] OF UNSIGNED16 UNICODE_STRINGlength
7.1.6.5 时间
数据类型TIME_OF_DAY表示绝对时间。根据这一定义和编码规则,TIME_OF_DAY由48位的位序列表达。
成员ms是午夜起算的毫秒计数。成员days是自1984年1月1日以来的天数。
STRUCT OF
UNSIGNED28 ms,
VOID4 reserved,
UNSIGNED16 days
TIME_OF_DAY
7.1.6.6 时间差
数据类型TIME_DIFFERENCE表示时间差。根据这一定义和编码规则,时间差由48位的位序列表达。
ms表示毫秒数。days表示天数。
STRUCT OF
UNSIGNED28 ms,
VOID4 reserved,
UNSIGNED16 days
TIME_DIFFERENCE
7.1.6.7 域
域用于从客户端到服务器传输任意大的数据块,反之亦然。数据块内容由应用程序指定不在本文范围。