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