MTPPy2.0 0.1.5__py3-none-any.whl

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 (214) hide show
  1. examples/__init__.py +0 -0
  2. examples/minimal+pid.py +82 -0
  3. examples/minimal.py +32 -0
  4. examples/minimal_recipe.py +117 -0
  5. examples/pea_alarm_base.py +47 -0
  6. examples/pea_minimal.py +258 -0
  7. mtppy/__init__.py +1 -0
  8. mtppy/part1/__init__.py +4 -0
  9. mtppy/part1/empty_folder_test.py +7 -0
  10. mtppy/part3/__init__.py +4 -0
  11. mtppy/part3/data_assembly_set/__init__.py +4 -0
  12. mtppy/part3/data_assembly_set/active_elements/__init__.py +4 -0
  13. mtppy/part3/data_assembly_set/active_elements/active_element.py +22 -0
  14. mtppy/part3/data_assembly_set/active_elements/drives/__init__.py +4 -0
  15. mtppy/part3/data_assembly_set/active_elements/drives/ana_drv.py +446 -0
  16. mtppy/part3/data_assembly_set/active_elements/drives/ana_drv_test.py +567 -0
  17. mtppy/part3/data_assembly_set/active_elements/drives/bin_drv.py +365 -0
  18. mtppy/part3/data_assembly_set/active_elements/drives/bin_drv_test.py +503 -0
  19. mtppy/part3/data_assembly_set/active_elements/drives/mon_ana_drv.py +469 -0
  20. mtppy/part3/data_assembly_set/active_elements/drives/mon_ana_drv_test.py +418 -0
  21. mtppy/part3/data_assembly_set/active_elements/drives/mon_bin_drv.py +295 -0
  22. mtppy/part3/data_assembly_set/active_elements/drives/mon_bin_drv_test.py +265 -0
  23. mtppy/part3/data_assembly_set/active_elements/pid/__init__.py +4 -0
  24. mtppy/part3/data_assembly_set/active_elements/pid/pid_ctrl.py +333 -0
  25. mtppy/part3/data_assembly_set/active_elements/pid/pid_ctrl_test.py +156 -0
  26. mtppy/part3/data_assembly_set/active_elements/valves/__init__.py +4 -0
  27. mtppy/part3/data_assembly_set/active_elements/valves/ana_vlv.py +402 -0
  28. mtppy/part3/data_assembly_set/active_elements/valves/ana_vlv_test.py +732 -0
  29. mtppy/part3/data_assembly_set/active_elements/valves/bin_vlv.py +279 -0
  30. mtppy/part3/data_assembly_set/active_elements/valves/bin_vlv_test.py +585 -0
  31. mtppy/part3/data_assembly_set/active_elements/valves/mon_ana_vlv.py +402 -0
  32. mtppy/part3/data_assembly_set/active_elements/valves/mon_ana_vlv_test.py +270 -0
  33. mtppy/part3/data_assembly_set/active_elements/valves/mon_bin_vlv.py +286 -0
  34. mtppy/part3/data_assembly_set/active_elements/valves/mon_bin_vlv_test.py +224 -0
  35. mtppy/part3/data_assembly_set/base_functions/__init__.py +4 -0
  36. mtppy/part3/data_assembly_set/base_functions/operation_mode.py +252 -0
  37. mtppy/part3/data_assembly_set/base_functions/operation_mode_test.py +260 -0
  38. mtppy/part3/data_assembly_set/base_functions/oslevel.py +35 -0
  39. mtppy/part3/data_assembly_set/base_functions/source_mode.py +189 -0
  40. mtppy/part3/data_assembly_set/base_functions/source_mode_test.py +112 -0
  41. mtppy/part3/data_assembly_set/base_functions/wqc.py +75 -0
  42. mtppy/part3/data_assembly_set/base_functions/wqc_test.py +86 -0
  43. mtppy/part3/data_assembly_set/data_assembly.py +65 -0
  44. mtppy/part3/data_assembly_set/diagnostic_elements/__init__.py +4 -0
  45. mtppy/part3/data_assembly_set/diagnostic_elements/diagnostic_element.py +19 -0
  46. mtppy/part3/data_assembly_set/indicator_elements/__init__.py +4 -0
  47. mtppy/part3/data_assembly_set/indicator_elements/indicator_element.py +22 -0
  48. mtppy/part3/data_assembly_set/indicator_elements/views/__init__.py +4 -0
  49. mtppy/part3/data_assembly_set/indicator_elements/views/ana_view.py +68 -0
  50. mtppy/part3/data_assembly_set/indicator_elements/views/bin_view.py +73 -0
  51. mtppy/part3/data_assembly_set/indicator_elements/views/dint_view.py +76 -0
  52. mtppy/part3/data_assembly_set/indicator_elements/views/string_view.py +55 -0
  53. mtppy/part3/data_assembly_set/operation_elements/__init__.py +4 -0
  54. mtppy/part3/data_assembly_set/operation_elements/operation_element.py +19 -0
  55. mtppy/part3/data_assembly_set/pea_elements/__init__.py +4 -0
  56. mtppy/part3/data_assembly_set/pea_elements/pea_element.py +28 -0
  57. mtppy/part3/data_assembly_set/pea_elements/pea_information_label/__init__.py +4 -0
  58. mtppy/part3/data_assembly_set/pea_elements/pea_information_label/pea_information_label.py +231 -0
  59. mtppy/part3/data_assembly_set/pea_elements/web_server_url_info/__init__.py +4 -0
  60. mtppy/part3/data_assembly_set/pea_elements/web_server_url_info/web_server_url_info.py +42 -0
  61. mtppy/part3/definitions/__init__.py +4 -0
  62. mtppy/part3/definitions/mtp_access.py +15 -0
  63. mtppy/part4/__init__.py +4 -0
  64. mtppy/part4/automation_services/__init__.py +4 -0
  65. mtppy/part4/automation_services/base_functions/__init__.py +4 -0
  66. mtppy/part4/automation_services/base_functions/service_operation_mode.py +368 -0
  67. mtppy/part4/automation_services/base_functions/service_operation_mode_test.py +242 -0
  68. mtppy/part4/automation_services/base_functions/service_operator_interaction.py +62 -0
  69. mtppy/part4/automation_services/base_functions/service_source_mode.py +138 -0
  70. mtppy/part4/automation_services/base_functions/service_source_mode_test.py +179 -0
  71. mtppy/part4/automation_services/helpers/__init__.py +4 -0
  72. mtppy/part4/automation_services/helpers/command_en_control.py +330 -0
  73. mtppy/part4/automation_services/helpers/command_en_control_test.py +302 -0
  74. mtppy/part4/automation_services/helpers/state_machine.py +167 -0
  75. mtppy/part4/automation_services/helpers/state_machine_test.py +294 -0
  76. mtppy/part4/automation_services/helpers/thread_control.py +39 -0
  77. mtppy/part4/automation_services/helpers/thread_control_test.py +80 -0
  78. mtppy/part4/automation_services/procedure.py +111 -0
  79. mtppy/part4/automation_services/procedure_test.py +185 -0
  80. mtppy/part4/automation_services/service.py +463 -0
  81. mtppy/part4/automation_services/service_elements/__init__.py +4 -0
  82. mtppy/part4/automation_services/service_elements/parameter_elements/__init__.py +4 -0
  83. mtppy/part4/automation_services/service_elements/parameter_elements/ana_serv_param.py +108 -0
  84. mtppy/part4/automation_services/service_elements/parameter_elements/ana_serv_param_test.py +59 -0
  85. mtppy/part4/automation_services/service_elements/parameter_elements/bin_serv_param.py +70 -0
  86. mtppy/part4/automation_services/service_elements/parameter_elements/bin_serv_param_test.py +39 -0
  87. mtppy/part4/automation_services/service_elements/parameter_elements/common_serv_param.py +111 -0
  88. mtppy/part4/automation_services/service_elements/parameter_elements/dint_serv_param.py +77 -0
  89. mtppy/part4/automation_services/service_elements/parameter_elements/dint_serv_param_test.py +58 -0
  90. mtppy/part4/automation_services/service_elements/parameter_elements/parameter_element.py +175 -0
  91. mtppy/part4/automation_services/service_elements/parameter_elements/parameter_element_test.py +246 -0
  92. mtppy/part4/automation_services/service_elements/parameter_elements/string_serv_param.py +48 -0
  93. mtppy/part4/automation_services/service_elements/parameter_elements/string_serv_param_test.py +37 -0
  94. mtppy/part4/automation_services/service_elements/procedure_health_view.py +36 -0
  95. mtppy/part4/automation_services/service_elements/service_control.py +473 -0
  96. mtppy/part4/automation_services/service_elements/service_control_test.py +150 -0
  97. mtppy/part4/automation_services/service_elements/service_element.py +20 -0
  98. mtppy/part4/automation_services/service_test.py +407 -0
  99. mtppy/part4/definitions/__init__.py +4 -0
  100. mtppy/part4/definitions/command_codes.py +58 -0
  101. mtppy/part4/definitions/command_codes_test.py +44 -0
  102. mtppy/part4/definitions/state_codes.py +65 -0
  103. mtppy/part4/definitions/state_codes_test.py +44 -0
  104. mtppy/part4/process_values/__init__.py +4 -0
  105. mtppy/part4/process_values/base_functions/__init__.py +4 -0
  106. mtppy/part4/process_values/base_functions/vqc.py +48 -0
  107. mtppy/part4/process_values/input_elements/__init__.py +4 -0
  108. mtppy/part4/process_values/input_elements/ana_process_value_in.py +160 -0
  109. mtppy/part4/process_values/input_elements/bin_process_value_in.py +83 -0
  110. mtppy/part4/process_values/input_elements/dint_process_value_in.py +159 -0
  111. mtppy/part4/process_values/input_elements/input_element.py +40 -0
  112. mtppy/part4/process_values/input_elements/string_process_value_in.py +45 -0
  113. mtppy/part5/__init__.py +4 -0
  114. mtppy/part5/communication_object.py +99 -0
  115. mtppy/part5/communication_object_test.py +59 -0
  116. mtppy/part5/definitions/__init__.py +4 -0
  117. mtppy/part5/definitions/iec61131_data_types.py +31 -0
  118. mtppy/part5/definitions/iec61131_data_types_test.py +82 -0
  119. mtppy/part5/definitions/opcua_data_types.py +36 -0
  120. mtppy/part5/definitions/opcua_data_types_test.py +90 -0
  121. mtppy/part5/definitions/w3c_xml_data_types.py +177 -0
  122. mtppy/part5/definitions/w3c_xml_data_types_test.py +143 -0
  123. mtppy/part5/server_assembly_set/__init__.py +5 -0
  124. mtppy/part6/__init__.py +4 -0
  125. mtppy/part6/alarm_set/__init__.py +4 -0
  126. mtppy/part6/alarm_set/alarm.py +132 -0
  127. mtppy/part6/alarm_set/alarm_test.py +265 -0
  128. mtppy/pea/__init__.py +19 -0
  129. mtppy/pea/data_assembly_factory.py +124 -0
  130. mtppy/pea/data_assembly_factory_test.py +229 -0
  131. mtppy/pea/mtp_generator/__init__.py +4 -0
  132. mtppy/pea/mtp_generator/mtp_generator.py +1183 -0
  133. mtppy/pea/mtp_generator/mtp_generator_test.py +518 -0
  134. mtppy/pea/pea.py +139 -0
  135. mtppy/pea/pea_opcua_server/__init__.py +4 -0
  136. mtppy/pea/pea_opcua_server/marshalling.py +60 -0
  137. mtppy/pea/pea_opcua_server/opcua_options_provider/__init__.py +4 -0
  138. mtppy/pea/pea_opcua_server/opcua_options_provider/instances/basic_opcua_options_provider.py +50 -0
  139. mtppy/pea/pea_opcua_server/opcua_options_provider/opcua_options_provider.py +103 -0
  140. mtppy/pea/pea_opcua_server/pea_opcua_server.py +492 -0
  141. mtppy/pea/pea_opcua_server/subscription_list.py +55 -0
  142. mtppy/pea/pea_test.py +59 -0
  143. mtppy/pea/rmtp_pea.py +155 -0
  144. mtppy/pea/rmtp_pea_test.py +27 -0
  145. mtppy/pea/service_factory.py +178 -0
  146. mtppy/pea/service_factory_test.py +156 -0
  147. mtppy/pea/user_logic/__init__.py +4 -0
  148. mtppy/pea/user_logic/user_logic_pea.py +72 -0
  149. mtppy/pea/user_logic/user_logic_registry.py +106 -0
  150. mtppy/pea/user_logic/user_logic_registry_test.py +167 -0
  151. mtppy/pea/user_logic/user_logic_service.py +228 -0
  152. mtppy/pea/user_logic/user_logic_service_test.py +289 -0
  153. mtppy/utils/__init__.py +4 -0
  154. mtppy/utils/data_assembly_dict.py +61 -0
  155. mtppy/utils/data_assembly_dict_test.py +107 -0
  156. mtppy/utils/data_item.py +446 -0
  157. mtppy/utils/data_item_com_test.py +82 -0
  158. mtppy/utils/data_item_test.py +325 -0
  159. mtppy/utils/logging.py +23 -0
  160. mtppy/utils/logging_test.py +26 -0
  161. mtppy/utils/mtp_file_handling/__init__.py +4 -0
  162. mtppy/utils/mtp_file_handling/extract_manifest_from_mtp_file.py +22 -0
  163. mtppy/utils/mtp_file_handling/extract_mtp_file.py +22 -0
  164. mtppy/utils/mtp_file_handling/is_valid_mtp.py +22 -0
  165. mtppy/utils/mtp_file_handling/is_valid_path_for_manifest.py +15 -0
  166. mtppy/utils/mtp_file_handling/is_valid_path_to_manifest.py +17 -0
  167. mtppy/utils/mtp_file_handling/is_valid_path_to_mtp.py +17 -0
  168. mtppy/utils/mtp_file_handling/load_manifest_file.py +24 -0
  169. mtppy/utils/mtp_file_handling/mtp_reader/__init__.py +4 -0
  170. mtppy/utils/mtp_file_handling/mtp_reader/mtp_reader.py +103 -0
  171. mtppy/utils/mtp_file_handling/mtp_reader/mtp_reader_test.py +96 -0
  172. mtppy/utils/mtp_file_handling/mtp_reader/mtp_xml.py +226 -0
  173. mtppy/utils/mtp_file_handling/mtp_reader/mtp_xml_test.py +108 -0
  174. mtppy/utils/mtp_file_handling/mtp_writer/__init__.py +4 -0
  175. mtppy/utils/mtp_file_handling/mtp_writer/mtp_writer.py +77 -0
  176. mtppy/utils/mtp_file_handling/mtp_writer/ressources/get_content_types.py +10 -0
  177. mtppy/utils/mtp_file_handling/mtp_writer/ressources/get_rels.py +11 -0
  178. mtppy/utils/mtp_file_handling/mtp_writer/test_mtp_writer.py +25 -0
  179. mtppy/utils/mtp_file_handling/write_manifest_file.py +29 -0
  180. mtppy/utils/mtp_file_handling/write_manifest_file_test.py +22 -0
  181. mtppy/utils/mtp_file_handling/write_mtp_file.py +43 -0
  182. mtppy/utils/mtp_file_handling/write_mtp_file_test.py +22 -0
  183. mtppy/utils/testing.py +31 -0
  184. mtppy2_0-0.1.5.dist-info/METADATA +75 -0
  185. mtppy2_0-0.1.5.dist-info/RECORD +214 -0
  186. mtppy2_0-0.1.5.dist-info/WHEEL +5 -0
  187. mtppy2_0-0.1.5.dist-info/entry_points.txt +3 -0
  188. mtppy2_0-0.1.5.dist-info/licenses/LICENSE +21 -0
  189. mtppy2_0-0.1.5.dist-info/top_level.txt +4 -0
  190. tools/__init__.py +0 -0
  191. tools/create_bugreport.py +150 -0
  192. tools/inspect_mtp.py +110 -0
  193. utils/__init__.py +1 -0
  194. utils/file_handling/__init__.py +4 -0
  195. utils/file_handling/cleanup_folder.py +9 -0
  196. utils/file_handling/get_utc_foldername_with_ms.py +15 -0
  197. utils/file_handling/get_work_dir.py +9 -0
  198. utils/file_handling/is_valid_path_for_json.py +11 -0
  199. utils/file_handling/is_valid_path_to_json.py +17 -0
  200. utils/file_handling/load_json_file.py +18 -0
  201. utils/file_handling/read_file_from_file_archive.py +43 -0
  202. utils/file_handling/read_file_string.py +10 -0
  203. utils/file_handling/validate_json_data.py +28 -0
  204. utils/file_handling/write_json_file.py +23 -0
  205. utils/get_uuid.py +18 -0
  206. utils/get_uuid_test.py +17 -0
  207. utils/logging.py +100 -0
  208. utils/logging_test.py +67 -0
  209. utils/opcua/check_node.py +79 -0
  210. utils/resolve_unit/resolve_unit.py +11 -0
  211. utils/resolve_unit/unit_lib.py +2101 -0
  212. utils/resolve_unit/unit_lib_test.py +36 -0
  213. utils/type_conversion.py +236 -0
  214. utils/type_conversion_test.py +114 -0
@@ -0,0 +1,469 @@
1
+ """Implementation of MonAnaDrv."""
2
+
3
+ __copyright__ = (
4
+ "Copyright (c) 2026 Dresden University of Technology, Process-to-Order Group"
5
+ )
6
+ __license__ = "MIT"
7
+ from typing import ClassVar
8
+
9
+ from mtppy.utils.logging import logger
10
+ import threading
11
+ from time import sleep
12
+
13
+ from mtppy.utils.data_item import DataItem
14
+ from mtppy.part3.definitions.mtp_access import MTPAccess
15
+ from mtppy.part5.definitions.w3c_xml_data_types import W3cXmlDataTypes
16
+ from mtppy.part3.data_assembly_set.active_elements.drives.ana_drv import AnaDrv
17
+ from mtppy.part3.data_assembly_set.base_functions.operation_mode import (
18
+ OperationMode as OM,
19
+ )
20
+
21
+
22
+ class MonAnaDrvValues:
23
+ def __init__(
24
+ self,
25
+ fwd_aut,
26
+ fwd_op,
27
+ rev_aut,
28
+ rev_op,
29
+ stop_aut,
30
+ stop_op,
31
+ reset_aut,
32
+ reset_op,
33
+ rpm,
34
+ ) -> None:
35
+ self.fwd_aut = fwd_aut
36
+ self.fwd_op = fwd_op
37
+ self.rev_aut = rev_aut
38
+ self.rev_op = rev_op
39
+ self.stop_aut = stop_aut
40
+ self.stop_op = stop_op
41
+ self.reset_aut = reset_aut
42
+ self.reset_op = reset_op
43
+ self.rpm = rpm
44
+ self.lock = threading.Lock()
45
+ self.stop_event_lock = threading.Event()
46
+
47
+
48
+ class MonAnaDrv(AnaDrv):
49
+ MON_EN = "MonEn"
50
+ MON_SAFE_POS = "MonSafePos"
51
+ MON_STAT_ERR = "MonStatErr"
52
+ MON_DYN_ERR = "MonDynErr"
53
+ MON_STAT_TI = "MonStatTi"
54
+ MON_DYN_TI = "MonDynTi"
55
+ RPM_ERR = "RpmErr"
56
+ RPM_AH_EN = "RpmAHEn"
57
+ RPM_AL_EN = "RpmALEn"
58
+ RPM_AH_ACT = "RpmAHAct"
59
+ RPM_AL_ACT = "RpmALAct"
60
+ RPM_AH_LIM = "RpmAHLim"
61
+ RPM_AL_LIM = "RpmALLim"
62
+
63
+ CLASS_DATA_ITEMS: ClassVar = {
64
+ MON_EN: DataItem(
65
+ MON_EN,
66
+ W3cXmlDataTypes.BOOLEAN,
67
+ MTPAccess.ReadAccess,
68
+ True,
69
+ ),
70
+ MON_SAFE_POS: DataItem(
71
+ MON_SAFE_POS,
72
+ W3cXmlDataTypes.BOOLEAN,
73
+ MTPAccess.ReadAccess,
74
+ True,
75
+ ),
76
+ MON_STAT_ERR: DataItem(
77
+ MON_STAT_ERR,
78
+ W3cXmlDataTypes.BOOLEAN,
79
+ MTPAccess.ReadAccess,
80
+ False,
81
+ ),
82
+ MON_DYN_ERR: DataItem(
83
+ MON_DYN_ERR,
84
+ W3cXmlDataTypes.BOOLEAN,
85
+ MTPAccess.ReadAccess,
86
+ False,
87
+ ),
88
+ MON_STAT_TI: DataItem(
89
+ MON_STAT_TI,
90
+ W3cXmlDataTypes.FLOAT,
91
+ MTPAccess.ReadAccess,
92
+ 1,
93
+ ),
94
+ MON_DYN_TI: DataItem(
95
+ MON_DYN_TI,
96
+ W3cXmlDataTypes.FLOAT,
97
+ MTPAccess.ReadAccess,
98
+ 1,
99
+ ),
100
+ RPM_ERR: DataItem(
101
+ RPM_ERR,
102
+ W3cXmlDataTypes.FLOAT,
103
+ MTPAccess.ReadAccess,
104
+ 0,
105
+ ),
106
+ RPM_AH_EN: DataItem(
107
+ RPM_AH_EN,
108
+ W3cXmlDataTypes.BOOLEAN,
109
+ MTPAccess.ReadAccess,
110
+ True,
111
+ ),
112
+ RPM_AL_EN: DataItem(
113
+ RPM_AL_EN,
114
+ W3cXmlDataTypes.BOOLEAN,
115
+ MTPAccess.ReadAccess,
116
+ True,
117
+ ),
118
+ RPM_AH_ACT: DataItem(
119
+ RPM_AH_ACT,
120
+ W3cXmlDataTypes.BOOLEAN,
121
+ MTPAccess.ReadAccess,
122
+ False,
123
+ ),
124
+ RPM_AL_ACT: DataItem(
125
+ RPM_AL_ACT,
126
+ W3cXmlDataTypes.BOOLEAN,
127
+ MTPAccess.ReadAccess,
128
+ False,
129
+ ),
130
+ RPM_AH_LIM: DataItem(
131
+ RPM_AH_LIM,
132
+ W3cXmlDataTypes.FLOAT,
133
+ MTPAccess.ReadAccess,
134
+ True,
135
+ ),
136
+ RPM_AL_LIM: DataItem(
137
+ RPM_AL_LIM,
138
+ W3cXmlDataTypes.FLOAT,
139
+ MTPAccess.ReadAccess,
140
+ True,
141
+ ),
142
+ }
143
+
144
+ monitored_values: MonAnaDrvValues
145
+ monitor_static_thread: threading.Thread
146
+ monitor_dynamic_thread: threading.Thread
147
+ monitor_rpm_error_thread: threading.Thread
148
+ monitor_rpm_limit_high_thread: threading.Thread
149
+ monitor_rpm_limit_low_thread: threading.Thread
150
+
151
+ def __init__(
152
+ self,
153
+ tag_name,
154
+ tag_description,
155
+ rpm_min=0,
156
+ rpm_max=1000,
157
+ rpm_scl_min=0,
158
+ rpm_scl_max=1000,
159
+ rpm_unit=0,
160
+ rev_fbk_calc=True,
161
+ fwd_fbk_calc=True,
162
+ rpm_fbk_calc=True,
163
+ safe_pos=0,
164
+ fwd_en=True,
165
+ rev_en=False,
166
+ perm_en=False,
167
+ intl_en=False,
168
+ prot_en=False,
169
+ mon_en=True,
170
+ mon_safe_pos=True,
171
+ mon_stat_ti=1,
172
+ mon_dyn_ti=1,
173
+ rpm_ah_en=True,
174
+ rpm_al_en=True,
175
+ rpm_ah_lim=900,
176
+ rpm_al_lim=50,
177
+ ):
178
+ super().__init__(
179
+ tag_name,
180
+ tag_description,
181
+ rpm_min,
182
+ rpm_max,
183
+ rpm_scl_min,
184
+ rpm_scl_max,
185
+ rpm_unit,
186
+ rev_fbk_calc,
187
+ fwd_fbk_calc,
188
+ rpm_fbk_calc,
189
+ safe_pos,
190
+ fwd_en,
191
+ rev_en,
192
+ perm_en,
193
+ intl_en,
194
+ prot_en,
195
+ )
196
+ self.mtpObjectType = (
197
+ "MTPDataObjectSUCLib/DataAssembly/ActiveElement/AnaDrv/MonAnaDrv"
198
+ )
199
+
200
+ self[MonAnaDrv.MON_EN] = mon_en
201
+ self[MonAnaDrv.MON_SAFE_POS] = mon_safe_pos
202
+ self[MonAnaDrv.MON_STAT_TI] = mon_stat_ti
203
+ self[MonAnaDrv.MON_DYN_TI] = mon_dyn_ti
204
+ self[MonAnaDrv.RPM_AH_EN] = rpm_ah_en
205
+ self[MonAnaDrv.RPM_AL_EN] = rpm_al_en
206
+ self[MonAnaDrv.RPM_AH_LIM] = rpm_ah_lim
207
+ self[MonAnaDrv.RPM_AL_LIM] = rpm_al_lim
208
+
209
+ self.monitored_values = MonAnaDrvValues(
210
+ self[MonAnaDrv.FWD_AUT],
211
+ self[MonAnaDrv.FWD_OP],
212
+ self[MonAnaDrv.REV_AUT],
213
+ self[MonAnaDrv.REV_OP],
214
+ self[MonAnaDrv.STOP_AUT],
215
+ self[MonAnaDrv.STOP_OP],
216
+ self[MonAnaDrv.RESET_AUT],
217
+ self[MonAnaDrv.RESET_OP],
218
+ self[MonAnaDrv.RPM_],
219
+ )
220
+ self.monitor_static_thread = None
221
+ self.monitor_dynamic_thread = None
222
+ self.monitor_rpm_error_thread = None
223
+ self.monitor_rpm_limit_high_thread = None
224
+ self.monitor_rpm_limit_low_thread = None
225
+
226
+ def compare_states_control_signals(self, monitor_time):
227
+
228
+ self.monitored_values.lock.acquire()
229
+ fwd_ctrl1 = self[MonAnaDrv.FWD_FBK]
230
+ rev_ctrl1 = self[MonAnaDrv.REV_FBK]
231
+ fwd_op1 = self.monitored_values.fwd_op
232
+ fwd_aut1 = self.monitored_values.fwd_aut
233
+ rev_op1 = self.monitored_values.rev_op
234
+ rev_aut1 = self.monitored_values.rev_aut
235
+ stop_op1 = self.monitored_values.stop_op
236
+ stop_aut1 = self.monitored_values.stop_aut
237
+ reset_op1 = self.monitored_values.reset_op
238
+ reset_aut1 = self.monitored_values.reset_aut
239
+ self.monitored_values.lock.release()
240
+
241
+ sleep(monitor_time)
242
+
243
+ self.monitored_values.lock.acquire()
244
+ fwd_ctrl2 = self[MonAnaDrv.FWD_FBK]
245
+ rev_ctrl2 = self[MonAnaDrv.REV_FBK]
246
+ fwd_op2 = self.monitored_values.fwd_op
247
+ fwd_aut2 = self.monitored_values.fwd_aut
248
+ rev_op2 = self.monitored_values.rev_op
249
+ rev_aut2 = self.monitored_values.rev_aut
250
+ stop_op2 = self.monitored_values.stop_op
251
+ stop_aut2 = self.monitored_values.stop_aut
252
+ reset_op2 = self.monitored_values.reset_op
253
+ reset_aut2 = self.monitored_values.reset_aut
254
+ self.monitored_values.lock.release()
255
+
256
+ control_signals_comparison = [
257
+ fwd_op1 == fwd_op2,
258
+ fwd_aut1 == fwd_aut2,
259
+ rev_op1 == rev_op2,
260
+ rev_aut1 == rev_aut2,
261
+ stop_op1 == stop_op2,
262
+ stop_aut1 == stop_aut2,
263
+ reset_op1 == reset_op2,
264
+ reset_aut1 == reset_aut2,
265
+ ]
266
+ state_comparison = [fwd_ctrl1 == fwd_ctrl2, rev_ctrl1 == rev_ctrl2]
267
+ return state_comparison, control_signals_comparison
268
+
269
+ def monitor_static_error(self):
270
+ while not (self.monitored_values.stop_event_lock.is_set()):
271
+ states, control_signals = self.compare_states_control_signals(
272
+ self[self.MON_STAT_TI]
273
+ )
274
+
275
+ if not (all(states)) and all(control_signals):
276
+ self[self.MON_STAT_ERR] = True
277
+ logger.debug("Static error set to True")
278
+ self._handle_monitored_error()
279
+
280
+ logger.debug("static monitoring stopped")
281
+
282
+ def monitor_dynamic_error(self):
283
+ while not (self.monitored_values.stop_event_lock.is_set()):
284
+ states, control_signals = self.compare_states_control_signals(
285
+ self[self.MON_DYN_TI]
286
+ )
287
+
288
+ if all(states) and not (all(control_signals)):
289
+ self[self.MON_DYN_ERR] = True
290
+ logger.debug("Dynamic error set to True")
291
+ self._handle_monitored_error()
292
+
293
+ logger.debug("dynamic monitoring stopped")
294
+
295
+ def monitor_rpm_error(self):
296
+ while not (self.monitored_values.stop_event_lock.is_set()):
297
+ rpm_error = self.monitored_values.rpm - self[MonAnaDrv.RPM_FBK]
298
+ if rpm_error:
299
+ self[MonAnaDrv.RPM_ERR] = rpm_error
300
+ logger.debug(f"Rpm error set to {rpm_error}")
301
+ self._handle_monitored_error()
302
+
303
+ sleep(0.01)
304
+ logger.debug("rpm monitoring stopped")
305
+
306
+ def monitor_rpm_high_limit(self):
307
+ while not (self.monitored_values.stop_event_lock.is_set()):
308
+ self.monitored_values.lock.acquire()
309
+ high_limit_alarm = self[MonAnaDrv.RPM_FBK] > self[MonAnaDrv.RPM_AH_LIM]
310
+ self.monitored_values.lock.release()
311
+ if high_limit_alarm:
312
+ self[MonAnaDrv.RPM_AH_ACT] = True
313
+ logger.debug("Rpm limit high set to True")
314
+ sleep(0.01)
315
+ logger.debug("rpm high limit monitoring stopped")
316
+
317
+ def monitor_rpm_low_limit(self):
318
+ while not (self.monitored_values.stop_event_lock.is_set()):
319
+ self.monitored_values.lock.acquire()
320
+ low_limit_alarm = self[MonAnaDrv.RPM_FBK] < self[MonAnaDrv.RPM_AL_LIM]
321
+ self.monitored_values.lock.release()
322
+ if low_limit_alarm:
323
+ self[MonAnaDrv.RPM_AL_ACT] = True
324
+ logger.debug("Rpm limit low set to True")
325
+ sleep(0.01)
326
+ logger.debug("rpm low limit monitoring stopped")
327
+
328
+ def _handle_monitored_error(self):
329
+ logger.debug("set valve to safety position")
330
+ self._go_save_pos()
331
+ self[MonAnaDrv.SAFE_POS_ACT] = True
332
+
333
+ def start_monitor(self):
334
+ if self[MonAnaDrv.MON_EN]:
335
+ self.monitor_static_thread = threading.Thread(
336
+ target=self.monitor_static_error, daemon=True
337
+ )
338
+ self.monitor_static_thread.start()
339
+ logger.debug("static monitoring start")
340
+
341
+ self.monitor_dynamic_thread = threading.Thread(
342
+ target=self.monitor_dynamic_error, daemon=True
343
+ )
344
+ self.monitor_dynamic_thread.start()
345
+ logger.debug("dynamic monitoring start")
346
+
347
+ self.monitor_rpm_error_thread = threading.Thread(
348
+ target=self.monitor_rpm_error, daemon=True
349
+ )
350
+ self.monitor_rpm_error_thread.start()
351
+ logger.debug("rpm error monitoring start")
352
+
353
+ if self[MonAnaDrv.RPM_AH_EN]:
354
+ self.monitor_rpm_limit_high_thread = threading.Thread(
355
+ target=self.monitor_rpm_high_limit, daemon=True
356
+ )
357
+ self.monitor_rpm_limit_high_thread.start()
358
+ logger.debug("rpm high limit monitoring start")
359
+
360
+ if self[MonAnaDrv.RPM_AL_EN]:
361
+ self.monitor_rpm_limit_low_thread = threading.Thread(
362
+ target=self.monitor_rpm_low_limit, daemon=True
363
+ )
364
+ self.monitor_rpm_limit_low_thread.start()
365
+ logger.debug("rpm low limit monitoring start")
366
+
367
+ def set_fwd_op(self, value: bool):
368
+ logger.debug("FwdOp set to {value}")
369
+ if self.op_mode[OM.STATE_OP_ACT] and self[AnaDrv.FWD_EN]:
370
+ if value and self._run_allowed():
371
+ self._run_fwd_drv()
372
+ if self[MonAnaDrv.MON_EN]:
373
+ self.monitored_values.lock.acquire()
374
+ self.monitored_values.fwd_op = value
375
+ self.monitored_values.lock.release()
376
+ self[MonAnaDrv.FWD_OP] = False
377
+
378
+ def set_rev_op(self, value: bool):
379
+ logger.debug(f"RevOp set to {value}")
380
+ if self.op_mode[OM.STATE_OP_ACT] and self[AnaDrv.REV_EN]:
381
+ if value and self._run_allowed():
382
+
383
+ if self[MonAnaDrv.MON_EN]:
384
+ self.monitored_values.lock.acquire()
385
+ self.monitored_values.rev_op = value
386
+ self.monitored_values.lock.release()
387
+ self._run_rev_drv()
388
+ self[MonAnaDrv.REV_OP] = False
389
+
390
+ def set_stop_op(self, value: bool):
391
+ logger.debug(f"StopOp set to {value}")
392
+ if self.op_mode[OM.STATE_OP_ACT] and value:
393
+ if self[MonAnaDrv.MON_EN]:
394
+ self.monitored_values.lock.acquire()
395
+ self.monitored_values.stop_op = value
396
+ self.monitored_values.lock.release()
397
+ self._stop_drv()
398
+ self[MonAnaDrv.STOP_OP] = False
399
+
400
+ def set_reset_op(self, value: bool):
401
+ logger.debug(f"ResetOp set to {value}")
402
+ if self.op_mode[OM.STATE_OP_ACT] and value:
403
+ if self[MonAnaDrv.MON_EN]:
404
+ self.monitored_values.lock.acquire()
405
+ self.monitored_values.reset_op = value
406
+ self.monitored_values.lock.release()
407
+ self._reset_drv()
408
+ self[MonAnaDrv.RESET_OP] = False
409
+
410
+ def set_fwd_aut(self, value: bool):
411
+ logger.debug(f"FwdAut set to {value}")
412
+ if self.op_mode[OM.STATE_AUT_ACT] and self[AnaDrv.FWD_EN]:
413
+ if value and self._run_allowed():
414
+ if self[MonAnaDrv.MON_EN]:
415
+ self.monitored_values.lock.acquire()
416
+ self.monitored_values.fwd_aut = value
417
+ self.monitored_values.lock.release()
418
+ self._run_fwd_drv()
419
+
420
+ def set_rev_aut(self, value: bool):
421
+ logger.debug(f"RevAut set to {value}")
422
+ if self.op_mode[OM.STATE_AUT_ACT] and self[AnaDrv.REV_EN]:
423
+ if value and self._run_allowed():
424
+ if self[MonAnaDrv.MON_EN]:
425
+ self.monitored_values.lock.acquire()
426
+ self.monitored_values.rev_aut = value
427
+ self.monitored_values.lock.release()
428
+ self._run_rev_drv()
429
+
430
+ def set_stop_aut(self, value: bool):
431
+ logger.debug(f"StopAut set to {value}")
432
+ if self.op_mode[OM.STATE_AUT_ACT] and value:
433
+ if self[MonAnaDrv.MON_EN]:
434
+ self.monitored_values.lock.acquire()
435
+ self.monitored_values.stop_aut = value
436
+ self.monitored_values.lock.release()
437
+ self._stop_drv()
438
+
439
+ def set_reset_aut(self, value: bool):
440
+ logger.debug(f"ResetAut set to {value}")
441
+ if self.op_mode[OM.STATE_AUT_ACT] and value:
442
+ if self[MonAnaDrv.MON_EN]:
443
+ self.monitored_values.lock.acquire()
444
+ self.monitored_values.reset_aut = value
445
+ self.monitored_values.lock.release()
446
+ self._reset_drv()
447
+
448
+ def _set_rpm(self, value: float):
449
+ if self.valid_value(value):
450
+ self[MonAnaDrv.RPM_] = value
451
+ if self[MonAnaDrv.MON_EN]:
452
+ self.monitored_values.lock.acquire()
453
+ self.monitored_values.rpm = value
454
+ self.monitored_values.lock.release()
455
+ logger.debug(f"Rpm set to {value}")
456
+
457
+ if self[MonAnaDrv.RPM_FBK_CALC]:
458
+ if self[MonAnaDrv.MON_EN]:
459
+ self.monitored_values.lock.acquire()
460
+ self[MonAnaDrv.RPM_FBK] = value
461
+ self.monitored_values.lock.release()
462
+ else:
463
+ self[MonAnaDrv.RPM_FBK] = value
464
+
465
+ else:
466
+ logger.debug(f"Rpm cannot be set to {value} (out of range)")
467
+
468
+ def set_stop_monitor(self):
469
+ self.monitored_values.stop_event_lock.set()