异步执行“OPC_UA_MethodGetHandleList”指令与用户程序异步执行,需要多个程序周期。通过“Busy”、“Done”、“Error”和“Status”参数,可检查作业的状态。有关异步程序执行的信息,请参见“同步指令和异步指令之间的不同之处”部分。 指令调用说明(首次调用) 上图所示为示例 3。此部分程序会在OPC UA 服务器上注册方法“OpenDoor”。为此,会调用 “OPC_UA_MethodGetHandleList”方法。如果指令未执行,#Busy 为 FALSE,因此“#Req”变量会设为值 TRUE。这将启动指令的执行过 程。下一周期中,#Req 为FALSE。
指令调用说明(故障排除)如果发生错误,输出参数“Error”的值将设为 TRUE。这会将“#State”的值设为 100。该实例将 保留以接受故障排除。如果输出参数“Done”为 TRUE,说明指令执行成功。该指令可能已成功执行(“Error”参数未置位,“Done”参数置位),但无法返回方法的句柄。因此,在示例中会进行相应的检查,以确定是否已返回“OpenDoor”方法的句柄:• 如果满足条件,则变量“#State”的值加 1。这意味着将在下一周期执行下一程序段(示例 4 - 调用方法)。有关示例 4的说明信息,请参见“OPC_UA_MethodCall:调用方法 (页 5872)”。 •如果不满足该条件,则会将其评估为错误,且 #State 的值为 100。此错误情况会延续至 下一周期中。 说明 如果通过OPC_UA_MethodGetHandleList 在应用程序中注册了多个方法,则当 #Done = TRUE时,zuihao始终使 #State 的值加 1,并且在通过“OPC_UA_MethodCall”调用各个方法前,仅检查是否针对有问题的方法返回了有效句柄(在示例 4 中)。OPC_UA_MethodCall:调用方法 (S7-1500) 有效性“OPC_UA_MethodCall”指令的以下说明适用于 S7-1500 CPU 固件版本 V2.6 及更高版本。 说明在用户程序中可使用“OPC_UA_MethodCall”指令调用服务器方法。下图所示为用户程序结构。“OPC_UA_MethodCall”指令位于 ② 部分:① 用于准备方法调用的指令 ② 方法调用 ③完成方法调用后用于进行“清理”的指令OPC_UA_MethodCall:调用方法 (S7-1500) 有效性“OPC_UA_MethodCall”指令的以下说明适用于 S7-1500 CPU 固件版本 V2.6 及更高版本。 说明在用户程序中可使用“OPC_UA_MethodCall”指令调用服务器方法。下图所示为用户程序结构。“OPC_UA_MethodCall”指令位于 ② 部分:“OPC_UA_MethodCall”的参数 表格4-84 “OPC_UA_MethodCall”指令的参数 参数 区域中的声明 数据类型 含义 REQ Input BOOL参数中的上升沿 0 → 1 可触发指 令的执行。 ConnectionHdl Input DWORD 已建立连接的唯一标识符。可使用指令“AUTOHOTSPOT”获 取句柄。 Timeout Input TIME 指令执行的Zui长时间(单位为毫 秒)。另请参见“AUTOHOTSPOT”中该 参数的具体说明。 MethodHdl Input DWORD 要调用的方法的句柄。InputArguments InOut VARIANT 指向 PLC 数据类型 (UDT) 或 STRUCT 的变量的指针,变量的名称、编号、顺序和数据类型与 预期输入参数对应。 OutputArguments InOut VARIANT 指向 PLC 数据类型(UDT) 或 STRUCT 的变量的指针,变量的 名称、编号、顺序和数据类型与 预期输出参数对应。 Done Output BOOL执行的状态: • 0:指令的执行中止、尚未完 成或尚未开始 • 1:指令的执行已完成且未出 错 Busy Output BOOL执行状态参数: • 0:指令未在执行 • 1:指令当前正在执行 Error Output BOOL 错误显示 • 0:无错误 •1:发生错误。请参见“状 态”参数。参数 区域中的声明 数据类型 含义 Status Output DWORD错误原因,请参见下文中的“状 态对应的错误编号” MethodResult InOut VARIANT 指向 DWORD类型且包含所调用 服务器方法错误代码(结果)的 变量的指针。 该错误代码由 OPC UA 服务器的 用户程序提供。如果将S7-1500 CPU 作为 OPC UA 服务器,则可 以使用客户端指令 “OPC_UA_MethodCall”读取服务 器指令“OPC_UA_ServerMethodPost”的 “UAMethod_Result”参数,即为 错误代码。 如果未能执行“OPC_UA_MethodCall”指令 (Error = true,Status <> 0), 则不会为MethodResult 设置值。OpcUa_BadOutOfMemory 无 OPC UA 客户端可用的内存。 由于 OPC UA客户端和 OPC UA 服务 器共用存储区,应降低服务器的存储 区要求。 此时,可执行以下操作: • 为 OPC UA 释放少量PLC 变量。 • 减少当前连接到服务器的 OPC UA 客户端的数量。 • 设置更少的订阅。 8006_0000OpcUa_BadEncodingError 解码输出参数时出错 8009_0000 OpcUa_BadUnknownResponse服务器未响应预期的结果数 800A_0000 OpcUa_BadTimeout 发生网络超时。 可能的原因: • 与 OPC UA服务器的连接速度过慢 (容量不足)。 • 网络负载过高。 • OPC UA 服务器不可用。 可能的补救措施: • 检查 OPC UA服务器的 URL • 增加超时设置(为函数块 OPC_UA_Connect 的超时参数设 置更大的值)。 800D_0000OpcUa_BadServerNotConnected 服务器未连接或者连接句柄错误或无 效。 800F_0000OpcUa_BadNothingToDo 不执行任何操作:OPC UA 服务器从 OPC UA 客户端接收到一个空表,其中不含任何指令。 8010_0000 OpcUa_BadTooManyOperations 已超出每个连接可同时调用的“OPC_UA_MethodCall”指令数量 (> 5),请参见: AUTOHOTSPOT。错误代码(十六 进制值) 错误名称说明 8034_0000 BadNodeIdUnknown The node id refers to a node thatdoes not exist in the server address space. 指定 NodeId 的NamespaceIndex 可 能不存在。如果在调用 “OPC_UA_MethodCall”指令时显示错 误代码:另一个可能的原因是在之前调用 OPC_UA_MethodGetHandleList 时 使用了无效的 ObjectID。“OPC_UA_MethodGetHandleList”指 令不评估 ObjectID。 8074_0000OpcUa_BadTypeMismatch 参数变量的类型错误。 8075_0000 OpcUa_BadMethodInvalid指定的 MethodHdl 没有已注册方法 8076_0000 BadArgumentsMissing客户端未指定所有规定的输入参数。 80AB_0000 OpcUa_BadInvalidArgument 输入参数的类型错误。B080_0100 Simatic_BadType_VariantInput1 指令的第一个变量参数指向的参数“MethodResult”的数据类型不正确。 B080_0200 Simatic_BadType_VariantInput2指令的第二个变量参数指向的参数 “InputArguments”的数据类型不正 确。 B080_0300Simatic_BadType_VariantInput3 指令的第三个变量参数指向的参数“OutputArguments”的数据类型不正 确。 B080_1100 Simatic_ArrayElements_TooMany常规错误代码。数组包含的元素过多 时发生该错误。 B080_C400 Simatic_ClientNotEnabled OPC UA客户端已禁用。 B080_C500 Simatic_NothingToDo 不执行任何操作:指令正在使用未包 含任何元素的列表。要求以下说明假定: • 已创建了一个客户端接口,参见“AUTOHOTSPOT”。 • 已创建并组态与 OPC UA服务器的连接,请参见“AUTOHOTSPOT”。 此外,使用“OPC_UA_MethodCall”指令(上述 cf图)还必须满足以下要求: • 提供与 OPC UA 服务器建立连接的句柄。 通过该指令获取连接句柄,请参见“AUTOHOTSPOT”。• 包含用户要通过客户端调用的方法的命名空间的索引。使用指令“OPC_UA_NamespaceGetIndexList”,可获取索引。 要在用户程序中调用的方法所对应的句柄。可使用该指令获取句柄,请参见“AUTOHOTSPOT”。 指令的功能 “OPC_UA_MethodCall”指令可用于调用 OPCUA 服务器中已发布的方法。 已组态连接的使用方法 1. 在“项目树”(Project tree) 区域中,选择将用作客户端的CPU。 2. 在“程序块”(Program blocks) 文件夹中,选择要用于执行客户端指令的函数块。在该示例中,函数块名为“Call_OpenDoor_On_Productionline”。 选择的语言:SCL。 3.使用拖放功能将“OPC_UA_MethodCall”指令从“指令 > 通信 > OPC UA > OPC UA 客户端”(Instructions > Communication > OPC UA > OPC UA Client)文件夹移到编辑器。 4. 选择该调用,作为多重实例。 STEP 7创建该指令的实例并将其命名为“OPC_UA_MethodCall_Instance”。