西门子PLC数据类型指针2
将 VARIANT 指定给引用尝试
说明
使用赋值尝试"?=",可将 VARIANT 数据类型的变量分配给一个引用。
如果在运行过程中由 VARIANT 寻址的变量的数据类型正确,且该变量位于一个优化的存储区内,则执行赋值操作后目标变量中将包含一个有效引用,否则为 NULL。
尝试赋值后,可以检查尝试是否成功,并根据该结果继续处理程序。在 LAD 和 FBD 中,可以针对检查使用使能输出 ENO。如果赋值尝试成功,ENO 将返回信号状态"1"。这样才能在程序段中继续执行后续指令。
在 STL 和 SCL 中,可使用指令"IS_NULL"或"NOT_NULL"来检查赋值尝试是否成功等。请参见以下示例。
规则
以下规则适用于该赋值操作:已赋值的 VARIANT 不得指向临时变量。指定的 VARIANT 必须指定优化存储区中的变量。如需将 VARIANT 数据类型的变量分配给一个 ARRAY 引用,则 VARIANT 必须指向一个限值与所声明引用限值完全匹配的 ARRAY。指向 ARRAY [0..9] 的 VARIANT 与变量 REF_TO ARRAY[1..10] 不匹配。在 SCL 中,赋值尝试无法用于多重赋值运算 (a := b := c;) 中。
示例
以下示例说明了如何使用引用直接对 VARIANT 变量值进行符号化读写操作。无需再使用"VariantGet"和"VariantPut"指令复制值。
VARIANT 变量"variantTelegramData"可传送类型为"Telegram1"和"Telegram2"的数据。
赋值尝试可用于测试该数据的类型是否为"Telegram1"。在本示例中,如果是,则将值"T"和"W"赋值给参数"Info1"和"Info2"。
SCL 中的示例:
LAD 中的示例:
将引用作为块参数进行传递
说明
在函数或函数块调用时,引用也可作为块参数进行传递。
在调用一个块时,如果在块接口处将引用声明为一个形参,则可将引用以"REF()"或"#MyRef"形式作为实参进行传递。
规则
将引用作为块参数进行传递时应遵循以下规则:"REF()"仅能作为函数输入参数 (Input) 中的实参进行传递。"REF()"不能作为实参传递到数据类型为"VARIANT"的块参数中。所传递变量的数据类型必须与所声明的引用数据类型完全匹配。系统不会进行数据类型转换。
示例 1
在以下示例中,显示了"Callee"函数的接口。该接口中包含有多个声明为引用的参数:
下图显示了 SCL 中对该块的调用以及所声明引用的参数分配:
示例 2
以下示例介绍了调用块期间针对传递引用的更多选项:
以下示例介绍了两种可能的传递方式:从 FB 传递到被调用的 FC:"FC StationData"中声明了输入参数"refStationData"。"FB LineData"在调用期间传递 REF("ReceiveData1") 作为实际参数("FB LineData" 程序代码第 2 行)。"ReceiveData1" 为基于 PLC 数据类型 "typeStationData" 的数据块。从 FC 返回到调用 FB:在两个块的接口中声明具有相同数据类型的引用(例如:"refPoductionData")。在块调用期间,两个引用相互赋值("FB LineData" 程序代码中的第 3 行)。在调用的 "FC StationData"(第 2 行)中初始化该引用,并通过输出参数将其写入调用 FB 的临时数据。
该示例显示了"通过引用将数据返回到调用块"中的部分编程示例。 示例:使用引用传递不同数据类型的变量
任务
在以下应用示例中,制造厂请求数据。根据所请求的数据结构类型,会向设备传送不同的数据。
数据结构映射到两种不同的 PLC 数据类型。PLC 数据类型"typeTelegram1"包含数据类型"CHAR"的常规类型,PLC 数据类型"typeTelegram2"包含数据类型"STRING"的零件 ID。这两种 PLC 数据类型均可生成数据块:
示例程序
下图说明了使用和不使用 SCL 引用实施任务的两种情况。
由于两个块应该都能够处理不同的消息帧格式,所以它们的输入输出参数 (InOut) 的数据类型为"VARIANT",其中消息帧以结构化变量的形式传送。由于创建程序时数据类型为 VARIANT 的参数未知,因此不能直接访问该参数。因此,在两个示例中均使用"TypeOf"来确定调用时可用的数据类型。
在左侧块中,现使用"VariantGet"指令将运行期间的待决变量复制到相应数据类型的临时变量中,并在其中描述了相应的值。随后使用"VariantPut"指令将该结构复制回"telegram"参数。复制操作对程序运行具有不利影响,并且耗费内存空间。
在右侧块中,使用引用来解决任务:该接口包含可用于两种可用数据结构的引用参数。根据当前的待决变量,使用"AssignmentAttempt"对匹配引用进行初始化,且该引用现指向数据块中的变量内存位置。这些值现在可直接写入数据块中。
这样程序代码将更加清晰并更易于维护。由于不需要复制结构化变量,因此程序运行和内存要求都不会受影响。示例:通过引用将数据返回到调用块
任务
在以下应用示例中,组态一个包含多个站的制造厂。这些站由两个 CPU 控制,它们想控制 CPU 发送数据。该 CPU 必须分析哪个站存在新数据并执行更高级别的控制任务,例如汇总所生产的工件数量。
下图显示了制造厂的结构:
示例程序中的块
控制 CPU 上的程序结构如下:PLC 数据类型"typeStationData"站的数据映射到 PLC 数据类型"typeStationData"。PLC 数据类型包含两种较低级别的 PLC 数据类型:"typeGeneralInfo"此数据类型中包含站编号。"typeProductionData"此数据类型中包含站的工件数量。DB "ReceiveData"对于 CPU 之间的通信,"typeStationData" 类型的数据块"ReceiveData"可用于各 CPU。可将通信数据写入此块。"FB LineData"该 FB 可对生产线进行完整分析。这包括汇总各站所有单元的计数器等。它也可调用 "FC StationData",还可将从"ReceiveData"DB 接收的数据复制到全局 DB"Station"。"FC StationData"该 FC 可检查是从哪个站接收的新数据,并可将其复制到全局 DB"Station"中的相应 ARRAY 元素。随后会将 ARRAY 元素作为引用返回到调用"FB LineData"进行进一步处理。全局 DB"Station"此 DB 包含五个站的站信息。它存储在五个组件的"typeStationData"类型的 ARRAY 中。
示例程序
下图说明了在 SCL 中实施任务的情况:
"FB LineData"调用"FC StationData"并在被"REF("ReceiveData")"调用时将引用传递到接收数据块。
通过取消对所传递的接收数据块的引用,该 FC 可读出站号并将其写入临时变量"stationNo"。
将接收数据块中的生产数据复制到全局 DB"Station"中的相应 ARRAY 元素中。
通过 "refProductionData" 输出将此 ARRAY 元素作为引用返回到调用 "FB LineData"。
随后它可以通过取消引用直接访问所传递的 ARRAY 元素,从而更新整条生产线的单元计数器。