PLCnext API Documentation 25.0.2.69
DynamicPortsProgramBase.hpp
1
2//
3// Copyright Phoenix Contact GmbH & Co. KG
4//
6#pragma once
8#include "Arp/Plc/Commons/Esm/ProgramBase.hpp"
9#include "Arp/Plc/Commons/Meta/DynamicPortsBuilder.hpp"
10#include "Arp/Plc/Commons/Meta/TypeSystem/TypeDefinition.hpp"
11#include "Arp/Plc/Commons/Meta/TypeSystem/TypeDomain.hpp"
12
13namespace Arp { namespace Plc { namespace Commons { namespace Esm
14{
15
19
27template<typename TProgram, size_t MaxNumPorts>
29{
30public: // construction/destruction
31 DynamicPortsProgramBase(const String& programName, TypeDomain& typeDomain);
32
33protected:
34 template<typename T>
35 void AddPort(const String& portName, T& value, StandardAttribute standardAttributes);
36
40
41private: // fields
42 TypeDomain& typeDomain;
43 std::array<byte*, MaxNumPorts> ports{};
44 DynamicPortsBuilder dynamicPortsBuilder;
45};
46
50template<typename TProgram, size_t MaxNumPorts>
52 const String& programName, TypeDomain& typeDomain)
53 : ProgramBase(programName),
54 typeDomain(typeDomain),
55 dynamicPortsBuilder(DynamicPortsBuilder::Create<TProgram>(
56 typeDomain.GetLibraryNamespace(), programName, this->ports, offsetof(TProgram, ports)))
57{
58}
59
64template<typename TProgram, size_t MaxNumPorts>
65template<typename T>
67 const String& portName, T& value, StandardAttribute standardAttributes)
68{
69 this->dynamicPortsBuilder.AddPort(portName, value, standardAttributes);
70}
71
73template<typename TProgram, size_t MaxNumPorts>
75{
77 this->typeDomain.ReplaceTypeDefinition(TypeDefinition(this->dynamicPortsBuilder.GetTypeDefinition()));
78}
79
81template<typename TProgram, size_t MaxNumPorts>
83{
84 return this->dynamicPortsBuilder;
85}
86
88template<typename TProgram, size_t MaxNumPorts>
90{
91 return this->dynamicPortsBuilder;
92}
93
94}}}} // end of namespace Arp::Plc::Commons::Esm
This class represents the Arp String. The implementation is based on std::string.
Definition: String.hpp:39
Base class for a program providing dynamic ports
Definition: DynamicPortsProgramBase.hpp:29
DynamicPortsBuilder & GetDynamicPortsBuilder()
Returns a reference to the DynamicPortsBuilder
Definition: DynamicPortsProgramBase.hpp:82
DynamicPortsProgramBase(const String &programName, TypeDomain &typeDomain)
Constructs an ProgramBase instance.
Definition: DynamicPortsProgramBase.hpp:51
void ReplaceProgramTypeDefinition() const
Updates the type definition for this program in the library's TypeDomain
Definition: DynamicPortsProgramBase.hpp:74
void AddPort(const String &portName, T &value, StandardAttribute standardAttributes)
Adds a variable as dynamic port
Definition: DynamicPortsProgramBase.hpp:66
This class implements the base functionality of a program.
Definition: ProgramBase.hpp:15
Provides the infrastructure for dynamic port provision
Definition: DynamicPortsBuilder.hpp:18
Defines the meta information of a type
Definition: TypeDefinition.hpp:23
Container for the type information of a library
Definition: TypeDomain.hpp:26
StandardAttribute
Standard attributes to types
Definition: StandardAttribute.hpp:18
@ Create
Creates a new file. If the file already exists, it is overwritten.
Root namespace for the PLCnext API