#server auf raspi bauen: wget https://github.com/open62541/open62541/archive/refs/tags/v1.3.tar.gz tar -xzf v1.3.tar.gz open62541-1.3/ cd open62541-1.3/ sudo apt install git build-essential gcc pkg-config cmake python3 mkdir build cd build cmake -DUA_ENABLE_AMALGAMATION=ON .. make ls open62541.* mkdir -p ~/development/opc-ua/server cp open62541.* ~/development/opc-ua/server/ cd ~/development/opc-ua/server/ #folgenden quelltext unter "meinServer.c" speichern: <-----------------------------------------------------------------> #include "open62541.h" #include #include static volatile UA_Boolean running = true; static void stopHandler(int sig) { UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "received ctrl-c"); running = false; } int main(void) { signal(SIGINT, stopHandler); signal(SIGTERM, stopHandler); UA_Server *server = UA_Server_new(); UA_ServerConfig_setDefault(UA_Server_getConfig(server)); UA_StatusCode retval = UA_Server_run(server, &running); UA_Server_delete(server); return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE; } <-----------------------------------------------------------------> #serverquelltext compilieren: gcc -std=c99 open62541.c meinServer.c -o server #server-binary starten: ./server #client auf pc bauen: sudo apt install python3-pip python3-venv #virtuelle umgebung aktivieren: python3 -m venv client cd client source ./bin/activate pip install asyncua uals --url=opc.tcp://:4840 pip3 install opcua-client pyqtgraph cryptography numpy #client starten opcua-client #server um variable erweitern #include "open62541.h" #include #include static volatile UA_Boolean running = true; static void stopHandler(int sig) { UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "received ctrl-c"); running = false; } static void addVariable(UA_Server *server) { /* Define the attribute of the myInteger variable node */ UA_VariableAttributes attr = UA_VariableAttributes_default; UA_Int32 myInteger = 42; UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]); attr.description = UA_LOCALIZEDTEXT("en-US","the answer"); attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer"); attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId; attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE; /* Add the variable node to the information model */ UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer"); UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer"); UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES); UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId, myIntegerName, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr, NULL, NULL); } int main(void) { signal(SIGINT, stopHandler); signal(SIGTERM, stopHandler); UA_Server *server = UA_Server_new(); UA_ServerConfig_setDefault(UA_Server_getConfig(server)); addVariable(server); UA_StatusCode retval = UA_Server_run(server, &running); UA_Server_delete(server); return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE; }