Serialize:序列化 |
说明
可以使用“序列化”指令将多个 PLC 数据类型 (UDT)、STRUCT 或 ARRAY of <数据类型> 转换为顺序表示,而不会丢失结构部分。
可以使用该指令临时将用户程序的多个结构化数据项保存到缓冲区中(最好位于全局数据块中),并发送到其它 CPU。用于保存转换后数据的存储区的数据类型必须为 ARRAY of BYTE 或 ARRAY of CHAR,并在版本 V1.0 中声明为标准访问。在版本 V2.0 及以上版本中,还支持优化数据。源数据区内的填充数据在目标数组中未定义。这些数据可以为填充字节或某数据区的填充位(如,ARRAY、STRUCT 或 PLC 数据类型 (UDT))以及当前某个未使用字符串中的字符。
标准存储区的容量为 64 KB。如果参数 DEST_ARRAY 位于标准存储区中,则根据标准存储区规则,大于 64 KB 的结构不能进行序列化。
建议将 ARRAY 的下限定义为“0”,这是因为 ARRAY 中的下标对应 POS 参数值。例如,ARRAY[0] = POS 0。下文中的说明与示例均基于此公式。
参数 POS 处操作数中包含有关数据占用字节数量的信息。
如果要发送单个 PLC 数据类型 (UDT)、STRUCT 或 ARRAY of <数据类型pe>,可以直接调用指令“TSEND:通过通信连接发送数据”。
|
说明 比较结构 要比较结构,必须首先对其进行序列化处理。请改用“CMP”指令。 有关详细信息,请参见“比较器”部分。 |
存储区的容量
对齐规则为优化存储区内的简单结构中不包含填充字节。这样,优化存储区中的结构大小将小于标准存储区中的。结构型和嵌套结构型 ARRAY 包含填充字节。对于包含组合结构(所需存储空间更高)的存储区而言,该规则并并为通用规则。
S7-1500 系列 CPU:
如果某个块的块属性为“优化块访问”,则 BOOL 数据类型的长度将取决于紧跟其后的数据类型。即,如果 BOOL 数据类型之后为 BYTE,则长度为 1 个字节。即,如果 BOOL 数据类型之后为 WORD,则长度为 2 个字节。这样,优化存储区中主要由 BOOL 数据类型组成的结构大小将大于标准存储区。因此,含少量 BOOL 数据类型的组合型结构在优化存储区内的大小,要小于该结构在标准存储区内的大小。
因此,建议序列化的源数据区从大数据类型开始,以布尔型元素结束。这样,可大幅减少用于填充的填充位。
|
说明 对 CPU S7-1200 上的多个结构进行序列化 如果要在缓冲区中对 CPU S7-1200 的多个结构进行序列化并且要与其进行通信(例如,与控制系统或 CPU S7-1500 通信),则必须检查返回值(POS 参数的下标)是否为偶数。如果并非偶数,则必须在序列化第二个结构之前将返回值增加 1,因为第一个结构并未填充字节。 示例: 结构由 1 个 DWORD 和 1 个 BYTE 组成 缓冲区中下一个序列化结构的起始地址为 5。加 +1,使起始地址为偶数。 |
优化存储区
对固件版本 V4.2 及以上版本的 S7-1200 系列 CPU 和固件版本 V2.0 及以上版本的 S7-1500 系列 CPU,要对较大结构进行序列化,可将存储区声明为优化访问。对于标准存储区,顺序表示保存不变。
参数
下表列出了“序列化”指令的参数:
|
参数 |
声明 |
数据类型 |
存储区 |
说明 |
|
EN |
Input |
BOOL |
I、Q、M、D、L 或常量 |
使能输入 |
|
ENO |
Output |
BOOL |
I、Q、M、D、L |
使能输出 |
|
SRC_VARIABLE |
Input |
所有数据类型 |
I、Q、D、FB 的块接口, 无 I/O 数据 |
待序列化的变量。 S7-1500: 进行性能优化时,该参数不能为 VARIANT 指针。 |
|
DEST_ARRAY |
InOut |
ARRAY of BYTE 或 ARRAY of CHAR |
I、Q、D、FB 的块接口(可在 Input、Output、Static 和 Temp 部分中)。 无 I/O 数据 |
用于存储所生成数据流的 ARRAY。 S7-1500: 进行性能优化时,该参数不能为 VARIANT 指针。 |
|
POS |
InOut |
DINT |
I、Q、M、D、L |
POS 参数处的操作数,将根据已转换客户数据所占用的总字节数,存储第一个字节的下标。POS 参数将从 0 开始计算。 |
|
RET_VAL |
Output |
INT |
I、Q、M、D、L |
错误信息 |
RET_VAL 参数
下表列出了 RET_VAL 参数值的含义:
|
错误代码*(W#16#...) |
说明 |
|
0000 |
无错误 |
|
80B0 |
参数 SRC_VARIABLE 和 DEST_ARRAY 的存储区重叠。 |
|
8150 |
SRC_VARIABLE 参数中的 VARIANT 数据类型包含一个 ZERO 指针。 |
|
8151 |
SRC_VARIABLE 参数中的引用无效 |
|
8236 |
SRC_ARRAY 参数处的变量不在一个标准访问块中。 |
|
8250 |
NULL 指针已在 DEST_ARRAY 参数处传递。 |
|
8251 |
DEST_ARRAY 参数中的引用无效 |
|
8253 |
参数 DEST_ARRAY 处该变量可提供的空间不足,无法包含参数 SRC_VARIABLE 处变量中的内容。由于 POS 参数处变量的输入值,可用的存储空间将减少。POS 参数处的输入值可确定 DEST_ARRAY 参数处变量中的起始位置。 |
|
8254 |
DEST_ARRAY 参数中的数据类型无效 |
|
8382 |
POS 参数的值超出数组的限值。 |
|
* 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显式格式的更多信息,请参见“另请参见”。 |
|
固件版本 4.2 (S7-1200) 和 2.0 (S7-1500) 及以上版本的特殊功能:
以下错误代码具有不同的含义:
|
错误代码*(W#16#...) |
说明 |
|
8236 |
对 DEST_ARRAY 参数处的存储区访问无效。 |
|
* 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显式格式的更多信息,请参见“另请参见”。 |
|
固件版本 V2.8 及以上版本中的特殊功能(S7-1500):
要对“序列化”指令(版本 V2.1)的性能进行优化,参数 SRC_VARIABLE 和 DEST_ARRAY 不能为 VARIANT 指针,而只能使用特定的数据类型。
请注意,对指令的错误响应将会因此更改:出错时,CPU 不输出任何错误代码,而是切换为 STOP 模式并生成访问错误。为了避免该错误,可通过指令 "GET_ERROR" 和 "GET_ERR_ID" 进行本地错误处理。
示例
以下示例说明了该指令的工作原理:
程序段 1:

“移动值”指令将值“0”移动到 #BufferPos 操作数。“序列化”指令对“Source”变量中的客户数据进行序列化,并将该顺序表示写入“Buffer”变量中。"Buffer".Field 操作数中下一个未写入的字节下标将保存在 #BufferPos 操作数中。
程序段 2:

现在将插入一种分隔表,以更方便地对顺序表示进行取消序列化。“移动字符串”指令将“arti”字符移动到 #Label 操作数。“序列化”指令将客户数据后的这些字符写入“Buffer”变量中。“#BufferPos”操作数的值将相应递增。
程序段 3:

“序列化”指令对“Source”变量*特中**定的订货数据(运行时计算得出)的数据进行序列化,并在将这些数据按照顺序表示方式写入“arti”字符后的“Buffer”变量中。
下表列出了操作数的声明:
|
操作数 |
数据类型 |
声明 |
|
DeliverPos |
INT |
在块接口的“Input”部分 |
|
BufferPos |
DINT |
在块接口的“Temp”部分 |
|
Error |
INT |
在块接口的“Temp”部分 |
|
Label |
STRING[4] |
在块接口的“Temp”部分 |
下表列出了 PLC 数据类型的声明:
|
PLC 数据类型的名称 |
名称 |
数据类型 |
|
Article |
Number |
DINT |
|
Declaration |
STRING |
|
|
Colli |
INT |
|
|
Client |
Title |
INT |
|
First name |
STRING[10] |
|
|
Surname |
STRING[10] |
下表列出了数据块的声明:
|
数据块的名称 |
名称 |
数据类型 |
|
Source |
Client |
"Client"(PLC 数据类型) |
|
Article |
Array[0..10] of "Article"(PLC 数据类型) |
|
|
Buffer |
Field |
Array[0..294] of BYTE |
Deserialize: 取消序列化 |
说明
可以使用“取消序列化”指令反向转换 PLC 数据类型 (UDT)、STRUCT 或 ARRAY of <数据类型> 的顺序表示并填充所有内容。
PLC 数据类型 (UDT)、STRUCT 或 ARRAY of <数据类型> 顺序表示所在存储区的数据类型必须为 ARRAY of BYTE 或 ARRAY of CHAR,并在版本 V1.0 中声明为标准访问。优化的存储区也支持版本 V2.0 及更高版本。标准存储区的容量为 64 KB。在转换之前确保有充足的存储空间。如果通过指令“序列化”填充存储区并插入有填充字节,则不进行转换。
建议将 ARRAY 的下限定义为“0”,这是因为 ARRAY 中的下标对应 POS 参数值。例如,ARRAY[0] = POS 0。下文中的说明与示例均基于此公式。
该指令可以逐步将已转换数据的多个顺序表示转换回原始状态。
如果只想转换回 PLC 数据类型 (UDT)、STRUCT 或 ARRAY of <数据类型> 的单个顺序表示,则还可以直接使用指令“TRCV:通过通信连接接收数据”。
存储区的容量
对齐规则为优化存储区内的简单结构中不包含填充字节。这样,优化存储区中的结构大小将小于标准存储区中的。结构型和嵌套结构型 ARRAY 包含填充字节。对于包含组合结构(所需存储空间更高)的存储区而言,该规则并并为通用规则。
S7-1500 系列 CPU:
对于块属性为“优化块访问”的块,BOOL 类型的长度为 1 个字节。这样,优化存储区中主要由 BOOL 数据类型组成的结构大小将大于标准存储区。因此,含少量 BOOL 数据类型的组合型结构在优化存储区内的大小,要小于该结构在标准存储区内的大小。
|
说明 对 CPU S7-1200 上的多个结构进行序列化 如果要在缓冲区中对 CPU S7-1200 的多个结构进行序列化并且要与其进行通信(例如,与控制系统或 CPU S7-1500 通信),则必须检查返回值(POS 参数的下标)是否为偶数。如果并非偶数,则必须在序列化第二个结构之前将返回值增加 1,因为第一个结构并未填充字节。 示例: 结构由 1 个 DWORD 和 1 个 BYTE 组成 缓冲区中下一个序列化结构的起始地址为 5。加 +1,使起始地址为偶数。 |
优化存储区
对固件版本 V4.2 及以上版本的 S7-1200 系列 CPU 和固件版本 V2.0 及以上版本的 S7-1500 系列 CPU,要取消较大结构的序列化,可将顺序表示的存储区声明为优化访问。对于标准存储区,顺序表示中内容保存不变。ARRAY 中的字节仅支持符号化访问。
参数
下表列出了“取消序列化”指令的参数:
|
参数 |
声明 |
数据类型 |
存储区 |
说明 |
|
EN |
Input |
BOOL |
I、Q、M、D、L 或常量 |
使能输入 |
|
ENO |
Output |
BOOL |
I、Q、M、D、L |
使能输出 |
|
SRC_ARRAY |
Input |
ARRAY[*] of BYTE 1) 或者 ARRAY of CHAR |
I、Q、D、FB 的块接口(可在 Input、Output、Static 和 Temp 部分中)。 无 I/O 数据 |
用于保存其数据流将取消序列化的 ARRAY of BYTE 或 ARRAY of CHAR。 S7-1500: 进行性能优化时,该参数不能为 VARIANT 指针。 |
|
DEST_VARIABLE |
InOut |
所有数据类型 |
I、Q、D、FB 的块接口, 无 I/O 数据 |
已取消序列化数据待写入的目标变量。 S7-1500: 进行性能优化时,该参数不能为 VARIANT 指针。 |
|
POS |
InOut |
DINT |
I、Q、M、D、L |
POS 参数中的操作数将根据转换后客户数据所占用的字节数,存储第一个字节的下标。POS 参数将从 0 开始计算。 |
|
RET_VAL |
Output |
INT |
I、Q、M、D、L |
错误信息 |
|
1) 仅适用于固件版本为 V4.2 及以上版本的 S7-1200 系列 CPU 和固件版本为 V2.0 及以上版本的 S7-1500 系列 CPU。 |
||||
RET_VAL 参数
下表列出了 RET_VAL 参数值的含义:
|
错误代码*(W#16#...) |
说明 |
|
0000 |
无错误 |
|
80B0 |
参数 SRC_ARRAY 和 DEST_VARIABLE 的存储区重叠。 |
|
8136 |
SRC_ARRAY 参数处的变量不在一个标准访问块中。 |
|
8150 |
SRC_ARRAY 参数中的 VARIANT 数据类型包含一个 ZERO 指针。 |
|
8151 |
SRC_ARRAY 参数中的引用无效 |
|
8153 |
SRC_ARRAY 参数没有足够的可用存储空间。 |
|
8154 |
SRC_ARRAY 参数中的数据类型无效 |
|
8250 |
NULL 指针已在 DEST_VARIABLE 参数处传递。 |
|
8251 |
DEST_VARIABLE 参数中的引用无效 |
|
8382 |
POS 参数的值超出数组的限值。 |
|
* 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显式格式的更多信息,请参见“另请参见”。 |
|
固件版本 4.2 (S7-1200) 和 2.0 (S7-1500) 及以上版本的特殊功能:
以下错误代码具有不同的含义:
|
错误代码*(W#16#...) |
说明 |
|
8136 |
对 SRC_ARRAY 参数处的存储区访问无效。 |
|
* 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显式格式的更多信息,请参见“另请参见”。 |
|
固件版本 V2.8 及以上版本中的特殊功能(S7-1500):
要对“取消序列化”指令(版本 V2.1)的性能进行优化,参数 SRC_ARRAY 和 DEST_VARIABLE 不能为 VARIANT 指针,而只能使用特定的数据类型。
请注意,对指令的错误响应将会因此更改:出错时,CPU 不输出任何错误代码,而是切换为 STOP 模式并生成访问错误。为了避免该错误,可通过指令 "GET_ERROR" 和 "GET_ERR_ID" 进行本地错误处理。
示例
下表列出了操作数的声明:
|
操作数 |
数据类型 |
声明 |
|
DeliverPos |
INT |
位于 FB 或 FC 块接口的“Input”部分。 |
|
BufferPos |
DINT |
位于 FB 或 FC 块接口的“Temp”部分。 |
|
Error |
INT |
|
|
Label |
STRING[4] |
下表列出了 PLC 数据类型的声明:
|
PLC 数据类型的名称 |
名称 |
数据类型 |
|
Article |
Number |
DINT |
|
Declaration |
STRING |
|
|
Colli |
INT |
|
|
Client |
Title |
INT |
|
First name |
STRING[10] |
|
|
Surname |
STRING[10] |
下表列出了数据块的声明:
|
数据块的名称 |
名称 |
数据类型 |
|
Target |
Client |
"Client"(PLC 数据类型) |
|
Article |
Array[0..10] of "Article"(PLC 数据类型) |
|
|
Bill |
Array[0..10] of INT |
|
|
Buffer |
Field |
Array[0..294] of BYTE |
以下示例说明了该指令的工作原理:
程序段 1:

“移动值”指令将值“0”移动到 #BufferPos 操作数。“取消序列化”指令对“Buffer”变量中客户数据的顺序表示进行取消序列化,并写入“Target”变量中。#BufferPos 操作数将根据转换后客户数据所占用的字节数,存储第一个字节的下标。
程序段 2:

“取消序列化”指令对“Buffer”变量中分隔表(在客户数据后以顺序表示方式存储)的顺序表示进行取消序列化,并将相关字符写入 #Label 操作数中。可通过比较指令“arti”和“Bill”,对字符进行比较。在比较过程中,如果“arti”= TRUE,则该数据为已取消序列化且写入“Target”变量中的订货数据。在比较过程中,如果“Bill”= TRUE,则该数据为已取消序列化且写入“Target”变量中的计费数据。