OMSimulatorLib
The OMSimulator project is a FMI-based co-simulation environment.
Loading...
Searching...
No Matches
Model.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenModelica.
3 *
4 * Copyright (c) 1998-2026, Open Source Modelica Consortium (OSMC),
5 * c/o Linköpings universitet, Department of Computer and Information Science,
6 * SE-58183 Linköping, Sweden.
7 *
8 * All rights reserved.
9 *
10 * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR
11 * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8.
12 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES
13 * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL
14 * VERSION 3, ACCORDING TO RECIPIENTS CHOICE.
15 *
16 * The OpenModelica software and the OSMC (Open Source Modelica Consortium)
17 * Public License (OSMC-PL) are obtained from OSMC, either from the above
18 * address, from the URLs:
19 * http://www.openmodelica.org or
20 * https://github.com/OpenModelica/ or
21 * http://www.ida.liu.se/projects/OpenModelica,
22 * and in the OpenModelica distribution.
23 *
24 * GNU AGPL version 3 is obtained from:
25 * https://www.gnu.org/licenses/licenses.html#GPL
26 *
27 * This program is distributed WITHOUT ANY WARRANTY; without
28 * even the implied warranty of MERCHANTABILITY or FITNESS
29 * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH
30 * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL.
31 *
32 * See the full OSMC Public License conditions for more details.
33 *
34 */
35
36#ifndef _OMS_MODEL_H_
37#define _OMS_MODEL_H_
38
39#include "Clock.h"
40#include "ComRef.h"
41#include "Element.h"
42#include "ResultWriter.h"
43#include "OMSimulator/Types.h"
44#include "Snapshot.h"
45#include "Values.h"
46#include <assert.h>
47#include <pugixml.hpp>
48
49#include <ctpl_stl.h>
50
51#include <dcp/model/constant/DcpError.hpp>
52#include <dcp/model/constant/DcpState.hpp>
53//#include <dcp/logic/DcpManagerMaster.hpp>
54//#include <dcp/driver/ethernet/udp/UdpDriver.hpp>
55#include <dcp/log/OstreamLog.hpp>
56
58{
60 std::vector<size_t> toServers, toVrs;
61};
62
63//DCP related forward declarations
64class DcpManagerMaster;
65class UdpDriver;
66class SlaveDescription_t;
67
68namespace oms
69{
70 class Component;
71 class ComponentDCP;
72 class Connection;
73 class System;
74
75 class Model
76 {
77 public: // methods
78 ~Model();
79
84 static Model* NewModel(const ComRef& cref);
85
86 const ComRef& getCref() const {return cref;}
87 System* getSystem(const ComRef& cref);
88 oms_status_enu_t delete_(const ComRef& cref);
90 System* getTopLevelSystem() const {return system;}
91 std::string getTempDirectory() const {return tempDir;}
92 oms_status_enu_t rename(const ComRef& cref);
93 oms_status_enu_t rename(const ComRef& cref, const ComRef& newCref);
94 oms_status_enu_t list(const ComRef& cref, char** contents);
95 oms_status_enu_t listVariants(const ComRef& cref, char** contents);
96 oms_status_enu_t addSystem(const ComRef& cref, oms_system_enu_t type);
97 oms_status_enu_t newResources(const ComRef& cref);
98 oms_status_enu_t addResources(const ComRef& cref, const std::string& path);
99 oms_status_enu_t deleteReferencesInSSD(const ComRef& cref);
100 oms_status_enu_t deleteResourcesInSSP(const std::string& filename);
101 oms_status_enu_t duplicateVariant(const ComRef& crefA, const ComRef& crefB);
102 oms_status_enu_t activateVariant(const ComRef& crefA, const ComRef& crefB);
103 oms_status_enu_t referenceResources(const ComRef& cref, const std::string& ssmFile);
104 oms_status_enu_t reduceSSV(const std::string& ssvfile, const std::string& ssmfile, const std::string& filepath);
105 oms_status_enu_t exportToSSD(Snapshot& snapshot) const;
106 oms_status_enu_t exportSnapshot(const ComRef& cref, char** contents);
107 oms_status_enu_t exportSSVTemplate(const ComRef& cref, const std::string& filename);
108 oms_status_enu_t exportSSMTemplate(const ComRef& cref, const std::string& filename);
109 void exportSignalFilter(Snapshot& snapshot) const;
110 void exportUnitDefinitionsToSSD(pugi::xml_node& node) const;
111 void exportEnumerationDefinitionsToSSD(pugi::xml_node& node) const;
112 oms_status_enu_t importFromSnapshot(const Snapshot& snapshot);
113 oms_status_enu_t importSnapshot(const char* snapshot, char** newCref);
114 oms_status_enu_t importSignalFilter(const std::string& filename, const Snapshot& snapshot);
115 oms_status_enu_t exportToFile(const std::string& filename) const;
116 oms_system_enu_t getSystemType(const pugi::xml_node& node, const std::string& sspVersion);
117 oms_system_enu_t getSystemTypeHelper(const pugi::xml_node& node, const std::string& sspVersion);
118 oms_status_enu_t updateParameterBindingsToSSD(pugi::xml_node& node, bool isTopSystemOrModel) const;
119 void copyResources(bool copy_resources) {this->copy_resources = copy_resources;}
121
122 oms::Element** getElements() {return system ? &elements[0] : nullptr;}
123 void writeAllResourcesToFilesystem(std::vector<std::string>& resources, Snapshot& snapshot) const;
124
125 oms_status_enu_t instantiate();
126 oms_status_enu_t initialize();
127 oms_status_enu_t simulate();
128 oms_status_enu_t doStep();
129 oms_status_enu_t stepUntil(double stopTime);
130 oms_status_enu_t terminate();
131 oms_status_enu_t reset();
132
133 oms_status_enu_t configureDcpMaster();
134 oms_status_enu_t addDcpSlave(ComponentDCP *component);
135 oms_status_enu_t addDcpConnection(oms::Connection *connection);
137 oms_status_enu_t startDcpMaster();
138 oms_status_enu_t setDcpPorts(int masterPort, int slavePort);
139
140 oms_modelState_enu_t getModelState() const {return modelState;}
141
142 oms_status_enu_t setStartTime(double value);
143 double getStartTime() const {return startTime;}
144 oms_status_enu_t setStopTime(double value);
145 double getStopTime() const {return stopTime;}
146 double getTime() const;
147
148 oms_status_enu_t setLoggingInterval(double loggingInterval);
149 double getLoggingInterval() const {return loggingInterval;}
150 oms_status_enu_t setResultFile(const std::string& filename, int bufferSize);
151 oms_status_enu_t getResultFile(char** filename, int* bufferSize);
152 oms_status_enu_t emit(double time, bool force=false, bool* emitted=NULL);
153 oms_status_enu_t addSignalsToResults(const char* regex);
154 oms_status_enu_t removeSignalsFromResults(const char* regex);
155 std::string escapeSpecialCharacters(const std::string& regex);
156
157 bool validState(int validStates) const {return (modelState & validStates);}
158
159 bool isIsolatedFMUModel() const {return isolatedFMU;}
161
162 bool useThreadPool() {return (pool != nullptr);}
163 ctpl::thread_pool& getThreadPool() {assert(pool); return *pool;}
164
165 oms_status_enu_t loadSnapshot(const pugi::xml_node& node);
166
167 std::vector<std::string> importedResources;
168
169 std::map<ComRef, char*> ssdVariants;
170
171 std::string getVariantName() {return variantName;}
172
173 private: // methods
174 Model(const ComRef& cref, const std::string& tempDir);
175
176 // stop the compiler generating methods copying the object
177 Model(Model const& copy);
178 Model& operator=(Model const& copy);
179
180 oms_status_enu_t registerSignalsForResultFile();
181
182 private: // attributes
184 System* system = NULL;
185 std::string tempDir;
186
187 std::vector<oms::Element*> elements;
188 bool copy_resources = true;
189
190 oms_modelState_enu_t modelState = oms_modelState_virgin;
191
192 // ssd:DefaultExperiment
193 double startTime = 0.0;
194 double stopTime = 1.0;
195
197 double lastEmit;
198 double loggingInterval = 0.0;
199 int bufferSize = 10;
201
203
204 std::string resultFilename;
205 std::string signalFilterFilename = "resources/signalFilter.xml";
206
207 std::string variantName = "SystemStructure.ssd";
208
209 std::vector<std::string> externalResources;
210
211 bool isolatedFMU = false;
212
213 ctpl::thread_pool* pool = nullptr;
214
216
217 DcpManagerMaster *dcpManager;
218 UdpDriver* dcpDriver;
222 std::map<ComponentDCP*, size_t> dcpComponents;
223 std::shared_ptr<SlaveDescription_t> dcpInternalSystemSlaveDescription;
224 std::map<ComponentDCP*, std::shared_ptr<SlaveDescription_t>> dcpComponentToSlaveDescriptionMap;
225 std::vector<std::shared_ptr<SlaveDescription_t>> dcpSlaveDescriptions;
226 std::vector<DcpConnection> dcpConnections;
227 OstreamLog dcpLog;
229 double dcpTime = 0; //TODO: Start time should not be hard-coded
230 double dcpStopTime = 10; //TODO: Should not be hard-coded
231 std::map<uint8_t, uint64_t> dcpReceivedAcks;
232 std::map<uint8_t, uint8_t> dcpNumOfCmd;
233 uint8_t dcpMaxInitRuns = 0;
243
244
245 void dcpInitialize();
246 void dcpConfiguration();
247 void dcpConfigure();
248 void dcpRun(DcpState currentState, uint8_t sender);
249 void dcpDoStep();
250 void dcpStop();
251 void dcpDeregister(uint8_t sender);
252 void dcpSendOutputs(DcpState currentState, uint8_t sender);
253 void dcpReceiveAck(uint8_t sender, uint16_t);
254 void dcpReceiveNAck(uint8_t sender, uint16_t pduSeqId, DcpError errorCode);
255 void dcpDataReceived(uint16_t dataId, size_t length, uint8_t payload[]);
256 void dcpReceiveStateChangedNotification(uint8_t sender, DcpState state);
257 };
258}
259
260#endif
Definition Clock.h:43
ComRef - component reference.
Definition ComRef.h:51
Definition ComponentDCP.h:62
Definition Component.h:65
**
Definition Connection.h:52
Element.
Definition Element.h:51
Definition Model.h:76
oms_status_enu_t setDcpPorts(int masterPort, int slavePort)
Definition Model.cpp:1623
oms_status_enu_t setStopTime(double value)
Definition Model.cpp:1168
oms_system_enu_t getSystemType(const pugi::xml_node &node, const std::string &sspVersion)
Definition Model.cpp:979
void dcpInitialize()
Definition Model.cpp:1959
double getLoggingInterval() const
Definition Model.h:149
void dcpDataReceived(uint16_t dataId, size_t length, uint8_t payload[])
Definition Model.cpp:1900
ResultWriter * resultFile
Definition Model.h:196
std::string tempDir
Definition Model.h:185
double loggingInterval
Definition Model.h:198
oms_status_enu_t reduceSSV(const std::string &ssvfile, const std::string &ssmfile, const std::string &filepath)
Definition Model.cpp:741
std::vector< std::string > externalResources
list of external ssv or ssm resources from filesystem
Definition Model.h:209
double getStartTime() const
Definition Model.h:143
void startDcpMasterThread()
Definition Model.cpp:1630
oms_status_enu_t addSystem(const ComRef &cref, oms_system_enu_t type)
Definition Model.cpp:823
oms_status_enu_t importSignalFilter(const std::string &filename, const Snapshot &snapshot)
Definition Model.cpp:1854
size_t dcpSlavesStopped
Definition Model.h:239
size_t dcpSlavesDeregistered
Definition Model.h:240
oms_status_enu_t importSnapshot(const char *snapshot, char **newCref)
Definition Model.cpp:323
port_t dcpSlavePort
Definition Model.h:220
uint8_t dcpIntializationRuns
Definition Model.h:234
Clock clock
Definition Model.h:200
bool useThreadPool()
Definition Model.h:162
std::map< uint8_t, uint64_t > dcpReceivedAcks
Definition Model.h:231
std::vector< std::string > importedResources
list of imported resources from ssp
Definition Model.h:167
uint8_t dcpMaxInitRuns
Definition Model.h:233
double dcpComStep
Definition Model.h:228
oms_status_enu_t updateParameterBindingsToSSD(pugi::xml_node &node, bool isTopSystemOrModel) const
Definition Model.cpp:640
oms_status_enu_t exportSSVTemplate(const ComRef &cref, const std::string &filename)
Definition Model.cpp:521
void dcpDoStep()
Definition Model.cpp:2035
oms_status_enu_t simulate()
Definition Model.cpp:1281
double getTime() const
Definition Model.cpp:1174
std::string getVariantName()
Definition Model.h:171
oms::Element ** getElements()
Definition Model.h:122
void dcpConfiguration()
Definition Model.cpp:1971
std::map< ComponentDCP *, size_t > dcpComponents
Definition Model.h:222
oms_status_enu_t importFromSnapshot(const Snapshot &snapshot)
Definition Model.cpp:889
oms_status_enu_t doStep()
Definition Model.cpp:1364
System * system
Definition Model.h:184
int bufferSize
Definition Model.h:199
UdpDriver * dcpDriver
Definition Model.h:218
oms_status_enu_t reset()
Definition Model.cpp:1441
OstreamLog dcpLog
Definition Model.h:227
System * getSystem(const ComRef &cref)
Definition Model.cpp:389
double startTime
Definition Model.h:193
uint8_t dcpSlavesWaitingForInitialize
Definition Model.h:235
void dcpReceiveAck(uint8_t sender, uint16_t)
Definition Model.cpp:1885
oms_modelState_enu_t getModelState() const
Definition Model.h:140
oms_status_enu_t registerSignalsForResultFile()
Definition Model.cpp:1650
oms_status_enu_t terminate()
Definition Model.cpp:1411
std::map< ComRef, char * > ssdVariants
list of all variants copied when user create a new variant using oms_duplicateVariant()
Definition Model.h:169
Component * getComponent(const ComRef &cref)
Definition Model.cpp:406
System * getTopLevelSystem() const
Definition Model.h:90
~Model()
Definition Model.cpp:76
oms_status_enu_t instantiate()
Definition Model.cpp:1181
std::string resultFilename
default <name>_res.mat
Definition Model.h:204
std::shared_ptr< SlaveDescription_t > dcpInternalSystemSlaveDescription
Definition Model.h:223
void dcpStop()
Definition Model.cpp:2049
oms_status_enu_t removeSignalsFromResults(const char *regex)
Definition Model.cpp:1747
std::string escapeSpecialCharacters(const std::string &regex)
Definition Model.cpp:1833
void exportSignalFilter(Snapshot &snapshot) const
Definition Model.cpp:1755
oms_status_enu_t exportToFile(const std::string &filename) const
Definition Model.cpp:1053
oms_status_enu_t exportSSMTemplate(const ComRef &cref, const std::string &filename)
Definition Model.cpp:593
oms_modelState_enu_t modelState
Definition Model.h:190
void exportEnumerationDefinitionsToSSD(pugi::xml_node &node) const
Definition Model.cpp:1805
std::vector< oms::Element * > elements
Definition Model.h:187
double lastEmit
Definition Model.h:197
static Model * NewModel(const ComRef &cref)
Definition Model.cpp:104
Values values
Definition Model.h:202
oms_status_enu_t startDcpMaster()
Definition Model.cpp:1600
bool copyResources()
Definition Model.h:120
oms_status_enu_t addSignalsToResults(const char *regex)
Definition Model.cpp:1739
uint8_t serversRunPastStopTime
Definition Model.h:241
std::string signalFilterFilename
Definition Model.h:205
oms_system_enu_t getSystemTypeHelper(const pugi::xml_node &node, const std::string &sspVersion)
Definition Model.cpp:1030
oms_status_enu_t emit(double time, bool force=false, bool *emitted=NULL)
Definition Model.cpp:1661
ctpl::thread_pool * pool
Definition Model.h:213
void writeAllResourcesToFilesystem(std::vector< std::string > &resources, Snapshot &snapshot) const
Definition Model.cpp:1107
ctpl::thread_pool & getThreadPool()
Definition Model.h:163
uint8_t dcpSlavesWaitingForConfigure
Definition Model.h:237
DcpManagerMaster * dcpManager
Definition Model.h:217
oms_status_enu_t loadSnapshot(const pugi::xml_node &node)
Definition Model.cpp:177
oms_status_enu_t setLoggingInterval(double loggingInterval)
Definition Model.cpp:1642
void dcpDeregister(uint8_t sender)
Definition Model.cpp:2062
oms_status_enu_t dcpMasterThreadReturnValue
Definition Model.h:242
oms_status_enu_t deleteReferencesInSSD(const ComRef &cref)
Definition Model.cpp:784
void dcpReceiveStateChangedNotification(uint8_t sender, DcpState state)
Definition Model.cpp:1907
std::vector< DcpConnection > dcpConnections
Definition Model.h:226
double dcpTime
Definition Model.h:229
oms_status_enu_t rename(const ComRef &cref)
Definition Model.cpp:138
std::vector< std::shared_ptr< SlaveDescription_t > > dcpSlaveDescriptions
Definition Model.h:225
oms_status_enu_t addDcpConnection(oms::Connection *connection)
Definition Model.cpp:1521
void dcpConfigure()
Definition Model.cpp:2018
oms_status_enu_t referenceResources(const ComRef &cref, const std::string &ssmFile)
Definition Model.cpp:711
oms_status_enu_t configureDcpMaster()
Definition Model.cpp:1462
oms_status_enu_t stepUntil(double stopTime)
Definition Model.cpp:1384
bool isolatedFMU
Definition Model.h:211
uint8_t dcpSlavesWaitingForStep
Definition Model.h:238
double dcpStopTime
Definition Model.h:230
bool copy_resources
Definition Model.h:188
oms_status_enu_t addResources(const ComRef &cref, const std::string &path)
Definition Model.cpp:683
oms_status_enu_t duplicateVariant(const ComRef &crefA, const ComRef &crefB)
Definition Model.cpp:212
Model & operator=(Model const &copy)
not implemented
oms_status_enu_t getResultFile(char **filename, int *bufferSize)
Definition Model.cpp:1731
oms_status_enu_t listVariants(const ComRef &cref, char **contents)
Definition Model.cpp:293
port_t dcpMasterPort
Definition Model.h:219
oms_status_enu_t setStartTime(double value)
Definition Model.cpp:1159
int dcpSlaveCount
Definition Model.h:221
void setIsolatedFMUModel()
Definition Model.h:160
oms_status_enu_t delete_(const ComRef &cref)
Definition Model.cpp:420
void dcpRun(DcpState currentState, uint8_t sender)
Definition Model.cpp:2029
std::map< uint8_t, uint8_t > dcpNumOfCmd
Definition Model.h:232
const ComRef & getCref() const
Definition Model.h:86
oms_status_enu_t exportToSSD(Snapshot &snapshot) const
Definition Model.cpp:849
std::string getTempDirectory() const
Definition Model.h:91
void copyResources(bool copy_resources)
Definition Model.h:119
oms_status_enu_t newResources(const ComRef &cref)
Definition Model.cpp:662
oms_status_enu_t activateVariant(const ComRef &crefA, const ComRef &crefB)
Definition Model.cpp:258
oms_status_enu_t addDcpSlave(ComponentDCP *component)
Definition Model.cpp:1499
ComRef new_root_cref
Definition Model.h:215
Model(Model const &copy)
not implemented
double getStopTime() const
Definition Model.h:145
bool validState(int validStates) const
Definition Model.h:157
double stopTime
Definition Model.h:194
oms_status_enu_t list(const ComRef &cref, char **contents)
Definition Model.cpp:438
void dcpReceiveNAck(uint8_t sender, uint16_t pduSeqId, DcpError errorCode)
Definition Model.cpp:1893
ComRef cref
Definition Model.h:183
std::map< ComponentDCP *, std::shared_ptr< SlaveDescription_t > > dcpComponentToSlaveDescriptionMap
Definition Model.h:224
oms_status_enu_t deleteResourcesInSSP(const std::string &filename)
Definition Model.cpp:805
void dcpSendOutputs(DcpState currentState, uint8_t sender)
Definition Model.cpp:2067
void exportUnitDefinitionsToSSD(pugi::xml_node &node) const
Definition Model.cpp:1774
bool isIsolatedFMUModel() const
Definition Model.h:159
uint8_t dcpSlavesWaitingForConfiguration
Definition Model.h:236
oms_status_enu_t initialize()
Definition Model.cpp:1208
oms_status_enu_t setResultFile(const std::string &filename, int bufferSize)
Definition Model.cpp:1688
std::string variantName
default name
Definition Model.h:207
oms_status_enu_t exportSnapshot(const ComRef &cref, char **contents)
Definition Model.cpp:505
Definition ResultWriter.h:73
Definition Snapshot.h:51
Definition System.h:72
Definition Values.h:50
Definition AlgLoop.h:52
Definition Model.h:58
std::vector< size_t > toServers
Definition Model.h:60
size_t fromServer
Definition Model.h:59
std::vector< size_t > toVrs
Definition Model.h:60
size_t fromVr
Definition Model.h:59