0

我的程序的发布版本有问题。当我在我的电脑上启动它时,一切正常。没有例外,没有问题或任何其他阻止我使用该程序的东西。一旦我压缩 exe 及其所需的 DLL 并将其发送给朋友,当他尝试运行服务器时,他立即收到错误“.exe 已停止工作”。

顺便说一句,它是一个用“open62541”构建的 opc 服务器。运行时,它使用名为“Snap7”的库从 PLC 中检索值。是的,他和我位于同一个网络中,因此原因不可能是网络连接。

我们都在使用 Windows,我的 IDE 是 Visual Studio 2015。不幸的是,我不能在这里发布任何代码,因为它太多了。此外,我真的不知道要发布哪个代码,因为我不知道错误出现的位置和原因。

编辑:这是我得到异常的代码。调用“UA_Server_addVariableNode”时总是抛出它。

for (int i = 0; i < 4; ++i)
{
    UA_VariableAttributes attrAttr;
    UA_VariableAttributes_init(&attrAttr);
    UA_QualifiedName attrBrowseName;
    UA_QualifiedName_init(&attrBrowseName);

    switch (i)
    {
    case 0: //Setting the ip-address
        UA_Variant_setScalar(&attrAttr.value, &UA_STRING(currentPlc.ip), &UA_TYPES[UA_TYPES_STRING]);
        attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "IPAddress");
        attrBrowseName = UA_QUALIFIEDNAME(1, "IPAddress");

        //Add the PLC value to the PLC-ObjectType
        UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
            attrBrowseName,
            UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
        break;

    case 1: //Setting the rack
        UA_Variant_setScalar(&attrAttr.value, &currentPlc.rack, &UA_TYPES[UA_TYPES_INT32]);
        attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "Rack");
        attrBrowseName = UA_QUALIFIEDNAME(1, "Rack");

        //Add the PLC value to the PLC-ObjectType
        UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
            attrBrowseName,
            UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
        break;

    case 2: //Setting the slot
        UA_Variant_setScalar(&attrAttr.value, &currentPlc.slot, &UA_TYPES[UA_TYPES_INT32]);
        attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "Slot");
        attrBrowseName = UA_QUALIFIEDNAME(1, "Slot");

        //Add the PLC value to the PLC-ObjectType
        UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
            attrBrowseName,
            UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
        break;

    case 3: //Setting "isAvailable" to give information about the PLC's status
        UA_Variant_setScalar(&attrAttr.value, &isAvailable, &UA_TYPES[UA_TYPES_BOOLEAN]);
        attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "isAvailable");
        attrBrowseName = UA_QUALIFIEDNAME(1, "isAvailable");

        //Add the PLC value to the PLC-ObjectType
        UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
            attrBrowseName,
            UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
        break;
    }
}
4

1 回答 1

0

在对“open62541”标头进行一些研究后,我解决了这个问题。

在情况 0 中,我在“UA_Variant_setScalar”函数中使用表达式“&UA_STRING(currentPlc.ip)”,我认为它返回了“currentPlc.ip”的等效 UA_String。

但它实际上返回了一个临时对象,该对象在函数调用后被删除。结果,对象的实际地址为空,因此我遇到了访问冲突。我只是添加了一行,将返回的对象传递给一个变量,然后使用变量的地址。

case 0: //Setting the ip-address
        auto value = UA_STRING(currentPlc.ip);
        UA_Variant_setScalar(&attrAttr.value, &value, &UA_TYPES[UA_TYPES_STRING]);
        attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "IPAddress");
        attrBrowseName = UA_QUALIFIEDNAME(1, "IPAddress");

        //Add the PLC value to the PLC-ObjectType
        UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
            attrBrowseName,
            UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
        break;
于 2017-03-31T08:39:05.630 回答