open62541pp 0.19.0
C++ wrapper of open62541
Loading...
Searching...
No Matches
custom_datatypes/server_custom_datatypes.cpp
#include "custom_datatypes.hpp"
int main() {
opcua::Server server;
// Get custom type definitions from common header
const auto& dataTypePoint = getPointDataType();
const auto& dataTypeMeasurements = getMeasurementsDataType();
const auto& dataTypeOpt = getOptDataType();
const auto& dataTypeUni = getUniDataType();
const auto& dataTypeColor = getColorDataType();
// Provide custom data type definitions to server
dataTypePoint,
dataTypeMeasurements,
dataTypeOpt,
dataTypeUni,
dataTypeColor,
});
// Add data type nodes
opcua::Node structureDataTypeNode{server, opcua::DataTypeId::Structure};
structureDataTypeNode.addDataType(dataTypePoint.typeId(), "PointDataType");
structureDataTypeNode.addDataType(dataTypeMeasurements.typeId(), "MeasurementsDataType");
structureDataTypeNode.addDataType(dataTypeOpt.typeId(), "OptDataType");
structureDataTypeNode.addDataType(dataTypeUni.typeId(), "UniDataType");
opcua::Node enumerationDataTypeNode{server, opcua::DataTypeId::Enumeration};
enumerationDataTypeNode.addDataType(dataTypeColor.typeId(), "Color")
.addProperty(
{0, 0}, // auto-generate node id
"EnumValues",
.setArrayDimensions({0})
.setValue(
{0, {"", "Red"}, {}},
{1, {"", "Green"}, {}},
{2, {"", "Yellow"}, {}},
}}
)
)
.addModellingRule(opcua::ModellingRule::Mandatory);
// Add variable type nodes (optional)
opcua::Node baseDataVariableTypeNode{server, opcua::VariableTypeId::BaseDataVariableType};
auto variableTypePointNode = baseDataVariableTypeNode.addVariableType(
{1, 4243},
"PointType",
.setDataType(dataTypePoint.typeId())
.setValue(opcua::Variant{Point{1, 2, 3}, dataTypePoint})
);
auto variableTypeMeasurementNode = baseDataVariableTypeNode.addVariableType(
{1, 4444},
"MeasurementsType",
.setDataType(dataTypeMeasurements.typeId())
.setValueRank(opcua::ValueRank::Scalar)
.setValue(opcua::Variant{Measurements{}, dataTypeMeasurements})
);
auto variableTypeOptNode = baseDataVariableTypeNode.addVariableType(
{1, 4645},
"OptType",
.setDataType(dataTypeOpt.typeId())
.setValueRank(opcua::ValueRank::Scalar)
.setValue(opcua::Variant{Opt{}, dataTypeOpt})
);
auto variableTypeUniNode = baseDataVariableTypeNode.addVariableType(
{1, 4846},
"UniType",
.setDataType(dataTypeUni.typeId())
.setValueRank(opcua::ValueRank::Scalar)
.setValue(opcua::Variant{Uni{}, dataTypeUni})
);
// Add variable nodes with some values
opcua::Node objectsNode{server, opcua::ObjectId::ObjectsFolder};
const Point point{3.0, 4.0, 5.0};
objectsNode.addVariable(
{1, "Point"},
"Point",
.setDataType(dataTypePoint.typeId())
.setValueRank(opcua::ValueRank::Scalar)
.setValue(opcua::Variant{point, dataTypePoint}),
variableTypePointNode.id()
);
const std::vector<Point> pointVec{{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}};
objectsNode.addVariable(
{1, "PointVec"},
"PointVec",
.setDataType(dataTypePoint.typeId())
.setArrayDimensions({0}) // single dimension but unknown in size
.setValue(opcua::Variant{pointVec, dataTypePoint}),
variableTypePointNode.id()
);
std::vector<float> measurementsValues{19.1F, 20.2F, 19.7F};
const Measurements measurements{
opcua::String{"Test description"},
measurementsValues.size(),
measurementsValues.data(),
};
objectsNode.addVariable(
{1, "Measurements"},
"Measurements",
.setDataType(dataTypeMeasurements.typeId())
.setValueRank(opcua::ValueRank::Scalar)
.setValue(opcua::Variant{measurements, dataTypeMeasurements}),
variableTypeMeasurementNode.id()
);
float optC = 10.10F;
const Opt opt{3, nullptr, &optC};
objectsNode.addVariable(
{1, "Opt"},
"Opt",
.setDataType(dataTypeOpt.typeId())
.setValueRank(opcua::ValueRank::Scalar)
.setValue(opcua::Variant{opt, dataTypeOpt}),
variableTypeOptNode.id()
);
Uni uni{};
uni.switchField = UniSwitch::OptionB;
uni.fields.optionB = UA_STRING_STATIC("test string"); // NOLINT
objectsNode.addVariable(
{1, "Uni"},
"Uni",
.setDataType(dataTypeUni.typeId())
.setValueRank(opcua::ValueRank::Scalar)
.setValue(opcua::Variant{uni, dataTypeUni}),
variableTypeUniNode.id()
);
objectsNode.addVariable(
{1, "Color"},
"Color",
.setDataType(dataTypeColor.typeId())
.setValueRank(opcua::ValueRank::Scalar)
.setValue(opcua::Variant{Color::Green, dataTypeColor})
);
server.run();
}
High-level node class to access node attribute, browse and populate address space.
Definition node.hpp:45
void addCustomDataTypes(Span< const DataType > types)
Add custom data types.
High-level server class.
Definition server.hpp:142
void run()
Run the server's main loop. This method will block until Server::stop is called.
ServerConfig & config() noexcept
View to a contiguous sequence of objects, similar to std::span in C++20.
Definition span.hpp:29
UA_String wrapper class.
Definition types.hpp:256
UA_Variant wrapper class.
Definition types.hpp:1048
UA_EnumValueType wrapper class.
Definition types.hpp:95
UA_VariableAttributes wrapper class.
Definition types.hpp:419
auto & setDataType(NodeId dataType)
Definition types.hpp:444
UA_VariableAttributes wrapper class.
Definition types.hpp:518
auto & setDataType(NodeId dataType)
Definition types.hpp:543
#define UA_STRING_STATIC(CHARS)