#include "custom_datatypes.hpp"
int main() {
const auto& dataTypePoint = getPointDataType();
const auto& dataTypeMeasurements = getMeasurementsDataType();
const auto& dataTypeOpt = getOptDataType();
const auto& dataTypeUni = getUniDataType();
const auto& dataTypeColor = getColorDataType();
dataTypePoint,
dataTypeMeasurements,
dataTypeOpt,
dataTypeUni,
dataTypeColor,
});
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},
"EnumValues",
.setArrayDimensions({0})
.setValue(
{0, {"", "Red"}, {}},
{1, {"", "Green"}, {}},
{2, {"", "Yellow"}, {}},
}}
)
)
opcua::Node baseDataVariableTypeNode{server, opcua::VariableTypeId::BaseDataVariableType};
auto variableTypePointNode = baseDataVariableTypeNode.addVariableType(
{1, 4243},
"PointType",
);
auto variableTypeMeasurementNode = baseDataVariableTypeNode.addVariableType(
{1, 4444},
"MeasurementsType",
);
auto variableTypeOptNode = baseDataVariableTypeNode.addVariableType(
{1, 4645},
"OptType",
);
auto variableTypeUniNode = baseDataVariableTypeNode.addVariableType(
{1, 4846},
"UniType",
);
opcua::Node objectsNode{server, opcua::ObjectId::ObjectsFolder};
const Point point{3.0, 4.0, 5.0};
objectsNode.addVariable(
{1, "Point"},
"Point",
variableTypePointNode.id()
);
const std::vector<Point> pointVec{{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}};
objectsNode.addVariable(
{1, "PointVec"},
"PointVec",
.setArrayDimensions({0})
variableTypePointNode.id()
);
std::vector<float> measurementsValues{19.1F, 20.2F, 19.7F};
const Measurements measurements{
measurementsValues.size(),
measurementsValues.data(),
};
objectsNode.addVariable(
{1, "Measurements"},
"Measurements",
variableTypeMeasurementNode.id()
);
float optC = 10.10F;
const Opt opt{3, nullptr, &optC};
objectsNode.addVariable(
{1, "Opt"},
"Opt",
variableTypeOptNode.id()
);
Uni uni{};
uni.switchField = UniSwitch::OptionB;
objectsNode.addVariable(
{1, "Uni"},
"Uni",
variableTypeUniNode.id()
);
objectsNode.addVariable(
{1, "Color"},
"Color",
);
}
High-level node class to access node attribute, browse and populate address space.
void addCustomDataTypes(Span< const DataType > types)
Add custom data types.
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.
UA_Variant wrapper class.
UA_EnumValueType wrapper class.
UA_VariableAttributes wrapper class.
auto & setDataType(NodeId dataType)
UA_VariableAttributes wrapper class.
auto & setDataType(NodeId dataType)
#define UA_STRING_STATIC(CHARS)