node-opcua-address-space 2.55.0 → 2.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/LICENSE +20 -20
  2. package/dist/source/address_space_ts.js.map +1 -1
  3. package/dist/source/continuation_points/continuation_point_manager.d.ts +27 -16
  4. package/dist/source/continuation_points/continuation_point_manager.js +141 -48
  5. package/dist/source/continuation_points/continuation_point_manager.js.map +1 -1
  6. package/dist/source/helpers/adjust_browse_direction.js.map +1 -1
  7. package/dist/source/helpers/call_helpers.js.map +1 -1
  8. package/dist/source/helpers/check_event_clause.js.map +1 -1
  9. package/dist/source/helpers/coerce_enum_value.js.map +1 -1
  10. package/dist/source/helpers/ensure_secure_access.js +0 -13
  11. package/dist/source/helpers/ensure_secure_access.js.map +1 -1
  12. package/dist/source/helpers/resolve_opaque_on_address_space.js.map +1 -1
  13. package/dist/source/loader/load_nodeset2.js +29 -3
  14. package/dist/source/loader/load_nodeset2.js.map +1 -1
  15. package/dist/source/loader/namespace_post_step.js.map +1 -1
  16. package/dist/source/loader/register_node_promoter.js.map +1 -1
  17. package/dist/source/namespace_machine_state.d.ts +1 -1
  18. package/dist/source/pseudo_session.js +23 -24
  19. package/dist/source/pseudo_session.js.map +1 -1
  20. package/dist/source/session_context.js +2 -2
  21. package/dist/source/session_context.js.map +1 -1
  22. package/dist/source/set_namespace_meta_data.js.map +1 -1
  23. package/dist/src/address_space.d.ts +7 -8
  24. package/dist/src/address_space.js +2 -2
  25. package/dist/src/address_space.js.map +1 -1
  26. package/dist/src/address_space_private.d.ts +4 -5
  27. package/dist/src/alarms_and_conditions/check_where_clause.js +1 -1
  28. package/dist/src/alarms_and_conditions/check_where_clause.js.map +1 -1
  29. package/dist/src/alarms_and_conditions/condition.js.map +1 -1
  30. package/dist/src/alarms_and_conditions/extract_event_fields.js.map +1 -1
  31. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js +2 -1
  32. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js.map +1 -1
  33. package/dist/src/alarms_and_conditions/ua_base_event_impl.js.map +1 -1
  34. package/dist/src/alarms_and_conditions/ua_condition_impl.js.map +1 -1
  35. package/dist/src/alarms_and_conditions/ua_discrete_alarm_impl.js.map +1 -1
  36. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm_impl.js.map +1 -1
  37. package/dist/src/alarms_and_conditions/ua_limit_alarm_impl.js.map +1 -1
  38. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.js.map +1 -1
  39. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.js.map +1 -1
  40. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm_impl.js.map +1 -1
  41. package/dist/src/base_node_impl.js.map +1 -1
  42. package/dist/src/data_access/add_dataItem_stuff.js.map +1 -1
  43. package/dist/src/data_access/check_variant_compatibility_ua_analog_item.js.map +1 -1
  44. package/dist/src/data_access/ua_multistate_discrete_impl.js.map +1 -1
  45. package/dist/src/event_data.js.map +1 -1
  46. package/dist/src/extension_object_array_node.js.map +1 -1
  47. package/dist/src/historical_access/address_space_historical_data_node.js +28 -59
  48. package/dist/src/historical_access/address_space_historical_data_node.js.map +1 -1
  49. package/dist/src/namespace_impl.d.ts +2 -2
  50. package/dist/src/namespace_impl.js +6 -6
  51. package/dist/src/namespace_impl.js.map +1 -1
  52. package/dist/src/nodeid_manager.js +1 -4
  53. package/dist/src/nodeid_manager.js.map +1 -1
  54. package/dist/src/nodeset_tools/nodeset_to_xml.js +1 -1
  55. package/dist/src/nodeset_tools/nodeset_to_xml.js.map +1 -1
  56. package/dist/src/nodeset_tools/typedictionary_to_xml.d.ts +1 -1
  57. package/dist/src/nodeset_tools/typedictionary_to_xml.js +3 -2
  58. package/dist/src/nodeset_tools/typedictionary_to_xml.js.map +1 -1
  59. package/dist/src/reference_impl.js +3 -1
  60. package/dist/src/reference_impl.js.map +1 -1
  61. package/dist/src/state_machine/finite_state_machine.js.map +1 -1
  62. package/dist/src/state_machine/ua_shelving_state_machine_ex.js.map +1 -1
  63. package/dist/src/state_machine/ua_two_state_variable.js.map +1 -1
  64. package/dist/src/tool_isSupertypeOf.js.map +1 -1
  65. package/dist/src/ua_method_impl.d.ts +3 -2
  66. package/dist/src/ua_method_impl.js +5 -0
  67. package/dist/src/ua_method_impl.js.map +1 -1
  68. package/dist/src/ua_object_impl.d.ts +10 -6
  69. package/dist/src/ua_object_impl.js +1 -1
  70. package/dist/src/ua_object_impl.js.map +1 -1
  71. package/dist/src/ua_object_type_impl.js.map +1 -1
  72. package/dist/src/ua_reference_type_impl.js +3 -1
  73. package/dist/src/ua_reference_type_impl.js.map +1 -1
  74. package/dist/src/ua_variable_impl.d.ts +8 -7
  75. package/dist/src/ua_variable_impl.js +6 -10
  76. package/dist/src/ua_variable_impl.js.map +1 -1
  77. package/dist/src/ua_variable_type_impl.js.map +1 -1
  78. package/dist/src/ua_view_impl.js.map +1 -1
  79. package/distHelpers/add_event_generator_object.js.map +1 -1
  80. package/distHelpers/alarms_and_conditions_demo.js.map +1 -1
  81. package/distHelpers/boiler_system.d.ts +1 -1
  82. package/distHelpers/boiler_system.js +1 -2
  83. package/distHelpers/boiler_system.js.map +1 -1
  84. package/distHelpers/create_minimalist_address_space_nodeset.js +1 -0
  85. package/distHelpers/create_minimalist_address_space_nodeset.js.map +1 -1
  86. package/distHelpers/date_utils.d.ts +3 -0
  87. package/distHelpers/date_utils.js +10 -0
  88. package/distHelpers/date_utils.js.map +1 -0
  89. package/distHelpers/get_mini_address_space.js.map +1 -1
  90. package/distHelpers/index.d.ts +2 -0
  91. package/distHelpers/index.js +2 -0
  92. package/distHelpers/index.js.map +1 -1
  93. package/distHelpers/mock_session.d.ts +14 -0
  94. package/distHelpers/mock_session.js +26 -0
  95. package/distHelpers/mock_session.js.map +1 -0
  96. package/generate.js +1 -1
  97. package/nodeJS.d.ts +1 -1
  98. package/package.json +32 -32
  99. package/source/address_space_ts.ts +0 -3
  100. package/source/continuation_points/continuation_point_manager.ts +178 -64
  101. package/source/helpers/adjust_browse_direction.ts +3 -3
  102. package/source/helpers/argument_list.ts +1 -1
  103. package/source/helpers/call_helpers.ts +0 -1
  104. package/source/helpers/check_event_clause.ts +2 -9
  105. package/source/helpers/coerce_enum_value.ts +3 -3
  106. package/source/helpers/ensure_secure_access.ts +1 -13
  107. package/source/helpers/resolve_opaque_on_address_space.ts +4 -1
  108. package/source/interfaces/alarms_and_conditions/condition_info_i.ts +13 -13
  109. package/source/interfaces/data_access/ua_multistate_value_discrete_ex.ts +0 -1
  110. package/source/interfaces/data_access/ua_y_array_item_ex.ts +4 -2
  111. package/source/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.ts +5 -1
  112. package/source/interfaces/state_machine/ua_state_machine_type.ts +2 -2
  113. package/source/loader/load_nodeset2.ts +39 -3
  114. package/source/loader/namespace_post_step.ts +1 -2
  115. package/source/loader/register_node_promoter.ts +4 -1
  116. package/source/namespace.ts +4 -6
  117. package/source/namespace_machine_state.ts +1 -2
  118. package/source/pseudo_session.ts +37 -29
  119. package/source/session_context.ts +2 -9
  120. package/source/set_namespace_meta_data.ts +21 -15
  121. package/source/xml_writer.ts +0 -1
  122. package/source_nodejs/index.ts +1 -1
  123. package/src/address_space.ts +17 -16
  124. package/src/address_space_private.ts +7 -12
  125. package/src/alarms_and_conditions/check_where_clause.ts +21 -22
  126. package/src/alarms_and_conditions/condition.ts +0 -1
  127. package/src/alarms_and_conditions/extract_event_fields.ts +0 -1
  128. package/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.ts +14 -10
  129. package/src/alarms_and_conditions/ua_base_event_impl.ts +11 -15
  130. package/src/alarms_and_conditions/ua_condition_impl.ts +35 -40
  131. package/src/alarms_and_conditions/ua_discrete_alarm_impl.ts +39 -33
  132. package/src/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.ts +2 -2
  133. package/src/alarms_and_conditions/ua_exclusive_level_alarm_impl.ts +4 -5
  134. package/src/alarms_and_conditions/ua_limit_alarm_impl.ts +16 -16
  135. package/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.ts +8 -8
  136. package/src/alarms_and_conditions/ua_off_normal_alarm_impl.ts +9 -10
  137. package/src/alarms_and_conditions/ua_system_off_normal_alarm_impl.ts +2 -4
  138. package/src/apply_condition_refresh.ts +2 -2
  139. package/src/base_node_impl.ts +2 -2
  140. package/src/data_access/add_dataItem_stuff.ts +4 -4
  141. package/src/data_access/check_variant_compatibility_ua_analog_item.ts +12 -15
  142. package/src/data_access/ua_multistate_discrete_impl.ts +6 -3
  143. package/src/data_access/ua_multistate_value_discrete.ts +1 -1
  144. package/src/event_data.ts +1 -7
  145. package/src/extension_object_array_node.ts +4 -10
  146. package/src/historical_access/address_space_historical_data_node.ts +39 -63
  147. package/src/namespace_impl.ts +5 -5
  148. package/src/namespace_private.ts +1 -1
  149. package/src/nodeid_manager.ts +2 -5
  150. package/src/nodeset_tools/nodeset_to_xml.ts +5 -5
  151. package/src/nodeset_tools/typedictionary_to_xml.ts +7 -5
  152. package/src/reference_impl.ts +4 -2
  153. package/src/state_machine/finite_state_machine.ts +426 -428
  154. package/src/state_machine/ua_shelving_state_machine_ex.ts +19 -9
  155. package/src/state_machine/ua_two_state_variable.ts +5 -7
  156. package/src/tool_isSupertypeOf.ts +2 -6
  157. package/src/ua_condition_type.ts +0 -1
  158. package/src/ua_method_impl.ts +25 -9
  159. package/src/ua_object_impl.ts +13 -8
  160. package/src/ua_object_type_impl.ts +7 -4
  161. package/src/ua_reference_type_impl.ts +6 -12
  162. package/src/ua_variable_impl.ts +11 -15
  163. package/src/ua_variable_type_impl.ts +2 -2
  164. package/src/ua_view_impl.ts +3 -6
  165. package/testHelpers.d.ts +1 -1
  166. package/test_helpers/add_event_generator_object.ts +6 -5
  167. package/test_helpers/alarms_and_conditions_demo.ts +9 -8
  168. package/test_helpers/assertHasMatchingReference.ts +43 -43
  169. package/test_helpers/boiler_system.ts +610 -618
  170. package/test_helpers/create_minimalist_address_space_nodeset.ts +13 -13
  171. package/test_helpers/date_utils.ts +5 -0
  172. package/test_helpers/dump_statemachine.ts +2 -2
  173. package/test_helpers/get_address_space_fixture.ts +30 -30
  174. package/test_helpers/get_mini_address_space.ts +42 -42
  175. package/test_helpers/index.ts +13 -11
  176. package/test_helpers/mock_session.ts +34 -0
  177. package/test_helpers/test_fixtures/dataType_in_separateNamespace.xml +150 -150
  178. package/test_helpers/test_fixtures/dataType_in_separateNamespace_basic.xml +57 -57
  179. package/test_helpers/test_fixtures/dataType_in_separateNamespace_mix.xml +135 -135
  180. package/test_helpers/test_fixtures/dataType_withEnumeration.xml +82 -82
  181. package/test_helpers/test_fixtures/dataType_with_isOptionSet.xml +194 -194
  182. package/test_helpers/test_fixtures/dataType_with_union.xml +1 -1
  183. package/test_helpers/test_fixtures/fixture_empty_nodeset2.xml +106 -106
  184. package/test_helpers/test_fixtures/fixture_simple_statemachine_nodeset2.xml +1303 -1303
  185. package/test_helpers/test_fixtures/fixuture_nodeset_objects_with_some_methods.xml +362 -362
  186. package/test_helpers/test_fixtures/issue_846.xml +3172 -3172
  187. package/test_helpers/test_fixtures/issue_899_variable_with_nodeid_value.xml +32 -32
  188. package/test_helpers/test_fixtures/mini.nodeset.withVariousVariables.xml +194 -194
  189. package/test_helpers/test_fixtures/minimalist_nodeset_with_models.xml +8 -8
  190. package/test_helpers/test_fixtures/minimalist_nodeset_with_models_more_complex.xml +16 -16
  191. package/test_helpers/test_fixtures/nodeset_with_analog_items.xml +45 -45
  192. package/dist/source/interfaces/alarms_and_conditions/ua_condition_base_i.d.ts +0 -23
  193. package/dist/source/interfaces/alarms_and_conditions/ua_condition_base_i.js +0 -3
  194. package/dist/source/interfaces/alarms_and_conditions/ua_condition_base_i.js.map +0 -1
  195. package/dist/source/interfaces/data_access/ua_discrete_item.d.ts +0 -6
  196. package/dist/source/interfaces/data_access/ua_discrete_item.js +0 -3
  197. package/dist/source/interfaces/data_access/ua_discrete_item.js.map +0 -1
  198. package/dist/source/interfaces/data_access/ua_multistate_discrete.d.ts +0 -25
  199. package/dist/source/interfaces/data_access/ua_multistate_discrete.js +0 -3
  200. package/dist/source/interfaces/data_access/ua_multistate_discrete.js.map +0 -1
  201. package/dist/source/interfaces/data_access/ua_multistate_value_discrete.d.ts +0 -27
  202. package/dist/source/interfaces/data_access/ua_multistate_value_discrete.js +0 -3
  203. package/dist/source/interfaces/data_access/ua_multistate_value_discrete.js.map +0 -1
  204. package/dist/source/interfaces/data_access/ua_two_state_discrete.d.ts +0 -17
  205. package/dist/source/interfaces/data_access/ua_two_state_discrete.js +0 -3
  206. package/dist/source/interfaces/data_access/ua_two_state_discrete.js.map +0 -1
  207. package/dist/source/interfaces/data_access/ua_y_array_item.d.ts +0 -19
  208. package/dist/source/interfaces/data_access/ua_y_array_item.js +0 -3
  209. package/dist/source/interfaces/data_access/ua_y_array_item.js.map +0 -1
  210. package/dist/source/interfaces/state_machine/exclusive_limit_state_machine.d.ts +0 -11
  211. package/dist/source/interfaces/state_machine/exclusive_limit_state_machine.js +0 -3
  212. package/dist/source/interfaces/state_machine/exclusive_limit_state_machine.js.map +0 -1
  213. package/dist/source/interfaces/state_machine/finite_state_machine.d.ts +0 -70
  214. package/dist/source/interfaces/state_machine/finite_state_machine.js +0 -3
  215. package/dist/source/interfaces/state_machine/finite_state_machine.js.map +0 -1
  216. package/dist/source/interfaces/state_machine/program_finite_state_machine.d.ts +0 -74
  217. package/dist/source/interfaces/state_machine/program_finite_state_machine.js +0 -3
  218. package/dist/source/interfaces/state_machine/program_finite_state_machine.js.map +0 -1
  219. package/dist/source/interfaces/state_machine/state_machine.d.ts +0 -342
  220. package/dist/source/interfaces/state_machine/state_machine.js +0 -3
  221. package/dist/source/interfaces/state_machine/state_machine.js.map +0 -1
  222. package/dist/source/interfaces/state_machine/ua_finite_state_variable.d.ts +0 -18
  223. package/dist/source/interfaces/state_machine/ua_finite_state_variable.js +0 -3
  224. package/dist/source/interfaces/state_machine/ua_finite_state_variable.js.map +0 -1
  225. package/dist/source/interfaces/state_machine/ua_state_variable.d.ts +0 -29
  226. package/dist/source/interfaces/state_machine/ua_state_variable.js +0 -3
  227. package/dist/source/interfaces/state_machine/ua_state_variable.js.map +0 -1
  228. package/dist/source/interfaces/state_machine/ua_two_state_variable.d.ts +0 -26
  229. package/dist/source/interfaces/state_machine/ua_two_state_variable.js +0 -3
  230. package/dist/source/interfaces/state_machine/ua_two_state_variable.js.map +0 -1
  231. package/dist/source/interfaces/subscription_diagnostics_variable.d.ts +0 -41
  232. package/dist/source/interfaces/subscription_diagnostics_variable.js +0 -3
  233. package/dist/source/interfaces/subscription_diagnostics_variable.js.map +0 -1
  234. package/dist/src/alarms_and_conditions/base_event_type.d.ts +0 -26
  235. package/dist/src/alarms_and_conditions/base_event_type.js +0 -41
  236. package/dist/src/alarms_and_conditions/base_event_type.js.map +0 -1
  237. package/dist/src/alarms_and_conditions/shelving_state_machine.d.ts +0 -22
  238. package/dist/src/alarms_and_conditions/shelving_state_machine.js +0 -241
  239. package/dist/src/alarms_and_conditions/shelving_state_machine.js.map +0 -1
  240. package/dist/src/alarms_and_conditions/trip_alarm.d.ts +0 -16
  241. package/dist/src/alarms_and_conditions/trip_alarm.js +0 -21
  242. package/dist/src/alarms_and_conditions/trip_alarm.js.map +0 -1
  243. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_base.d.ts +0 -54
  244. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_base.js +0 -255
  245. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_base.js.map +0 -1
  246. package/dist/src/alarms_and_conditions/ua_alarm_condition_base.d.ts +0 -138
  247. package/dist/src/alarms_and_conditions/ua_alarm_condition_base.js +0 -460
  248. package/dist/src/alarms_and_conditions/ua_alarm_condition_base.js.map +0 -1
  249. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm.d.ts +0 -35
  250. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm.js +0 -32
  251. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm.js.map +0 -1
  252. package/dist/src/alarms_and_conditions/ua_condition_base.d.ts +0 -191
  253. package/dist/src/alarms_and_conditions/ua_condition_base.js +0 -1029
  254. package/dist/src/alarms_and_conditions/ua_condition_base.js.map +0 -1
  255. package/dist/src/alarms_and_conditions/ua_discrete_alarm.d.ts +0 -11
  256. package/dist/src/alarms_and_conditions/ua_discrete_alarm.js +0 -58
  257. package/dist/src/alarms_and_conditions/ua_discrete_alarm.js.map +0 -1
  258. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm.d.ts +0 -24
  259. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm.js +0 -59
  260. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm.js.map +0 -1
  261. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm.d.ts +0 -14
  262. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm.js +0 -17
  263. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm.js.map +0 -1
  264. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm.d.ts +0 -22
  265. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm.js +0 -87
  266. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm.js.map +0 -1
  267. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm.d.ts +0 -6
  268. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm.js +0 -11
  269. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm.js.map +0 -1
  270. package/dist/src/alarms_and_conditions/ua_limit_alarm.d.ts +0 -76
  271. package/dist/src/alarms_and_conditions/ua_limit_alarm.js +0 -237
  272. package/dist/src/alarms_and_conditions/ua_limit_alarm.js.map +0 -1
  273. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm.d.ts +0 -27
  274. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm.js +0 -62
  275. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm.js.map +0 -1
  276. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm.d.ts +0 -49
  277. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm.js +0 -176
  278. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm.js.map +0 -1
  279. package/dist/src/alarms_and_conditions/ua_off_normal_alarm.d.ts +0 -47
  280. package/dist/src/alarms_and_conditions/ua_off_normal_alarm.js +0 -151
  281. package/dist/src/alarms_and_conditions/ua_off_normal_alarm.js.map +0 -1
  282. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm.d.ts +0 -16
  283. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm.js +0 -18
  284. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm.js.map +0 -1
  285. package/dist/src/base_node.d.ts +0 -289
  286. package/dist/src/base_node.js +0 -1345
  287. package/dist/src/base_node.js.map +0 -1
  288. package/dist/src/data_access/ua_analog_item.d.ts +0 -13
  289. package/dist/src/data_access/ua_analog_item.js +0 -37
  290. package/dist/src/data_access/ua_analog_item.js.map +0 -1
  291. package/dist/src/data_access/ua_data_item.d.ts +0 -16
  292. package/dist/src/data_access/ua_data_item.js +0 -66
  293. package/dist/src/data_access/ua_data_item.js.map +0 -1
  294. package/dist/src/data_access/ua_multistate_discrete.d.ts +0 -24
  295. package/dist/src/data_access/ua_multistate_discrete.js +0 -132
  296. package/dist/src/data_access/ua_multistate_discrete.js.map +0 -1
  297. package/dist/src/namespace.d.ts +0 -472
  298. package/dist/src/namespace.js +0 -1751
  299. package/dist/src/namespace.js.map +0 -1
  300. package/dist/src/reference.d.ts +0 -43
  301. package/dist/src/reference.js +0 -138
  302. package/dist/src/reference.js.map +0 -1
  303. package/dist/src/session_context.d.ts +0 -4
  304. package/dist/src/session_context.js +0 -9
  305. package/dist/src/session_context.js.map +0 -1
  306. package/dist/src/ua_data_type.d.ts +0 -83
  307. package/dist/src/ua_data_type.js +0 -289
  308. package/dist/src/ua_data_type.js.map +0 -1
  309. package/dist/src/ua_method.d.ts +0 -41
  310. package/dist/src/ua_method.js +0 -202
  311. package/dist/src/ua_method.js.map +0 -1
  312. package/dist/src/ua_object.d.ts +0 -28
  313. package/dist/src/ua_object.js +0 -153
  314. package/dist/src/ua_object.js.map +0 -1
  315. package/dist/src/ua_object_type.d.ts +0 -49
  316. package/dist/src/ua_object_type.js +0 -123
  317. package/dist/src/ua_object_type.js.map +0 -1
  318. package/dist/src/ua_reference_type.d.ts +0 -42
  319. package/dist/src/ua_reference_type.js +0 -138
  320. package/dist/src/ua_reference_type.js.map +0 -1
  321. package/dist/src/ua_variable.d.ts +0 -339
  322. package/dist/src/ua_variable.js +0 -1706
  323. package/dist/src/ua_variable.js.map +0 -1
  324. package/dist/src/ua_variable_type.d.ts +0 -57
  325. package/dist/src/ua_variable_type.js +0 -530
  326. package/dist/src/ua_variable_type.js.map +0 -1
  327. package/dist/src/ua_view.d.ts +0 -16
  328. package/dist/src/ua_view.js +0 -42
  329. package/dist/src/ua_view.js.map +0 -1
@@ -1,618 +1,610 @@
1
- /**
2
- * @module node-opcua-address-space
3
- */
4
- // tslint:disable:no-empty-interface
5
- import { assert } from "node-opcua-assert";
6
- import { NodeClass } from "node-opcua-data-model";
7
- import { StatusCodes } from "node-opcua-status-code";
8
- import { CallMethodResultOptions } from "node-opcua-types";
9
- import { lowerFirstLetter } from "node-opcua-utils";
10
- import { VariantLike, Variant, DataType } from "node-opcua-variant";
11
- import {
12
- AddressSpace,
13
- BaseNode,
14
- InstantiateObjectOptions,
15
- Namespace,
16
- SessionContext,
17
- UAStateMachineEx,
18
- UATransitionEventType,
19
- UAMethod,
20
- UAObject,
21
- UAObjectType,
22
- UAReferenceType,
23
- UAVariable,
24
- promoteToStateMachine,
25
- ISessionContext,
26
- UAProgramStateMachineEx
27
- } from "..";
28
- import {
29
- UAFolder,
30
- UAProgramStateMachine,
31
- UAAnalogItem,
32
- } from "node-opcua-nodeset-ua";
33
- import { UAStateMachineImpl } from "../src/state_machine/finite_state_machine";
34
-
35
- export interface FlowToReference extends UAReferenceType {}
36
-
37
- export interface HotFlowToReference extends UAReferenceType {}
38
-
39
- export interface SignalToReference extends UAReferenceType {}
40
-
41
- export interface BoilerHaltedEventType extends UATransitionEventType {}
42
-
43
- export interface CustomControllerB {
44
- input1: UAVariable;
45
- input2: UAVariable;
46
- input3: UAVariable;
47
- controlOut: UAVariable;
48
- // conflict here ! description: UAVariable;
49
- }
50
-
51
- export interface CustomControllerType extends CustomControllerB, UAObjectType {}
52
-
53
- export interface CustomController extends CustomControllerB, UAObject {}
54
-
55
- export interface GenericSensorB {
56
- output: UAAnalogItem<number, DataType.Double>;
57
- }
58
-
59
- export interface GenericSensorType extends GenericSensorB, UAObjectType {}
60
-
61
- export interface GenericSensor extends GenericSensorB, UAObject {}
62
-
63
- export interface GenericControllerB {
64
- controlOut: UAVariable;
65
- measurement: UAVariable;
66
- setPoint: UAVariable;
67
- }
68
-
69
- export interface GenericControllerType extends GenericControllerB, UAObjectType {}
70
-
71
- export interface GenericController extends GenericControllerB, UAObject {}
72
-
73
- export interface FlowControllerType extends GenericControllerType {}
74
-
75
- export interface FlowController extends GenericController {}
76
-
77
- export interface LevelControllerType extends GenericControllerType {}
78
-
79
- export interface LevelController extends GenericController {}
80
-
81
- export interface FlowTransmitterType extends GenericSensorType {}
82
-
83
- export interface FlowTransmitter extends GenericSensor {}
84
-
85
- export interface LevelIndicatorType extends GenericSensorType {}
86
-
87
- export interface LevelIndicator extends GenericSensor {}
88
-
89
- export interface GenericActuatorType extends UAObjectType {
90
- input: UAAnalogItem<number, DataType.Double>;
91
- }
92
-
93
- export interface GenericActuator extends UAObject {
94
- input: UAAnalogItem<number, DataType.Double>;
95
- }
96
-
97
- export interface ValveType extends GenericActuatorType {}
98
-
99
- export interface Valve extends GenericActuator {}
100
-
101
- export interface BoilerInputPipeType extends UAObjectType {
102
- flowTransmitter: FlowTransmitter;
103
- valve: Valve;
104
- }
105
-
106
- export interface BoilerInputPipe extends UAFolder {
107
- flowTransmitter: FlowTransmitter;
108
- valve: Valve;
109
- }
110
-
111
- export interface BoilerOutputPipeType extends UAObjectType {
112
- flowTransmitter: FlowTransmitter;
113
- }
114
-
115
- export interface BoilerOutputPipe extends UAFolder {
116
- flowTransmitter: FlowTransmitter;
117
- }
118
-
119
- export interface BoilerDrumType extends UAObjectType {
120
- levelIndicator: LevelIndicator;
121
- }
122
-
123
- export interface BoilerDrum extends UAFolder {
124
- levelIndicator: LevelIndicator;
125
- }
126
-
127
- export interface BoilerStateMachineType extends UAObjectType {}
128
-
129
- export interface BoilerStateMachine extends UAObject, UAProgramStateMachineEx {}
130
-
131
- export interface BoilerType extends UAObjectType {
132
- customController: CustomController;
133
- flowController: FlowController;
134
- levelController: LevelController;
135
- inputPipe: BoilerInputPipe;
136
- boilerDrum: BoilerDrum;
137
- outputPipe: BoilerOutputPipe;
138
- boilerDrum2: BoilerDrum;
139
- simulation: BoilerStateMachine;
140
-
141
- instantiate(options: InstantiateObjectOptions): Boiler;
142
- }
143
-
144
- export interface Boiler extends UAObject {
145
- customController: CustomController;
146
- flowController: FlowController;
147
- levelController: LevelController;
148
- inputPipe: BoilerInputPipe;
149
- boilerDrum: BoilerDrum;
150
- outputPipe: BoilerOutputPipe;
151
- boilerDrum2: BoilerDrum;
152
- simulation: BoilerStateMachine;
153
- }
154
-
155
- function MygetExecutableFlag(method: UAMethod, toState: string, methodName: string) {
156
- const stateMachineW = promoteToStateMachine(method.parent!);
157
- return stateMachineW.isValidTransition(toState);
158
- }
159
-
160
- function implementProgramStateMachine(programStateMachine: UAObject): void {
161
- function installMethod(methodName: string, toState: string) {
162
- let method = programStateMachine.getMethodByName(methodName);
163
-
164
- if (!method) {
165
- // 'method' has ModellingRule=OptionalPlaceholder and should be created from the type definition
166
- let methodToClone = programStateMachine.typeDefinitionObj.getMethodByName(methodName);
167
- if (!methodToClone) {
168
- methodToClone = programStateMachine.typeDefinitionObj!.subtypeOfObj!.getMethodByName(methodName)!;
169
- }
170
- methodToClone.clone({
171
- namespace: programStateMachine.namespace,
172
- componentOf: programStateMachine
173
- });
174
- method = programStateMachine.getMethodByName(methodName)!;
175
- assert(method !== null, "Method clone should cause parent object to be extended");
176
- }
177
- assert(method.nodeClass === NodeClass.Method);
178
-
179
- method._getExecutableFlag = function (/* sessionContext: SessionContext */) {
180
- // must use a function here to capture 'this'
181
- return MygetExecutableFlag(this as UAMethod, toState, methodName);
182
- };
183
-
184
- method.bindMethod(function (
185
- this: UAMethod,
186
- inputArguments: VariantLike[],
187
- context: ISessionContext,
188
- callback: (err: Error | null, callMethodResult: CallMethodResultOptions) => void
189
- ) {
190
- const stateMachineW = this.parent! as UAStateMachineImpl;
191
- stateMachineW.setState(toState);
192
- callback(null, {
193
- outputArguments: [],
194
- statusCode: StatusCodes.Good
195
- });
196
- });
197
-
198
- assert(
199
- programStateMachine.getMethodByName(methodName) !== null,
200
- "Method " + methodName + " should be added to parent object (checked with getMethodByName)"
201
- );
202
- const lc_name = lowerFirstLetter(methodName);
203
- }
204
-
205
- installMethod("Halt", "Halted");
206
- installMethod("Reset", "Ready");
207
- installMethod("Start", "Running");
208
- installMethod("Suspend", "Suspended");
209
- installMethod("Resume", "Running");
210
- }
211
-
212
- function addRelation(srcNode: BaseNode, referenceType: UAReferenceType | string, targetNode: BaseNode) {
213
- assert(srcNode, "expecting srcNode !== null");
214
- assert(targetNode, "expecting targetNode !== null");
215
- if (typeof referenceType === "string") {
216
- const nodes = srcNode.findReferencesAsObject(referenceType, true);
217
- assert(nodes.length === 1);
218
- referenceType = nodes[0] as UAReferenceType;
219
- }
220
- srcNode.addReference({ referenceType: referenceType.nodeId, nodeId: targetNode });
221
- }
222
-
223
- // tslint:disable:no-console
224
- export function createBoilerType(namespace: Namespace): BoilerType {
225
- // istanbul ignore next
226
- if (namespace.findObjectType("BoilerType")) {
227
- console.warn("createBoilerType has already been called");
228
- return namespace.findObjectType("BoilerType") as BoilerType;
229
- }
230
- // --------------------------------------------------------
231
- // referenceTypes
232
- // --------------------------------------------------------
233
- // create new reference Type FlowTo HotFlowTo & SignalTo
234
-
235
- const flowTo = namespace.addReferenceType({
236
- browseName: "FlowTo",
237
- description: "a reference that indicates a flow between two objects",
238
- inverseName: "FlowFrom",
239
- subtypeOf: "NonHierarchicalReferences"
240
- }) as FlowToReference;
241
-
242
- const hotFlowTo = namespace.addReferenceType({
243
- browseName: "HotFlowTo",
244
- description: "a reference that indicates a high temperature flow between two objects",
245
- inverseName: "HotFlowFrom",
246
- subtypeOf: flowTo
247
- }) as HotFlowToReference;
248
-
249
- const signalTo = namespace.addReferenceType({
250
- browseName: "SignalTo",
251
- description: "a reference that indicates an electrical signal between two variables",
252
- inverseName: "SignalFrom",
253
- subtypeOf: "NonHierarchicalReferences"
254
- }) as SignalToReference;
255
-
256
- const addressSpace = namespace.addressSpace;
257
- flowTo.isSupertypeOf(addressSpace.findReferenceType("References")!);
258
- flowTo.isSupertypeOf(addressSpace.findReferenceType("NonHierarchicalReferences")!);
259
- hotFlowTo.isSupertypeOf(addressSpace.findReferenceType("References")!);
260
- hotFlowTo.isSupertypeOf(addressSpace.findReferenceType("NonHierarchicalReferences")!);
261
- hotFlowTo.isSupertypeOf(addressSpace.findReferenceType("FlowTo", namespace.index)!);
262
-
263
- const NonHierarchicalReferences = addressSpace.findReferenceType("NonHierarchicalReferences");
264
-
265
- // --------------------------------------------------------
266
- // EventTypes
267
- // --------------------------------------------------------
268
- const boilerHaltedEventType = namespace.addEventType({
269
- browseName: "BoilerHaltedEventType",
270
- subtypeOf: "TransitionEventType"
271
- }) as BoilerHaltedEventType;
272
-
273
- // --------------------------------------------------------
274
- // CustomControllerType
275
- // --------------------------------------------------------
276
- const customControllerType = namespace.addObjectType({
277
- browseName: "CustomControllerType",
278
- description: "a custom PID controller with 3 inputs"
279
- }) as CustomControllerType;
280
-
281
- const input1: UAVariable = namespace.addVariable({
282
- browseName: "Input1",
283
- dataType: "Double",
284
- description: "a reference that indicates an electrical signal between two variables",
285
- modellingRule: "Mandatory",
286
- propertyOf: customControllerType
287
- });
288
-
289
- const input2: UAVariable = namespace.addVariable({
290
- browseName: "Input2",
291
- dataType: "Double",
292
- modellingRule: "Mandatory",
293
- propertyOf: customControllerType
294
- });
295
-
296
- const input3: UAVariable = namespace.addVariable({
297
- browseName: "Input3",
298
- dataType: "Double",
299
- modellingRule: "Mandatory",
300
- propertyOf: customControllerType
301
- });
302
-
303
- const controlOut: UAVariable = namespace.addVariable({
304
- browseName: "ControlOut",
305
- dataType: "Double",
306
- modellingRule: "Mandatory",
307
- propertyOf: customControllerType
308
- });
309
-
310
- const description: UAVariable = namespace.addVariable({
311
- browseName: "Description",
312
- dataType: "LocalizedText",
313
- modellingRule: "Mandatory",
314
- propertyOf: customControllerType
315
- });
316
-
317
- // --------------------------------------------------------
318
- // GenericSensorType
319
- // --------------------------------------------------------
320
- const genericSensorType = namespace.addObjectType({
321
- browseName: "GenericSensorType"
322
- });
323
- namespace.addAnalogDataItem({
324
- browseName: "Output",
325
- componentOf: genericSensorType,
326
- dataType: "Double",
327
- engineeringUnitsRange: { low: -100, high: 200 },
328
- modellingRule: "Mandatory"
329
- });
330
-
331
- genericSensorType.install_extra_properties();
332
-
333
- genericSensorType.getComponentByName("Output");
334
- assert(genericSensorType.getComponentByName("Output")!.modellingRule === "Mandatory");
335
-
336
- // --------------------------------------------------------
337
- // GenericSensorType <---- GenericControllerType
338
- // --------------------------------------------------------
339
- const genericControllerType = namespace.addObjectType({
340
- browseName: "GenericControllerType"
341
- });
342
- namespace.addVariable({
343
- browseName: "ControlOut",
344
- dataType: "Double",
345
- modellingRule: "Mandatory",
346
- propertyOf: genericControllerType
347
- });
348
- namespace.addVariable({
349
- browseName: "Measurement",
350
- dataType: "Double",
351
- modellingRule: "Mandatory",
352
- propertyOf: genericControllerType
353
- });
354
- namespace.addVariable({
355
- browseName: "SetPoint",
356
- dataType: "Double",
357
- modellingRule: "Mandatory",
358
- propertyOf: genericControllerType
359
- });
360
-
361
- // --------------------------------------------------------------------------------
362
- // GenericSensorType <---- GenericControllerType <--- FlowControllerType
363
- // --------------------------------------------------------------------------------
364
-
365
- const flowControllerType = namespace.addObjectType({
366
- browseName: "FlowControllerType",
367
- subtypeOf: genericControllerType
368
- });
369
-
370
- // --------------------------------------------------------------------------------
371
- // GenericSensorType <---- GenericControllerType <--- LevelControllerType
372
- // --------------------------------------------------------------------------------
373
- const levelControllerType = namespace.addObjectType({
374
- browseName: "LevelControllerType",
375
- subtypeOf: genericControllerType
376
- });
377
-
378
- // --------------------------------------------------------------------------------
379
- // GenericSensorType <---- FlowTransmitterType
380
- // --------------------------------------------------------------------------------
381
- const flowTransmitterType = namespace.addObjectType({
382
- browseName: "FlowTransmitterType",
383
- subtypeOf: genericSensorType
384
- });
385
-
386
- // --------------------------------------------------------------------------------
387
- // GenericSensorType <---- LevelIndicatorType
388
- // --------------------------------------------------------------------------------
389
- const levelIndicatorType = namespace.addObjectType({
390
- browseName: "LevelIndicatorType",
391
- subtypeOf: genericSensorType
392
- });
393
-
394
- // --------------------------------------------------------------------------------
395
- // GenericActuatorType
396
- // --------------------------------------------------------------------------------
397
- const genericActuatorType = namespace.addObjectType({
398
- browseName: "GenericActuatorType"
399
- });
400
- namespace.addAnalogDataItem({
401
- browseName: "Input",
402
- componentOf: genericActuatorType,
403
- dataType: "Double",
404
- engineeringUnitsRange: { low: -100, high: 200 },
405
- modellingRule: "Mandatory"
406
- });
407
-
408
- // --------------------------------------------------------------------------------
409
- // GenericActuatorType <---- ValveType
410
- // --------------------------------------------------------------------------------
411
- const valveType = namespace.addObjectType({
412
- browseName: "ValveType",
413
- subtypeOf: genericActuatorType
414
- });
415
-
416
- // --------------------------------------------------------------------------------
417
- // FolderType <---- BoilerInputPipeType
418
- // --------------------------------------------------------------------------------
419
- const boilerInputPipeType = namespace.addObjectType({
420
- browseName: "BoilerInputPipeType",
421
- subtypeOf: "FolderType"
422
- });
423
-
424
- const ftx1 = flowTransmitterType.instantiate({
425
- browseName: "FlowTransmitter",
426
- componentOf: boilerInputPipeType,
427
- modellingRule: "Mandatory",
428
- notifierOf: boilerInputPipeType
429
- }) as FlowTransmitter;
430
- assert(ftx1.output.browseName.toString() === `${namespace.index}:Output`);
431
-
432
- const valve1 = valveType.instantiate({
433
- browseName: "Valve",
434
- componentOf: boilerInputPipeType,
435
- modellingRule: "Mandatory"
436
- }) as Valve;
437
-
438
- // --------------------------------------------------------------------------------
439
- // FolderType <---- BoilerOutputPipeType
440
- // --------------------------------------------------------------------------------
441
-
442
- const boilerOutputPipeType = namespace.addObjectType({
443
- browseName: "BoilerOutputPipeType",
444
- subtypeOf: "FolderType"
445
- });
446
- const ftx2 = flowTransmitterType.instantiate({
447
- browseName: "FlowTransmitter",
448
- componentOf: boilerOutputPipeType,
449
- modellingRule: "Mandatory",
450
- notifierOf: boilerOutputPipeType
451
- }) as FlowTransmitter;
452
-
453
- ftx2.getComponentByName("Output")!.browseName.toString();
454
-
455
- // --------------------------------)------------------------------------------------
456
- // FolderType <---- BoilerDrumType
457
- // --------------------------------------------------------------------------------
458
- const boilerDrumType = namespace.addObjectType({
459
- browseName: "BoilerDrumType",
460
- subtypeOf: "FolderType"
461
- });
462
-
463
- const levelIndicator = levelIndicatorType.instantiate({
464
- browseName: "LevelIndicator",
465
- componentOf: boilerDrumType,
466
- modellingRule: "Mandatory",
467
- notifierOf: boilerDrumType
468
- }) as LevelIndicator;
469
-
470
- const programFiniteStateMachineType = addressSpace.findObjectType(
471
- "ProgramStateMachineType"
472
- )!;
473
-
474
- // --------------------------------------------------------
475
- // define boiler State Machine
476
- // --------------------------------------------------------
477
- const boilerStateMachineType = namespace.addObjectType({
478
- browseName: "BoilerStateMachineType",
479
- postInstantiateFunc: implementProgramStateMachine,
480
- subtypeOf: programFiniteStateMachineType!
481
- }) as BoilerStateMachineType;
482
-
483
- // programStateMachineType has Optional placeHolder for method "Halt", "Reset","Start","Suspend","Resume")
484
-
485
- function addMethod(baseType: UAObjectType, objectType: UAObjectType, methodName: string) {
486
- assert(!objectType.getMethodByName(methodName));
487
- const method = baseType.getMethodByName(methodName)!;
488
- const m = method.clone({
489
- namespace,
490
- componentOf: objectType,
491
- modellingRule: "Mandatory"
492
- });
493
- assert(objectType.getMethodByName(methodName));
494
- assert(objectType.getMethodByName(methodName)!.modellingRule === "Mandatory");
495
- }
496
-
497
- addMethod(programFiniteStateMachineType, boilerStateMachineType, "Halt");
498
- addMethod(programFiniteStateMachineType, boilerStateMachineType, "Reset");
499
- addMethod(programFiniteStateMachineType, boilerStateMachineType, "Start");
500
- addMethod(programFiniteStateMachineType, boilerStateMachineType, "Suspend");
501
- addMethod(programFiniteStateMachineType, boilerStateMachineType, "Resume");
502
-
503
- // --------------------------------------------------------------------------------
504
- // BoilerType
505
- // --------------------------------------------------------------------------------
506
- const boilerType = namespace.addObjectType({
507
- browseName: "BoilerType",
508
- eventNotifier: 0x1
509
- }) as BoilerType;
510
-
511
- // BoilerType.CustomController (CustomControllerType)
512
- const customController = customControllerType.instantiate({
513
- browseName: "CustomController",
514
- componentOf: boilerType,
515
- modellingRule: "Mandatory"
516
- }) as CustomController;
517
-
518
- // BoilerType.FlowController (FlowController)
519
- const flowController = flowControllerType.instantiate({
520
- browseName: "FlowController",
521
- componentOf: boilerType,
522
- modellingRule: "Mandatory"
523
- }) as FlowController;
524
-
525
- // BoilerType.LevelController (LevelControllerType)
526
- const levelController = levelControllerType.instantiate({
527
- browseName: "LevelController",
528
- componentOf: boilerType,
529
- modellingRule: "Mandatory"
530
- }) as LevelController;
531
-
532
- // BoilerType.LevelIndicator (BoilerInputPipeType)
533
- const inputPipe = boilerInputPipeType.instantiate({
534
- browseName: "InputPipe",
535
- componentOf: boilerType,
536
- modellingRule: "Mandatory",
537
- notifierOf: boilerType
538
- }) as BoilerInputPipe;
539
-
540
- // BoilerType.BoilerDrum (BoilerDrumType)
541
- const boilerDrum = boilerDrumType.instantiate({
542
- browseName: "BoilerDrum",
543
- componentOf: boilerType,
544
- modellingRule: "Mandatory",
545
- notifierOf: boilerType
546
- }) as BoilerDrum;
547
-
548
- // BoilerType.OutputPipe (BoilerOutputPipeType)
549
- const outputPipe = boilerOutputPipeType.instantiate({
550
- browseName: "OutputPipe",
551
- componentOf: boilerType,
552
- modellingRule: "Mandatory",
553
- notifierOf: boilerType
554
- }) as BoilerOutputPipe;
555
-
556
- // BoilerType.Simulation (BoilerStateMachineType)
557
- const simulation = boilerStateMachineType.instantiate({
558
- browseName: "Simulation",
559
- componentOf: boilerType,
560
- eventSourceOf: boilerType,
561
- modellingRule: "Mandatory"
562
- }) as BoilerStateMachine;
563
-
564
- addRelation(inputPipe, flowTo, boilerDrum);
565
- addRelation(boilerDrum, hotFlowTo, outputPipe);
566
-
567
- assert(boilerType.inputPipe.flowTransmitter);
568
- assert(boilerType.inputPipe.flowTransmitter.output);
569
- assert(boilerType.flowController.measurement);
570
-
571
- addRelation(boilerType.inputPipe.flowTransmitter.output, signalTo, boilerType.flowController.measurement);
572
- addRelation(boilerType.inputPipe.flowTransmitter.output, signalTo, boilerType.customController.input2);
573
- addRelation(boilerType.flowController.controlOut, signalTo, boilerType.inputPipe.valve.input);
574
-
575
- // indicates that the level controller gets its measurement from the drum's level indicator.
576
- addRelation(boilerType.boilerDrum.levelIndicator.output, signalTo, boilerType.levelController.measurement);
577
-
578
- addRelation(boilerType.outputPipe.flowTransmitter.output, signalTo, boilerType.customController.input3);
579
-
580
- addRelation(boilerType.levelController.controlOut, signalTo, boilerType.customController.input1);
581
-
582
- addRelation(boilerType.customController.controlOut, signalTo, boilerType.flowController.setPoint);
583
-
584
- return boilerType;
585
- }
586
-
587
- export function makeBoiler(
588
- addressSpace: AddressSpace,
589
- options: {
590
- browseName: string;
591
- organizedBy: BaseNode;
592
- }
593
- ): Boiler {
594
- const namespace = addressSpace.getOwnNamespace();
595
-
596
- assert(options);
597
- let boilerType: UAObjectType | null;
598
- boilerType = namespace.findObjectType("BoilerType");
599
-
600
- // istanbul ignore next
601
- if (!boilerType) {
602
- createBoilerType(namespace);
603
- boilerType = namespace.findObjectType("BoilerType")!;
604
- }
605
- // now instantiate boiler
606
- const boiler1 = boilerType.instantiate({
607
- browseName: options.browseName,
608
- organizedBy: addressSpace.rootFolder.objects
609
- }) as Boiler;
610
-
611
- promoteToStateMachine(boiler1.simulation);
612
-
613
- const boilerStateMachine = boiler1.simulation;
614
- const readyState = boilerStateMachine.getStateByName("Ready")!;
615
- boilerStateMachine.setState(readyState);
616
-
617
- return boiler1;
618
- }
1
+ /* eslint-disable max-statements */
2
+ /**
3
+ * @module node-opcua-address-space
4
+ */
5
+ import { assert } from "node-opcua-assert";
6
+ import { NodeClass } from "node-opcua-data-model";
7
+ import { StatusCodes } from "node-opcua-status-code";
8
+ import { CallMethodResultOptions } from "node-opcua-types";
9
+ import { lowerFirstLetter } from "node-opcua-utils";
10
+ import { VariantLike, DataType } from "node-opcua-variant";
11
+ import { UAFolder, UAAnalogItem } from "node-opcua-nodeset-ua";
12
+ import {
13
+ AddressSpace,
14
+ BaseNode,
15
+ InstantiateObjectOptions,
16
+ Namespace,
17
+ UATransitionEventType,
18
+ UAMethod,
19
+ UAObject,
20
+ UAObjectType,
21
+ UAReferenceType,
22
+ UAVariable,
23
+ promoteToStateMachine,
24
+ ISessionContext,
25
+ UAProgramStateMachineEx
26
+ } from "..";
27
+
28
+ import { UAStateMachineImpl } from "../src/state_machine/finite_state_machine";
29
+
30
+ export interface FlowToReference extends UAReferenceType {}
31
+
32
+ export interface HotFlowToReference extends UAReferenceType {}
33
+
34
+ export interface SignalToReference extends UAReferenceType {}
35
+
36
+ export interface BoilerHaltedEventType extends UATransitionEventType {}
37
+
38
+ export interface CustomControllerB {
39
+ input1: UAVariable;
40
+ input2: UAVariable;
41
+ input3: UAVariable;
42
+ controlOut: UAVariable;
43
+ // conflict here ! description: UAVariable;
44
+ }
45
+
46
+ export interface CustomControllerType extends CustomControllerB, UAObjectType {}
47
+
48
+ export interface CustomController extends CustomControllerB, UAObject {}
49
+
50
+ export interface GenericSensorB {
51
+ output: UAAnalogItem<number, DataType.Double>;
52
+ }
53
+
54
+ export interface GenericSensorType extends GenericSensorB, UAObjectType {}
55
+
56
+ export interface GenericSensor extends GenericSensorB, UAObject {}
57
+
58
+ export interface GenericControllerB {
59
+ controlOut: UAVariable;
60
+ measurement: UAVariable;
61
+ setPoint: UAVariable;
62
+ }
63
+
64
+ export interface GenericControllerType extends GenericControllerB, UAObjectType {}
65
+
66
+ export interface GenericController extends GenericControllerB, UAObject {}
67
+
68
+ export interface FlowControllerType extends GenericControllerType {}
69
+
70
+ export interface FlowController extends GenericController {}
71
+
72
+ export interface LevelControllerType extends GenericControllerType {}
73
+
74
+ export interface LevelController extends GenericController {}
75
+
76
+ export interface FlowTransmitterType extends GenericSensorType {}
77
+
78
+ export interface FlowTransmitter extends GenericSensor {}
79
+
80
+ export interface LevelIndicatorType extends GenericSensorType {}
81
+
82
+ export interface LevelIndicator extends GenericSensor {}
83
+
84
+ export interface GenericActuatorType extends UAObjectType {
85
+ input: UAAnalogItem<number, DataType.Double>;
86
+ }
87
+
88
+ export interface GenericActuator extends UAObject {
89
+ input: UAAnalogItem<number, DataType.Double>;
90
+ }
91
+
92
+ export interface ValveType extends GenericActuatorType {}
93
+
94
+ export interface Valve extends GenericActuator {}
95
+
96
+ export interface BoilerInputPipeType extends UAObjectType {
97
+ flowTransmitter: FlowTransmitter;
98
+ valve: Valve;
99
+ }
100
+
101
+ export interface BoilerInputPipe extends UAFolder {
102
+ flowTransmitter: FlowTransmitter;
103
+ valve: Valve;
104
+ }
105
+
106
+ export interface BoilerOutputPipeType extends UAObjectType {
107
+ flowTransmitter: FlowTransmitter;
108
+ }
109
+
110
+ export interface BoilerOutputPipe extends UAFolder {
111
+ flowTransmitter: FlowTransmitter;
112
+ }
113
+
114
+ export interface BoilerDrumType extends UAObjectType {
115
+ levelIndicator: LevelIndicator;
116
+ }
117
+
118
+ export interface BoilerDrum extends UAFolder {
119
+ levelIndicator: LevelIndicator;
120
+ }
121
+
122
+ export interface BoilerStateMachineType extends UAObjectType {}
123
+
124
+ export interface BoilerStateMachine extends UAObject, UAProgramStateMachineEx {}
125
+
126
+ export interface BoilerType extends UAObjectType {
127
+ customController: CustomController;
128
+ flowController: FlowController;
129
+ levelController: LevelController;
130
+ inputPipe: BoilerInputPipe;
131
+ boilerDrum: BoilerDrum;
132
+ outputPipe: BoilerOutputPipe;
133
+ boilerDrum2: BoilerDrum;
134
+ simulation: BoilerStateMachine;
135
+
136
+ instantiate(options: InstantiateObjectOptions): Boiler;
137
+ }
138
+
139
+ export interface Boiler extends UAObject {
140
+ customController: CustomController;
141
+ flowController: FlowController;
142
+ levelController: LevelController;
143
+ inputPipe: BoilerInputPipe;
144
+ boilerDrum: BoilerDrum;
145
+ outputPipe: BoilerOutputPipe;
146
+ boilerDrum2: BoilerDrum;
147
+ simulation: BoilerStateMachine;
148
+ }
149
+
150
+ function MygetExecutableFlag(method: UAMethod, toState: string, methodName: string) {
151
+ const stateMachineW = promoteToStateMachine(method.parent!);
152
+ return stateMachineW.isValidTransition(toState);
153
+ }
154
+
155
+ function implementProgramStateMachine(programStateMachine: UAObject): void {
156
+ function installMethod(methodName: string, toState: string) {
157
+ let method = programStateMachine.getMethodByName(methodName);
158
+
159
+ if (!method) {
160
+ // 'method' has ModellingRule=OptionalPlaceholder and should be created from the type definition
161
+ let methodToClone = programStateMachine.typeDefinitionObj.getMethodByName(methodName);
162
+ if (!methodToClone) {
163
+ methodToClone = programStateMachine.typeDefinitionObj!.subtypeOfObj!.getMethodByName(methodName)!;
164
+ }
165
+ methodToClone.clone({
166
+ namespace: programStateMachine.namespace,
167
+ componentOf: programStateMachine
168
+ });
169
+ method = programStateMachine.getMethodByName(methodName)!;
170
+ assert(method !== null, "Method clone should cause parent object to be extended");
171
+ }
172
+ assert(method.nodeClass === NodeClass.Method);
173
+
174
+ method._getExecutableFlag = function (/* sessionContext: SessionContext */) {
175
+ // must use a function here to capture 'this'
176
+ return MygetExecutableFlag(this as UAMethod, toState, methodName);
177
+ };
178
+
179
+ method.bindMethod(function (
180
+ this: UAMethod,
181
+ inputArguments: VariantLike[],
182
+ context: ISessionContext,
183
+ callback: (err: Error | null, callMethodResult: CallMethodResultOptions) => void
184
+ ) {
185
+ const stateMachineW = this.parent! as UAStateMachineImpl;
186
+ stateMachineW.setState(toState);
187
+ callback(null, {
188
+ outputArguments: [],
189
+ statusCode: StatusCodes.Good
190
+ });
191
+ });
192
+
193
+ assert(
194
+ programStateMachine.getMethodByName(methodName) !== null,
195
+ "Method " + methodName + " should be added to parent object (checked with getMethodByName)"
196
+ );
197
+ const lc_name = lowerFirstLetter(methodName);
198
+ }
199
+
200
+ installMethod("Halt", "Halted");
201
+ installMethod("Reset", "Ready");
202
+ installMethod("Start", "Running");
203
+ installMethod("Suspend", "Suspended");
204
+ installMethod("Resume", "Running");
205
+ }
206
+
207
+ function addRelation(srcNode: BaseNode, referenceType: UAReferenceType | string, targetNode: BaseNode) {
208
+ assert(srcNode, "expecting srcNode !== null");
209
+ assert(targetNode, "expecting targetNode !== null");
210
+ if (typeof referenceType === "string") {
211
+ const nodes = srcNode.findReferencesAsObject(referenceType, true);
212
+ assert(nodes.length === 1);
213
+ referenceType = nodes[0] as UAReferenceType;
214
+ }
215
+ srcNode.addReference({ referenceType: referenceType.nodeId, nodeId: targetNode });
216
+ }
217
+
218
+ export function createBoilerType(namespace: Namespace): BoilerType {
219
+ // istanbul ignore next
220
+ if (namespace.findObjectType("BoilerType")) {
221
+ console.warn("createBoilerType has already been called");
222
+ return namespace.findObjectType("BoilerType") as BoilerType;
223
+ }
224
+ // --------------------------------------------------------
225
+ // referenceTypes
226
+ // --------------------------------------------------------
227
+ // create new reference Type FlowTo HotFlowTo & SignalTo
228
+
229
+ const flowTo = namespace.addReferenceType({
230
+ browseName: "FlowTo",
231
+ description: "a reference that indicates a flow between two objects",
232
+ inverseName: "FlowFrom",
233
+ subtypeOf: "NonHierarchicalReferences"
234
+ }) as FlowToReference;
235
+
236
+ const hotFlowTo = namespace.addReferenceType({
237
+ browseName: "HotFlowTo",
238
+ description: "a reference that indicates a high temperature flow between two objects",
239
+ inverseName: "HotFlowFrom",
240
+ subtypeOf: flowTo
241
+ }) as HotFlowToReference;
242
+
243
+ const signalTo = namespace.addReferenceType({
244
+ browseName: "SignalTo",
245
+ description: "a reference that indicates an electrical signal between two variables",
246
+ inverseName: "SignalFrom",
247
+ subtypeOf: "NonHierarchicalReferences"
248
+ }) as SignalToReference;
249
+
250
+ const addressSpace = namespace.addressSpace;
251
+ flowTo.isSupertypeOf(addressSpace.findReferenceType("References")!);
252
+ flowTo.isSupertypeOf(addressSpace.findReferenceType("NonHierarchicalReferences")!);
253
+ hotFlowTo.isSupertypeOf(addressSpace.findReferenceType("References")!);
254
+ hotFlowTo.isSupertypeOf(addressSpace.findReferenceType("NonHierarchicalReferences")!);
255
+ hotFlowTo.isSupertypeOf(addressSpace.findReferenceType("FlowTo", namespace.index)!);
256
+
257
+ const NonHierarchicalReferences = addressSpace.findReferenceType("NonHierarchicalReferences");
258
+
259
+ // --------------------------------------------------------
260
+ // EventTypes
261
+ // --------------------------------------------------------
262
+ const boilerHaltedEventType = namespace.addEventType({
263
+ browseName: "BoilerHaltedEventType",
264
+ subtypeOf: "TransitionEventType"
265
+ }) as BoilerHaltedEventType;
266
+
267
+ // --------------------------------------------------------
268
+ // CustomControllerType
269
+ // --------------------------------------------------------
270
+ const customControllerType = namespace.addObjectType({
271
+ browseName: "CustomControllerType",
272
+ description: "a custom PID controller with 3 inputs"
273
+ }) as CustomControllerType;
274
+
275
+ const input1: UAVariable = namespace.addVariable({
276
+ browseName: "Input1",
277
+ dataType: "Double",
278
+ description: "a reference that indicates an electrical signal between two variables",
279
+ modellingRule: "Mandatory",
280
+ propertyOf: customControllerType
281
+ });
282
+
283
+ const input2: UAVariable = namespace.addVariable({
284
+ browseName: "Input2",
285
+ dataType: "Double",
286
+ modellingRule: "Mandatory",
287
+ propertyOf: customControllerType
288
+ });
289
+
290
+ const input3: UAVariable = namespace.addVariable({
291
+ browseName: "Input3",
292
+ dataType: "Double",
293
+ modellingRule: "Mandatory",
294
+ propertyOf: customControllerType
295
+ });
296
+
297
+ const controlOut: UAVariable = namespace.addVariable({
298
+ browseName: "ControlOut",
299
+ dataType: "Double",
300
+ modellingRule: "Mandatory",
301
+ propertyOf: customControllerType
302
+ });
303
+
304
+ const description: UAVariable = namespace.addVariable({
305
+ browseName: "Description",
306
+ dataType: "LocalizedText",
307
+ modellingRule: "Mandatory",
308
+ propertyOf: customControllerType
309
+ });
310
+
311
+ // --------------------------------------------------------
312
+ // GenericSensorType
313
+ // --------------------------------------------------------
314
+ const genericSensorType = namespace.addObjectType({
315
+ browseName: "GenericSensorType"
316
+ });
317
+ namespace.addAnalogDataItem({
318
+ browseName: "Output",
319
+ componentOf: genericSensorType,
320
+ dataType: "Double",
321
+ engineeringUnitsRange: { low: -100, high: 200 },
322
+ modellingRule: "Mandatory"
323
+ });
324
+
325
+ genericSensorType.install_extra_properties();
326
+
327
+ genericSensorType.getComponentByName("Output");
328
+ assert(genericSensorType.getComponentByName("Output")!.modellingRule === "Mandatory");
329
+
330
+ // --------------------------------------------------------
331
+ // GenericSensorType <---- GenericControllerType
332
+ // --------------------------------------------------------
333
+ const genericControllerType = namespace.addObjectType({
334
+ browseName: "GenericControllerType"
335
+ });
336
+ namespace.addVariable({
337
+ browseName: "ControlOut",
338
+ dataType: "Double",
339
+ modellingRule: "Mandatory",
340
+ propertyOf: genericControllerType
341
+ });
342
+ namespace.addVariable({
343
+ browseName: "Measurement",
344
+ dataType: "Double",
345
+ modellingRule: "Mandatory",
346
+ propertyOf: genericControllerType
347
+ });
348
+ namespace.addVariable({
349
+ browseName: "SetPoint",
350
+ dataType: "Double",
351
+ modellingRule: "Mandatory",
352
+ propertyOf: genericControllerType
353
+ });
354
+
355
+ // --------------------------------------------------------------------------------
356
+ // GenericSensorType <---- GenericControllerType <--- FlowControllerType
357
+ // --------------------------------------------------------------------------------
358
+
359
+ const flowControllerType = namespace.addObjectType({
360
+ browseName: "FlowControllerType",
361
+ subtypeOf: genericControllerType
362
+ });
363
+
364
+ // --------------------------------------------------------------------------------
365
+ // GenericSensorType <---- GenericControllerType <--- LevelControllerType
366
+ // --------------------------------------------------------------------------------
367
+ const levelControllerType = namespace.addObjectType({
368
+ browseName: "LevelControllerType",
369
+ subtypeOf: genericControllerType
370
+ });
371
+
372
+ // --------------------------------------------------------------------------------
373
+ // GenericSensorType <---- FlowTransmitterType
374
+ // --------------------------------------------------------------------------------
375
+ const flowTransmitterType = namespace.addObjectType({
376
+ browseName: "FlowTransmitterType",
377
+ subtypeOf: genericSensorType
378
+ });
379
+
380
+ // --------------------------------------------------------------------------------
381
+ // GenericSensorType <---- LevelIndicatorType
382
+ // --------------------------------------------------------------------------------
383
+ const levelIndicatorType = namespace.addObjectType({
384
+ browseName: "LevelIndicatorType",
385
+ subtypeOf: genericSensorType
386
+ });
387
+
388
+ // --------------------------------------------------------------------------------
389
+ // GenericActuatorType
390
+ // --------------------------------------------------------------------------------
391
+ const genericActuatorType = namespace.addObjectType({
392
+ browseName: "GenericActuatorType"
393
+ });
394
+ namespace.addAnalogDataItem({
395
+ browseName: "Input",
396
+ componentOf: genericActuatorType,
397
+ dataType: "Double",
398
+ engineeringUnitsRange: { low: -100, high: 200 },
399
+ modellingRule: "Mandatory"
400
+ });
401
+
402
+ // --------------------------------------------------------------------------------
403
+ // GenericActuatorType <---- ValveType
404
+ // --------------------------------------------------------------------------------
405
+ const valveType = namespace.addObjectType({
406
+ browseName: "ValveType",
407
+ subtypeOf: genericActuatorType
408
+ });
409
+
410
+ // --------------------------------------------------------------------------------
411
+ // FolderType <---- BoilerInputPipeType
412
+ // --------------------------------------------------------------------------------
413
+ const boilerInputPipeType = namespace.addObjectType({
414
+ browseName: "BoilerInputPipeType",
415
+ subtypeOf: "FolderType"
416
+ });
417
+
418
+ const ftx1 = flowTransmitterType.instantiate({
419
+ browseName: "FlowTransmitter",
420
+ componentOf: boilerInputPipeType,
421
+ modellingRule: "Mandatory",
422
+ notifierOf: boilerInputPipeType
423
+ }) as FlowTransmitter;
424
+ assert(ftx1.output.browseName.toString() === `${namespace.index}:Output`);
425
+
426
+ const valve1 = valveType.instantiate({
427
+ browseName: "Valve",
428
+ componentOf: boilerInputPipeType,
429
+ modellingRule: "Mandatory"
430
+ }) as Valve;
431
+
432
+ // --------------------------------------------------------------------------------
433
+ // FolderType <---- BoilerOutputPipeType
434
+ // --------------------------------------------------------------------------------
435
+
436
+ const boilerOutputPipeType = namespace.addObjectType({
437
+ browseName: "BoilerOutputPipeType",
438
+ subtypeOf: "FolderType"
439
+ });
440
+ const ftx2 = flowTransmitterType.instantiate({
441
+ browseName: "FlowTransmitter",
442
+ componentOf: boilerOutputPipeType,
443
+ modellingRule: "Mandatory",
444
+ notifierOf: boilerOutputPipeType
445
+ }) as FlowTransmitter;
446
+
447
+ ftx2.getComponentByName("Output")!.browseName.toString();
448
+
449
+ // --------------------------------)------------------------------------------------
450
+ // FolderType <---- BoilerDrumType
451
+ // --------------------------------------------------------------------------------
452
+ const boilerDrumType = namespace.addObjectType({
453
+ browseName: "BoilerDrumType",
454
+ subtypeOf: "FolderType"
455
+ });
456
+
457
+ const levelIndicator = levelIndicatorType.instantiate({
458
+ browseName: "LevelIndicator",
459
+ componentOf: boilerDrumType,
460
+ modellingRule: "Mandatory",
461
+ notifierOf: boilerDrumType
462
+ }) as LevelIndicator;
463
+
464
+ const programFiniteStateMachineType = addressSpace.findObjectType("ProgramStateMachineType")!;
465
+
466
+ // --------------------------------------------------------
467
+ // define boiler State Machine
468
+ // --------------------------------------------------------
469
+ const boilerStateMachineType = namespace.addObjectType({
470
+ browseName: "BoilerStateMachineType",
471
+ postInstantiateFunc: implementProgramStateMachine,
472
+ subtypeOf: programFiniteStateMachineType!
473
+ }) as BoilerStateMachineType;
474
+
475
+ // programStateMachineType has Optional placeHolder for method "Halt", "Reset","Start","Suspend","Resume")
476
+
477
+ function addMethod(baseType: UAObjectType, objectType: UAObjectType, methodName: string) {
478
+ assert(!objectType.getMethodByName(methodName));
479
+ const method = baseType.getMethodByName(methodName)!;
480
+ const m = method.clone({
481
+ namespace,
482
+ componentOf: objectType,
483
+ modellingRule: "Mandatory"
484
+ });
485
+ assert(objectType.getMethodByName(methodName));
486
+ assert(objectType.getMethodByName(methodName)!.modellingRule === "Mandatory");
487
+ }
488
+
489
+ addMethod(programFiniteStateMachineType, boilerStateMachineType, "Halt");
490
+ addMethod(programFiniteStateMachineType, boilerStateMachineType, "Reset");
491
+ addMethod(programFiniteStateMachineType, boilerStateMachineType, "Start");
492
+ addMethod(programFiniteStateMachineType, boilerStateMachineType, "Suspend");
493
+ addMethod(programFiniteStateMachineType, boilerStateMachineType, "Resume");
494
+
495
+ // --------------------------------------------------------------------------------
496
+ // BoilerType
497
+ // --------------------------------------------------------------------------------
498
+ const boilerType = namespace.addObjectType({
499
+ browseName: "BoilerType",
500
+ eventNotifier: 0x1
501
+ }) as BoilerType;
502
+
503
+ // BoilerType.CustomController (CustomControllerType)
504
+ const customController = customControllerType.instantiate({
505
+ browseName: "CustomController",
506
+ componentOf: boilerType,
507
+ modellingRule: "Mandatory"
508
+ }) as CustomController;
509
+
510
+ // BoilerType.FlowController (FlowController)
511
+ const flowController = flowControllerType.instantiate({
512
+ browseName: "FlowController",
513
+ componentOf: boilerType,
514
+ modellingRule: "Mandatory"
515
+ }) as FlowController;
516
+
517
+ // BoilerType.LevelController (LevelControllerType)
518
+ const levelController = levelControllerType.instantiate({
519
+ browseName: "LevelController",
520
+ componentOf: boilerType,
521
+ modellingRule: "Mandatory"
522
+ }) as LevelController;
523
+
524
+ // BoilerType.LevelIndicator (BoilerInputPipeType)
525
+ const inputPipe = boilerInputPipeType.instantiate({
526
+ browseName: "InputPipe",
527
+ componentOf: boilerType,
528
+ modellingRule: "Mandatory",
529
+ notifierOf: boilerType
530
+ }) as BoilerInputPipe;
531
+
532
+ // BoilerType.BoilerDrum (BoilerDrumType)
533
+ const boilerDrum = boilerDrumType.instantiate({
534
+ browseName: "BoilerDrum",
535
+ componentOf: boilerType,
536
+ modellingRule: "Mandatory",
537
+ notifierOf: boilerType
538
+ }) as BoilerDrum;
539
+
540
+ // BoilerType.OutputPipe (BoilerOutputPipeType)
541
+ const outputPipe = boilerOutputPipeType.instantiate({
542
+ browseName: "OutputPipe",
543
+ componentOf: boilerType,
544
+ modellingRule: "Mandatory",
545
+ notifierOf: boilerType
546
+ }) as BoilerOutputPipe;
547
+
548
+ // BoilerType.Simulation (BoilerStateMachineType)
549
+ const simulation = boilerStateMachineType.instantiate({
550
+ browseName: "Simulation",
551
+ componentOf: boilerType,
552
+ eventSourceOf: boilerType,
553
+ modellingRule: "Mandatory"
554
+ }) as BoilerStateMachine;
555
+
556
+ addRelation(inputPipe, flowTo, boilerDrum);
557
+ addRelation(boilerDrum, hotFlowTo, outputPipe);
558
+
559
+ assert(boilerType.inputPipe.flowTransmitter);
560
+ assert(boilerType.inputPipe.flowTransmitter.output);
561
+ assert(boilerType.flowController.measurement);
562
+
563
+ addRelation(boilerType.inputPipe.flowTransmitter.output, signalTo, boilerType.flowController.measurement);
564
+ addRelation(boilerType.inputPipe.flowTransmitter.output, signalTo, boilerType.customController.input2);
565
+ addRelation(boilerType.flowController.controlOut, signalTo, boilerType.inputPipe.valve.input);
566
+
567
+ // indicates that the level controller gets its measurement from the drum's level indicator.
568
+ addRelation(boilerType.boilerDrum.levelIndicator.output, signalTo, boilerType.levelController.measurement);
569
+
570
+ addRelation(boilerType.outputPipe.flowTransmitter.output, signalTo, boilerType.customController.input3);
571
+
572
+ addRelation(boilerType.levelController.controlOut, signalTo, boilerType.customController.input1);
573
+
574
+ addRelation(boilerType.customController.controlOut, signalTo, boilerType.flowController.setPoint);
575
+
576
+ return boilerType;
577
+ }
578
+
579
+ export function makeBoiler(
580
+ addressSpace: AddressSpace,
581
+ options: {
582
+ browseName: string;
583
+ organizedBy: BaseNode;
584
+ }
585
+ ): Boiler {
586
+ const namespace = addressSpace.getOwnNamespace();
587
+
588
+ assert(options);
589
+ let boilerType: UAObjectType | null;
590
+ boilerType = namespace.findObjectType("BoilerType");
591
+
592
+ // istanbul ignore next
593
+ if (!boilerType) {
594
+ createBoilerType(namespace);
595
+ boilerType = namespace.findObjectType("BoilerType")!;
596
+ }
597
+ // now instantiate boiler
598
+ const boiler1 = boilerType.instantiate({
599
+ browseName: options.browseName,
600
+ organizedBy: addressSpace.rootFolder.objects
601
+ }) as Boiler;
602
+
603
+ promoteToStateMachine(boiler1.simulation);
604
+
605
+ const boilerStateMachine = boiler1.simulation;
606
+ const readyState = boilerStateMachine.getStateByName("Ready")!;
607
+ boilerStateMachine.setState(readyState);
608
+
609
+ return boiler1;
610
+ }