Quellcode durchsuchen

Server: Add an example for matrix variables. Fix #2389

Julius Pfrommer vor 5 Jahren
Ursprung
Commit
a4cfd801b2
2 geänderte Dateien mit 59 neuen und 0 gelöschten Zeilen
  1. 30 0
      examples/tutorial_server_variable.c
  2. 29 0
      tests/server/check_services_nodemanagement.c

+ 30 - 0
examples/tutorial_server_variable.c

@@ -42,6 +42,35 @@ addVariable(UA_Server *server) {
                               UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr, NULL, NULL);
 }
 
+static void
+addMatrixVariable(UA_Server *server) {
+    UA_VariableAttributes attr = UA_VariableAttributes_default;
+    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Double Matrix");
+    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
+
+    /* Set the variable value constraints */
+    attr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
+    attr.valueRank = UA_VALUERANK_TWO_DIMENSIONS;
+    UA_UInt32 arrayDims[2] = {2,2};
+    attr.arrayDimensions = arrayDims;
+    attr.arrayDimensionsSize = 2;
+
+    /* Set the value. The array dimensions need to be the same for the value. */
+    UA_Double zero[4] = {0.0, 0.0, 0.0, 0.0};
+    UA_Variant_setArray(&attr.value, zero, 4, &UA_TYPES[UA_TYPES_DOUBLE]);
+    attr.value.arrayDimensions = arrayDims;
+    attr.value.arrayDimensionsSize = 2;
+
+    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "double.matrix");
+    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "double matrix");
+    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);
+}
+
 /**
  * Now we change the value with the write service. This uses the same service
  * implementation that can also be reached over the network by an OPC UA client.
@@ -118,6 +147,7 @@ int main(void) {
 #endif
 
     addVariable(server);
+    addMatrixVariable(server);
     writeVariable(server);
     writeWrongVariable(server);
 

+ 29 - 0
tests/server/check_services_nodemanagement.c

@@ -57,6 +57,34 @@ START_TEST(AddVariableNode) {
     ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
 } END_TEST
 
+START_TEST(AddVariableNode_Matrix) {
+    /* Add a variable node to the address space */
+    UA_VariableAttributes attr = UA_VariableAttributes_default;
+    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Double Matrix");
+    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
+
+    attr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
+    attr.valueRank = UA_VALUERANK_TWO_DIMENSIONS;
+    UA_UInt32 arrayDims[2] = {2,2};
+    attr.arrayDimensions = arrayDims;
+    attr.arrayDimensionsSize = 2;
+    UA_Double zero[4] = {0.0, 0.0, 0.0, 0.0};
+    UA_Variant_setArray(&attr.value, zero, 4, &UA_TYPES[UA_TYPES_DOUBLE]);
+    attr.value.arrayDimensions = arrayDims;
+    attr.value.arrayDimensionsSize = 2;
+
+    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "double.matrix");
+    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "double matrix");
+    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
+    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
+    UA_StatusCode res =
+        UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
+                                  parentReferenceNodeId, myIntegerName,
+                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
+                                  attr, NULL, NULL);
+    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
+} END_TEST
+
 static UA_NodeId pointTypeId;
 
 static void
@@ -565,6 +593,7 @@ int main(void) {
     TCase *tc_addnodes = tcase_create("addnodes");
     tcase_add_checked_fixture(tc_addnodes, setup, teardown);
     tcase_add_test(tc_addnodes, AddVariableNode);
+    tcase_add_test(tc_addnodes, AddVariableNode_Matrix);
     tcase_add_test(tc_addnodes, InstantiateVariableTypeNode);
     tcase_add_test(tc_addnodes, InstantiateVariableTypeNodeWrongDims);
     tcase_add_test(tc_addnodes, InstantiateVariableTypeNodeLessDims);