Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
into-cpp-fmi
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Into-cps
github-into-cps
into-cpp-fmi
Commits
a525e937
Commit
a525e937
authored
7 years ago
by
Kenneth Lausdahl
Browse files
Options
Downloads
Patches
Plain Diff
first stability edition
parent
1f01bd6a
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/main_stability.cpp
+160
-60
160 additions, 60 deletions
src/main_stability.cpp
with
160 additions
and
60 deletions
src/main_stability.cpp
+
160
−
60
View file @
a525e937
...
@@ -6,6 +6,9 @@
...
@@ -6,6 +6,9 @@
using
namespace
std
;
using
namespace
std
;
using
namespace
fmi2
;
using
namespace
fmi2
;
#define SIM20
#ifdef OM
#define FMU1_NAME "MassSpringDamper1.fmu"
#define FMU1_NAME "MassSpringDamper1.fmu"
#define FMU1_GUID "{8bb9f6f8-3436-4f87-93bb-6981ab480991}"
#define FMU1_GUID "{8bb9f6f8-3436-4f87-93bb-6981ab480991}"
#define FMU1_m1 7
#define FMU1_m1 7
...
@@ -26,8 +29,50 @@ using namespace fmi2;
...
@@ -26,8 +29,50 @@ using namespace fmi2;
#define FMU2_x1 6
#define FMU2_x1 6
#define FMU2_v1 5
#define FMU2_v1 5
int
main
(
int
argc
,
char
*
argv
[])
#elif defined(SIM20)
{
#define FMU1_NAME "MassSpringDamper1.fmu"
#define FMU1_GUID "{da03fa66-a02a-43d6-a906-db865e2ea044}"
#define FMU1_m1 2
#define FMU1_d1 1
#define FMU1_c1 0
#define FMU1_fk 5
#define FMU1_x1 7
#define FMU1_v1 6
#define FMU2_NAME "MassSpringDamper2.fmu"
#define FMU2_GUID "{9113a387-2c02-42ae-ae68-5073bf845034}"
#define FMU2_m2 4
#define FMU2_dc 3
#define FMU2_d2 1
#define FMU2_cc 2
#define FMU2_c2 0
#define FMU2_fk 7
#define FMU2_x2 11
#define FMU2_v2 10
#define FMU2_x1 8
#define FMU2_v1 9
#endif
fmi2Status
setReal
(
shared_ptr
<
FmuComponent
>
comp
,
fmi2ValueReference
id
,
fmi2Real
val
)
{
const
fmi2ValueReference
vr
[]
{
id
};
size_t
nvr
=
1
;
fmi2Real
value
[]
{
val
};
return
comp
->
fmu
->
setReal
(
comp
->
component
,
vr
,
nvr
,
value
);
}
fmi2Real
getReal
(
shared_ptr
<
FmuComponent
>
comp
,
fmi2ValueReference
id
)
{
const
fmi2ValueReference
vr
[]
{
id
};
size_t
nvr
=
1
;
fmi2Real
value
[
1
];
comp
->
fmu
->
getReal
(
comp
->
component
,
vr
,
nvr
,
value
);
return
value
[
0
];
}
int
main
(
int
argc
,
char
*
argv
[])
{
auto
path1
=
argv
[
1
];
auto
path1
=
argv
[
1
];
auto
path2
=
argv
[
2
];
auto
path2
=
argv
[
2
];
...
@@ -54,95 +99,150 @@ int main(int argc, char *argv[])
...
@@ -54,95 +99,150 @@ int main(int argc, char *argv[])
cout
<<
"Instantiating path 1 fmu"
<<
endl
;
cout
<<
"Instantiating path 1 fmu"
<<
endl
;
auto
callback1
=
make_shared
<
fmi2
::
Callback
>
();
auto
callback1
=
make_shared
<
fmi2
::
Callback
>
();
auto
instance1
=
fmu1
->
instantiate
(
FMU1_NAME
,
fmi2CoSimulation
,
FMU1_GUID
,
true
,
true
,
callback1
);
auto
instance1
=
fmu1
->
instantiate
(
FMU1_NAME
,
fmi2CoSimulation
,
FMU1_GUID
,
true
,
true
,
callback1
);
cout
<<
"path 1 fmu instance: "
<<
instance1
->
component
<<
endl
;
cout
<<
"path 1 fmu instance: "
<<
instance1
->
component
<<
endl
;
cout
<<
"Instantiating path 2 fmu"
<<
endl
;
cout
<<
"Instantiating path 2 fmu"
<<
endl
;
auto
callback2
=
make_shared
<
fmi2
::
Callback
>
();
auto
callback2
=
make_shared
<
fmi2
::
Callback
>
();
auto
instance2
=
fmu2
->
instantiate
(
FMU2_NAME
,
fmi2CoSimulation
,
FMU2_GUID
,
true
,
true
,
callback2
);
auto
instance2
=
fmu2
->
instantiate
(
FMU2_NAME
,
fmi2CoSimulation
,
FMU2_GUID
,
true
,
true
,
callback2
);
cout
<<
"path 1 fmu instance: "
<<
instance2
->
component
<<
endl
;
cout
<<
"path 1 fmu instance: "
<<
instance2
->
component
<<
endl
;
//set parameters
fmi2ValueReference
vr1
[
3
]
=
{
FMU1_m1
,
FMU1_d1
,
FMU1_c1
};
fmi2Real
val1
[
3
]
=
{
1.0
,
1.0
,
1.0
};
instance1
->
fmu
->
setReal
(
instance1
->
component
,
vr1
,
3
,
val1
);
fmi2ValueReference
vr2
[
5
]
=
{
FMU2_m2
,
FMU2_dc
,
FMU2_d2
,
FMU2_cc
,
FMU2_c2
};
fmi2Real
val2
[
5
]
=
{
1.0
,
50.0
,
2.0
,
1.0
,
1.0
};
instance2
->
fmu
->
setReal
(
instance2
->
component
,
vr2
,
5
,
val2
);
// Simulation
// Simulation
auto
time
=
0.0
;
auto
time
=
0.0
;
auto
endTime
=
1.0
;
auto
endTime
=
1
0
.0
;
auto
stepSize
=
0.01
;
auto
stepSize
=
0.
0
01
;
//prepare
//prepare
instance1
->
fmu
->
setupExperiment
(
instance1
->
component
,
false
,
0.0
,
0.0
,
true
,
endTime
);
instance1
->
fmu
->
setupExperiment
(
instance1
->
component
,
false
,
0.0
,
0.0
,
true
,
endTime
);
instance1
->
fmu
->
enterInitializationMode
(
instance1
->
component
);
instance1
->
fmu
->
enterInitializationMode
(
instance1
->
component
);
instance1
->
fmu
->
exitInitializationMode
(
instance1
->
component
);
instance2
->
fmu
->
setupExperiment
(
instance2
->
component
,
false
,
0.0
,
0.0
,
true
,
endTime
);
instance2
->
fmu
->
setupExperiment
(
instance2
->
component
,
false
,
0.0
,
0.0
,
true
,
endTime
);
instance2
->
fmu
->
enterInitializationMode
(
instance2
->
component
);
instance2
->
fmu
->
enterInitializationMode
(
instance2
->
component
);
//set parameters
fmi2ValueReference
vr2
[
7
]
=
{
0
,
1
,
2
,
3
,
4
,
5
,
6
};
fmi2Real
val2
[
7
]
=
{
1.0
,
2.0
,
100.0
,
100.0
,
1.0
,
0.0
,
0.0
};
instance2
->
fmu
->
setReal
(
instance2
->
component
,
vr2
,
7
,
val2
);
fmi2ValueReference
vr1
[
5
]
=
{
0
,
1
,
2
,
3
,
4
};
fmi2Real
val1
[
5
]
=
{
1.0
,
1.0
,
1.0
,
0.0
,
1.0
};
instance1
->
fmu
->
setReal
(
instance1
->
component
,
vr1
,
5
,
val1
);
setReal
(
instance2
,
8
,
0.0
);
setReal
(
instance2
,
9
,
0.0
);
setReal
(
instance1
,
5
,
0.0
);
setReal
(
instance2
,
8
,
0.0
);
setReal
(
instance2
,
9
,
0.0
);
setReal
(
instance2
,
5
,
0.0
);
// setReal(instance1, 4, 1.0);
// setReal(instance1, 3, 0.0);
//
// setReal(instance1, FMU1_c1, 1.0);
// setReal(instance1, FMU1_d1, 1.0);
// setReal(instance1, FMU1_m1, 1.0);
//
// setReal(instance1, FMU1_fk, 0.0);
// fmi2ValueReference vr2[7] =
// { FMU2_m2, FMU2_dc, FMU2_d2, FMU2_cc, FMU2_c2,8,9 };
// fmi2Real val2[7] =
// { 1.0, 100.0, 2.0, 1.0, 1.0,0.0,0.0 };
// instance2->fmu->setReal(instance2->component, vr2, 7, val2);
// setReal(instance2, 6, 0.0);
// setReal(instance2, 5, 0.0);
//
// setReal(instance2, FMU2_c2, 1.0);
// setReal(instance2, FMU2_d2, 2.0);
// setReal(instance2, FMU2_cc, 1.0);
// setReal(instance2, FMU2_dc, 100.0);
// setReal(instance2, FMU2_m2, 1.0);
//
// setReal(instance2, FMU2_x2, 0.0);
// setReal(instance2, FMU2_v2, 0.0);
instance1
->
fmu
->
exitInitializationMode
(
instance1
->
component
);
instance2
->
fmu
->
exitInitializationMode
(
instance2
->
component
);
instance2
->
fmu
->
exitInitializationMode
(
instance2
->
component
);
fmi2ValueReference
vr2_out
[
1
]
=
fmi2ValueReference
vr2_out
[
3
]
=
{
FMU2_fk
,
FMU2_x2
,
FMU2_v2
};
{
FMU2_fk
};
fmi2ValueReference
vr2_in
[
2
]
=
{
FMU2_x1
,
FMU2_v1
};
fmi2ValueReference
vr2_in
[
2
]
=
{
FMU2_x1
,
FMU2_v1
};
fmi2ValueReference
vr1_out
[
2
]
=
fmi2ValueReference
vr1_out
[
2
]
=
{
FMU1_x1
,
FMU1_v1
};
{
FMU2_x1
,
FMU1_v1
};
fmi2ValueReference
vr1_in
[
1
]
=
{
FMU1_fk
};
fmi2ValueReference
vr1_in
[
1
]
=
{
FMU2_fk
};
fmi2Real
vals
[
2
]
=
fmi2Real
vals
[
3
]
=
{
0.0
,
0.0
,
0.0
};
{
0.0
,
0.0
};
fmi2Real
vals2
[
2
]
=
fmi2Real
vals2
[
2
]
=
{
0.0
,
0.0
};
{
0.0
,
0.0
};
std
::
fstream
fs
;
std
::
fstream
fs
;
fs
.
open
(
"result.csv"
,
std
::
fstream
::
in
|
std
::
fstream
::
out
|
std
::
fstream
::
trunc
);
//\\psf\Home\data\into-cps\into-cps_stability-check-project\mass-springer-damper\FMUs\Dymola
//fs.open("result.csv", std::fstream::in | std::fstream::out | std::fstream::trunc);
fs
.
open
(
"
\\\\
psf
\\
Home
\\
data
\\
into-cps
\\
into-cps_stability-check-project
\\
mass-springer-damper
\\
FMUs
\\
Dymola
\\
result.csv"
,
std
::
fstream
::
in
|
std
::
fstream
::
out
|
std
::
fstream
::
trunc
);
//cout << "------------ Header ---------" << endl;
//cout << "------------ Header ---------" << endl;
fs
<<
"
\"
{FMU2}.FMU2Instance.fk
\"
,
\"
{FMU}.FMUInstance.x1
\"
,
\"
{FMU}.FMUInstance.
v1
\"
"
<<
endl
;
fs
<<
"
\"
time
\"
,
\"
fk
\"
,
\"
x2
\"
,
\"
v2
\"
,
\"
x1
\"
,
\"
v1
\"
"
<<
endl
;
fmi2FMUstate
s1
;
instance1
->
fmu
->
getFMUstate
(
instance1
->
component
,
&
s1
);
fmi2FMUstate
s2
;
instance2
->
fmu
->
getFMUstate
(
instance2
->
component
,
&
s2
);
instance2
->
fmu
->
getReal
(
instance2
->
component
,
vr2_out
,
1
,
vals
);
//34 = 2
instance2
->
fmu
->
getReal
(
instance2
->
component
,
vr2_out
,
3
,
vals
);
cout
<<
"fk: "
<<
vals
[
0
]
<<
endl
;
//2 fk
cout
<<
"x2: "
<<
vals
[
1
]
<<
endl
;
//2 x2
cout
<<
"v2: "
<<
vals
[
2
]
<<
endl
;
//2 v2
instance1
->
fmu
->
getReal
(
instance1
->
component
,
vr1_out
,
2
,
vals2
);
instance1
->
fmu
->
getReal
(
instance1
->
component
,
vr1_out
,
2
,
vals2
);
while
(
time
<
endTime
)
cout
<<
"x1: "
<<
vals2
[
0
]
<<
endl
;
// 1 x1
{
cout
<<
"v1: "
<<
vals2
[
1
]
<<
endl
;
//1 v1
fmi2FMUstate
s1
=
NULL
;
instance1
->
fmu
->
getFMUstate
(
instance1
->
component
,
&
s1
);
fmi2FMUstate
s2
=
NULL
;
instance2
->
fmu
->
getFMUstate
(
instance2
->
component
,
&
s2
);
bool
f
=
true
;
while
(
time
<
endTime
)
{
cout
<<
"."
;
// get
// get
for
(
int
repeat
=
0
;
repeat
<
6
;
repeat
++
)
for
(
int
repeat
=
0
;
repeat
<
6
;
repeat
++
)
{
{
fs
<<
time
<<
","
;
instance1
->
fmu
->
setFMUstate
(
instance1
->
component
,
s1
);
instance1
->
fmu
->
setFMUstate
(
instance1
->
component
,
s1
);
instance2
->
fmu
->
setFMUstate
(
instance2
->
component
,
s2
);
instance2
->
fmu
->
setFMUstate
(
instance2
->
component
,
s2
);
//copy fk
fs
<<
vals
[
0
]
<<
","
;
//2 fk
instance1
->
fmu
->
setReal
(
instance1
->
component
,
vr1_in
,
1
,
vals
);
fs
<<
vals
[
1
]
<<
","
;
//2 x2
fs
<<
vals
[
0
]
<<
","
;
fs
<<
vals
[
2
]
<<
","
;
//2 v2
instance2
->
fmu
->
setReal
(
instance2
->
component
,
vr2_in
,
2
,
vals2
);
fs
<<
vals2
[
0
]
<<
","
;
// 1 x1
fs
<<
vals2
[
0
]
<<
","
<<
vals2
[
1
]
<<
endl
;
fs
<<
vals2
[
1
];
//1 v1
fs
<<
endl
;
//dostep
instance1
->
fmu
->
doStep
(
instance1
->
component
,
time
,
stepSize
,
false
);
//copy fk
instance2
->
fmu
->
doStep
(
instance2
->
component
,
time
,
stepSize
,
false
);
//i/f(!f){
//f=true;
//get
instance1
->
fmu
->
setReal
(
instance1
->
component
,
vr1_in
,
1
,
vals
);
instance2
->
fmu
->
getReal
(
instance2
->
component
,
vr2_out
,
1
,
vals
);
instance1
->
fmu
->
getReal
(
instance1
->
component
,
vr1_out
,
2
,
vals2
);
instance2
->
fmu
->
setReal
(
instance2
->
component
,
vr2_in
,
2
,
vals2
);
}
// fs << vals2[0] << "," << vals2[1] << endl;
//}
//dostep
instance1
->
fmu
->
doStep
(
instance1
->
component
,
time
,
stepSize
,
false
);
instance2
->
fmu
->
doStep
(
instance2
->
component
,
time
,
stepSize
,
false
);
//get
instance2
->
fmu
->
getReal
(
instance2
->
component
,
vr2_out
,
3
,
vals
);
instance1
->
fmu
->
getReal
(
instance1
->
component
,
vr1_out
,
2
,
vals2
);
}
time
+=
stepSize
;
time
+=
stepSize
;
instance1
->
fmu
->
getFMUstate
(
instance1
->
component
,
&
s1
);
instance1
->
fmu
->
getFMUstate
(
instance1
->
component
,
&
s1
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment