10
10
"pyfmi" , reason = "pyfmi is required for testing the produced FMU"
11
11
)
12
12
13
-
14
13
DEMO = "pythonslave.py"
15
14
16
15
@@ -51,7 +50,7 @@ def test_integration_reset(tmp_path):
51
50
52
51
53
52
@pytest .mark .integration
54
- def test_integration_state (tmp_path ):
53
+ def test_integration_get_state (tmp_path ):
55
54
script_file = Path (__file__ ).parent / DEMO
56
55
57
56
FmuBuilder .build_FMU (script_file , dest = tmp_path , needsExecutionTool = "false" , canGetAndSetFMUstate = "true" )
@@ -69,6 +68,7 @@ def step(model):
69
68
t += dt
70
69
71
70
model = pyfmi .load_fmu (str (fmu ))
71
+ model .initialize ()
72
72
step (model )
73
73
state = model .get_fmu_state ()
74
74
assert model .get_real ([vr ])[0 ] == pytest .approx (dt , rel = 1e-7 )
@@ -82,23 +82,79 @@ def step(model):
82
82
83
83
84
84
@pytest .mark .integration
85
- def test_integration_get (tmp_path ):
85
+ def test_integration_get_serialize_state (tmp_path ):
86
+ fmpy = pytest .importorskip (
87
+ "fmpy" , reason = "fmpy is not available for testing the produced FMU"
88
+ )
89
+
90
+ script_file = Path (__file__ ).parent / DEMO
91
+
92
+ FmuBuilder .build_FMU (script_file , dest = tmp_path )
93
+
94
+ fmu = tmp_path / "PythonSlave.fmu"
95
+ assert fmu .exists ()
96
+
97
+ model_description = fmpy .read_model_description (fmu )
98
+
99
+ unzipdir = fmpy .extract (fmu )
100
+
101
+ model = fmpy .fmi2 .FMU2Slave (
102
+ guid = model_description .guid ,
103
+ unzipDirectory = unzipdir ,
104
+ modelIdentifier = model_description .coSimulation .modelIdentifier ,
105
+ instanceName = 'instance1' )
106
+
107
+ vr = 5 # realOut
108
+ t = 0.0
109
+ dt = 0.1
86
110
111
+ def step (model ):
112
+ nonlocal t
113
+ model .doStep (t , dt )
114
+ t += dt
115
+
116
+ model .instantiate ()
117
+ model .setupExperiment ()
118
+ model .enterInitializationMode ()
119
+ model .exitInitializationMode ()
120
+
121
+ step (model )
122
+ state = model .getFMUstate ()
123
+ assert model .getReal ([vr ])[0 ] == pytest .approx (dt , rel = 1e-7 )
124
+ step (model )
125
+ assert model .getReal ([vr ])[0 ] == pytest .approx (dt * 2 , rel = 1e-7 )
126
+ model .setFMUstate (state )
127
+ assert model .getReal ([vr ])[0 ] == pytest .approx (dt , rel = 1e-7 )
128
+ step (model )
129
+ assert model .getReal ([vr ])[0 ] == pytest .approx (dt * 3 , rel = 1e-7 )
130
+
131
+ serialize_fm_ustate = model .serializeFMUstate (state )
132
+ model .freeFMUstate (state )
133
+ de_serialize_fm_ustate = model .deSerializeFMUstate (serialize_fm_ustate )
134
+ model .setFMUstate (de_serialize_fm_ustate )
135
+ assert model .getReal ([vr ])[0 ] == pytest .approx (dt , rel = 1e-7 )
136
+
137
+ model .freeFMUstate (de_serialize_fm_ustate )
138
+ model .terminate ()
139
+
140
+
141
+ @pytest .mark .integration
142
+ def test_integration_get (tmp_path ):
87
143
script_file = Path (__file__ ).parent / DEMO
88
144
89
145
FmuBuilder .build_FMU (script_file , dest = tmp_path , needsExecutionTool = "false" )
90
146
91
147
fmu = tmp_path / "PythonSlave.fmu"
92
148
assert fmu .exists ()
93
149
model = pyfmi .load_fmu (str (fmu ))
94
-
150
+
95
151
to_test = {
96
152
"intParam" : 42 ,
97
153
"intOut" : 23 ,
98
154
"realOut" : 3.0 ,
99
155
"booleanVariable" : True ,
100
156
"stringVariable" : "Hello World!" ,
101
- "realIn" : 2. / 3. ,
157
+ "realIn" : 2. / 3. ,
102
158
"booleanParameter" : False ,
103
159
"stringParameter" : "dog"
104
160
}
@@ -107,33 +163,32 @@ def test_integration_get(tmp_path):
107
163
for key , value in to_test .items ():
108
164
var = variables [key ]
109
165
if var .type == pyfmi .fmi .FMI2_INTEGER :
110
- model_value = model .get_integer ([var .value_reference ,])[0 ]
166
+ model_value = model .get_integer ([var .value_reference , ])[0 ]
111
167
elif var .type == pyfmi .fmi .FMI2_REAL :
112
- model_value = model .get_real ([var .value_reference ,])[0 ]
168
+ model_value = model .get_real ([var .value_reference , ])[0 ]
113
169
elif var .type == pyfmi .fmi .FMI2_BOOLEAN :
114
- model_value = model .get_boolean ([var .value_reference ,])[0 ]
170
+ model_value = model .get_boolean ([var .value_reference , ])[0 ]
115
171
elif var .type == pyfmi .fmi .FMI2_STRING :
116
- model_value = model .get_string ([var .value_reference ,])[0 ]
172
+ model_value = model .get_string ([var .value_reference , ])[0 ]
117
173
else :
118
174
pytest .xfail ("Unsupported type" )
119
-
175
+
120
176
assert model_value == value
121
177
122
178
123
179
@pytest .mark .integration
124
180
def test_integration_set (tmp_path ):
125
-
126
181
script_file = Path (__file__ ).parent / DEMO
127
182
128
183
FmuBuilder .build_FMU (script_file , dest = tmp_path , needsExecutionTool = "false" )
129
184
130
185
fmu = tmp_path / "PythonSlave.fmu"
131
186
assert fmu .exists ()
132
187
model = pyfmi .load_fmu (str (fmu ))
133
-
188
+
134
189
to_test = {
135
190
"intParam" : 20 ,
136
- "realIn" : 1. / 3. ,
191
+ "realIn" : 1. / 3. ,
137
192
"booleanParameter" : True ,
138
193
"stringParameter" : "cat"
139
194
}
@@ -143,19 +198,19 @@ def test_integration_set(tmp_path):
143
198
var = variables [key ]
144
199
if var .type == pyfmi .fmi .FMI2_INTEGER :
145
200
model .set_integer ([var .value_reference , ], [value , ])
146
- model_value = model .get_integer ([var .value_reference ,])[0 ]
201
+ model_value = model .get_integer ([var .value_reference , ])[0 ]
147
202
elif var .type == pyfmi .fmi .FMI2_REAL :
148
203
model .set_real ([var .value_reference , ], [value , ])
149
- model_value = model .get_real ([var .value_reference ,])[0 ]
204
+ model_value = model .get_real ([var .value_reference , ])[0 ]
150
205
elif var .type == pyfmi .fmi .FMI2_BOOLEAN :
151
206
model .set_boolean ([var .value_reference , ], [value , ])
152
- model_value = model .get_boolean ([var .value_reference ,])[0 ]
207
+ model_value = model .get_boolean ([var .value_reference , ])[0 ]
153
208
elif var .type == pyfmi .fmi .FMI2_STRING :
154
209
model .set_string ([var .value_reference , ], [value , ])
155
- model_value = model .get_string ([var .value_reference ,])[0 ]
210
+ model_value = model .get_string ([var .value_reference , ])[0 ]
156
211
else :
157
212
pytest .xfail ("Unsupported type" )
158
-
213
+
159
214
assert model_value == value
160
215
161
216
0 commit comments