PLCnext API Documentation  22.9.0.33
DynamicPortsProgramBase.hpp
1 //
3 // Copyright PHOENIX CONTACT Electronics GmbH
4 //
6 #pragma once
7 #include "Arp/System/Core/Arp.h"
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 
13 namespace Arp { namespace Plc { namespace Commons { namespace Esm
14 {
15 
19 
27 template<typename TProgram, size_t MaxNumPorts>
29 {
30 public: // construction/destruction
34  DynamicPortsProgramBase(const String& programName, TypeDomain& typeDomain);
35 
36 protected:
41  template<typename T>
42  void AddPort(const String& portName, T& value, StandardAttribute standardAttributes);
43 
45  void ReplaceProgramTypeDefinition() const;
46 
49 
52 
53 private: // fields
54  TypeDomain& typeDomain;
55  std::array<byte*, MaxNumPorts> ports{};
56  DynamicPortsBuilder dynamicPortsBuilder;
57 };
58 
59 template<typename TProgram, size_t MaxNumPorts>
61  const String& programName, TypeDomain& typeDomain)
62  : ProgramBase(programName),
63  typeDomain(typeDomain),
64  dynamicPortsBuilder(DynamicPortsBuilder::Create<TProgram>(
65  typeDomain.GetLibraryNamespace(), programName, this->ports, offsetof(TProgram, ports)))
66 {
67 }
68 
69 template<typename TProgram, size_t MaxNumPorts>
70 template<typename T>
72  const String& portName, T& value, StandardAttribute standardAttributes)
73 {
74  this->dynamicPortsBuilder.AddPort(portName, value, standardAttributes);
75 }
76 
77 template<typename TProgram, size_t MaxNumPorts>
79 {
81  this->typeDomain.ReplaceTypeDefinition(TypeDefinition(this->dynamicPortsBuilder.GetTypeDefinition()));
82 }
83 
84 template<typename TProgram, size_t MaxNumPorts>
86 {
87  return this->dynamicPortsBuilder;
88 }
89 
90 template<typename TProgram, size_t MaxNumPorts>
92 {
93  return this->dynamicPortsBuilder;
94 }
95 
96 }}}} // end of namespace Arp::Plc::Commons::Esm
Base class for a program providing dynamic ports
Definition: DynamicPortsProgramBase.hpp:29
DynamicPortsBuilder & GetDynamicPortsBuilder()
Returns a reference to the DynamicPortsBuilder
Definition: DynamicPortsProgramBase.hpp:85
DynamicPortsProgramBase(const String &programName, TypeDomain &typeDomain)
Constructs an ProgramBase instance.
Definition: DynamicPortsProgramBase.hpp:60
void ReplaceProgramTypeDefinition() const
Updates the type definition for this program in the library's TypeDomain
Definition: DynamicPortsProgramBase.hpp:78
void AddPort(const String &portName, T &value, StandardAttribute standardAttributes)
Adds a variable as dynamic port
Definition: DynamicPortsProgramBase.hpp:71
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
Root namespace for the PLCnext API