如果 OPC 服务器支持数据数组,则 OPC 客户端可以从服务器读取多个值。数据数组是一组数据类型相同的相连数据。使用一个项目读取多个值,有助于简化驱动程序配置并改善驱动程序吞吐量。
示例 1
假设需要从 OPC 服务器读取 200 个连续地址值。如果不使用数据数组,则必须创建 200 个项目,每个值对应一个项目。各值均是独立读取,因而需要向 OPC 服务器发送 200 条消息。而使用数据数组的话,只需创建一个项目便可读取所有 200 个值。所有值均是一次读取,因而只需向 OPC 服务器发送一条消息。
当 OPC 客户端使用同步 I/O 与服务器通信时,最好使用数据数组,因为 OPC 客户端可以读取整个数组。当结合异步 I/O 使用数据数组时,驱动程序吞吐量可能不会有改善,因为即使数组中只有一个值发生改变,OPC 服务器也会把整个数组发送给 OPC 客户端。因此,较好的做法是为频繁改变的特定值创建单独的项目,对所有其它值则使用数据数组。
示例 2
假设地址 100、150 和 200 中的值频繁变化,地址 1 至 200 中的所有其它值则不会频繁变化。这种情况下,与为所有 200 个值创建一个数据数组相比,更好的做法是创建下列项目:
- 项目 1,地址 100
- 项目 2,地址 150
- 项目 3,地址 200
- 项目 4,数据数组读取地址 1-99
- 项目 5,数据数组读取地址 101-149
- 项目 6,数据数组读取地址 151-199
数据数组语法
数据数组的项目 ID 语法取决于 OPC 服务器。不过,可以使用以下通用语法:
itemid
- 或 -
itemid!subscript:length(仅限 Schneider Automation)
itemid[subscript],Llength(仅限 RS-Linx)
其中:
- itemid 是需要访问的项目在 OPC 服务器中的名称。
- subscript 是数组的起始地址。
- length 是数组中的元素数量。
示例
针对 RS-Linx OPC 服务器,要将 Power Tool 中的一个项目配置为含有 100 个元素的一个数组,请使用类似下面的语法:
项目 ID:Sign_Int_Array[0],L100
针对 S7 Siemens 服务器,要将 Power Tool 中的一个项目配置为含有 100 个元素的一个数组,请使用类似下面的语法:
S7:[S7_300|VFD1|CP5613_5614(PROFIBUS)]DB1,B0,100
针对 Schneider Automation OFS OPC 服务器,要将 Power Tool 中的一个项目配置为含有 100 个元素的一个数组,请使用类似下面的语法:
MBT:1.2.3.4! 400001:100
关于服务器要求的精确语法,请参考 OPC 服务器文档。
使用数据库块访问数据数组
要访问数据数组中的数据,必须在数据库块中输入 I/O 地址。必须使用类似项目 ID 语法的精确语法:
servername;groupname;itemid;accesspath;[element]
其中:
- servername 是 OPC 服务器的名称。
- groupname 是含有需要访问项目的组的名称。
- itemid 是需要访问的项目在 OPC 服务器中的名称。项目 ID 可能还包括长度。RS-Linx 服务器的项目 ID 含有方括号,请不要将其与需要访问的数组元素混淆。例如,Sign_Int_Array[0] 表示一个起始地址为 0 的项目。
- accesspath 是需要使用的访问路径在 OPC 服务器中的名称。如果不指定访问路径,可以留空。
- element 是需要访问的数组中的元素。此值必须位于起始地址与起始地址加上长度的和再减去 1 (start + length-1) 所得的值之间。
示例
在 Power Tool 中定义了项目起始地址 0 之后,要访问 RS-Linx OPC 服务器 RSLinxV22 上位于地址 2 的一个 100 元素数组中的第 5 个元素,可以使用类似下面的语法:
RSLINXV22;SignIntGroup1;Sign_Int_Array[2],L100;Clogix;[4]
要访问 S7 Siemens 服务器上一个 100 元素数组中的第 5 个元素,可以使用类似下面的语法:
Server1;Group1;S7:[S7_300|VFD1|CP5613_5614(PROFIBUS)]DB1,B0,100;No Access Path;[4]
要访问 Schneider Automation OPC 服务器上位于地址 400001 的一个 100 元素数组中的第 5 个元素,可以使用类似下面的语法:
Server1;Group1;MBT:1.2.3.4! 400001:100;无访问路径;[5]
使用模拟寄存器块和数字寄存器块
完成模拟寄存器块或数字寄存器块的“I/O 地址”字段设置后,可以在画面数据源中使用偏移来访问数组中的不同值。
示例
假设您创建了一个模拟寄存器块 AR10,I/O 地址如下:
RSLINXV22;SignIntGroup1;Sign_Int_Array[5],L100;;[20]
有下列数据源访问特定数组元素:
数据源...
|
访问数组元素...
|
AR10.F_0
|
Sign_Int_Array[5],L100;;[20]
|
AR10.F_1
|
Sign_Int_Array[5],L100;;[21]
|
AR10.F_2
|
Sign_Int_Array[5],L100;;[22]
|
AR10.F_3
|
Sign_Int_Array[5],L100;;[23]
|
数字寄存器块的偏移与此相同。
注意:
- 对于配置为数据数组的项目,不能使用“自动创建”选项。
- 数据数组支持布尔型和数字(整数和浮点数)型数据。不支持字符串数组。
- 对于引用配置为数据数组的项目的数据库块,OPC 客户端不支持基于异常的处理。
OPC 客户端不会自动调整配置为数据数组的项目的大小。如需更改数组的大小,请禁用该项目,更改数组的长度,然后重新启用项目。确保 OPC 客户端中的数组长度与 OPC 服务器定义的数组长度一致。如果长度不一致,数据质量会被设置为“BAD”(不良)。