我的程序发布版本有问题。当我在计算机上启动它时,一切正常。没有例外,没有问题或任何其他阻止我使用该程序的东西。一旦我将exe及其所需的DLL压缩并发送给朋友,他立即收到错误" .exe已停止工作"当他试图运行服务器时。
顺便说一下,它是一个用" open62541"构建的opc服务器。运行时,它通过使用名为" Snap7"的库从PLC中检索值。是的,他和我在同一个网络中,因此原因不能是网络连接。
我们都在使用Windows,而我的IDE是Visual Studio 2015.不幸的是,我不能在这里发布任何代码,因为它太过分了。此外,我不知道要发布哪些代码,因为我不知道错误出现的位置和原因。
编辑:这是我的代码,我得到了例外。 " UA_Server_addVariableNode"" 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, ¤tPlc.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, ¤tPlc.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;
}
}
答案 0 :(得分:0)
我在&#34; open62541&#34;中进行了一些研究后解决了这个问题。报头中。
在0的情况下,我使用表达式&#34;&amp; UA_STRING(currentPlc.ip)&#34;在&#34; UA_Variant_setScalar&#34;我认为函数返回&#34; currentPlc.ip&#34;的等效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;