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,279 @@
1
+ """Implementation of BinVlv."""
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
+ from mtppy.utils.data_item import DataItem
11
+ from mtppy.part3.definitions.mtp_access import MTPAccess
12
+ from mtppy.part5.definitions.w3c_xml_data_types import W3cXmlDataTypes
13
+ from mtppy.part3.data_assembly_set.active_elements.active_element import ActiveElement
14
+ from mtppy.part3.data_assembly_set.base_functions.operation_mode import OperationMode
15
+ from mtppy.part3.data_assembly_set.base_functions.source_mode import SourceMode
16
+
17
+
18
+ class BinVlv(ActiveElement):
19
+ # DataItem constant definitions
20
+ SAFE_POS = "SafePos"
21
+ SAFE_POS_EN = "SafePosEn"
22
+ SAFE_POS_ACT = "SafePosAct"
23
+ OPEN_OP = "OpenOp"
24
+ CLOSE_OP = "CloseOp"
25
+ OPEN_AUT = "OpenAut"
26
+ CLOSE_AUT = "CloseAut"
27
+ CTRL_ = "Ctrl"
28
+ OPEN_FBK_CALC = "OpenFbkCalc"
29
+ OPEN_FBK = "OpenFbk"
30
+ CLOSE_FBK_CALC = "CloseFbkCalc"
31
+ CLOSE_FBK = "CloseFbk"
32
+ PERM_EN = "PermEn"
33
+ PERMIT_ = "Permit"
34
+ INTL_EN = "IntlEn"
35
+ INTERLOCK_ = "Interlock"
36
+ PROT_EN = "ProtEn"
37
+ PROTECT_ = "Protect"
38
+ RESET_OP = "ResetOp"
39
+ RESET_AUT = "ResetAut"
40
+
41
+ # Class-level data items dictionary
42
+ CLASS_DATA_ITEMS: ClassVar = {
43
+ SAFE_POS: DataItem(
44
+ SAFE_POS, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
45
+ ),
46
+ SAFE_POS_EN: DataItem(
47
+ SAFE_POS_EN, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
48
+ ),
49
+ SAFE_POS_ACT: DataItem(
50
+ SAFE_POS_ACT, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
51
+ ),
52
+ OPEN_OP: DataItem(
53
+ OPEN_OP, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadWriteAccess, None
54
+ ),
55
+ CLOSE_OP: DataItem(
56
+ CLOSE_OP, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadWriteAccess, None
57
+ ),
58
+ OPEN_AUT: DataItem(
59
+ OPEN_AUT, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
60
+ ),
61
+ CLOSE_AUT: DataItem(
62
+ CLOSE_AUT, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
63
+ ),
64
+ CTRL_: DataItem(CTRL_, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None),
65
+ OPEN_FBK_CALC: DataItem(
66
+ OPEN_FBK_CALC, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
67
+ ),
68
+ OPEN_FBK: DataItem(
69
+ OPEN_FBK, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
70
+ ),
71
+ CLOSE_FBK_CALC: DataItem(
72
+ CLOSE_FBK_CALC, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
73
+ ),
74
+ CLOSE_FBK: DataItem(
75
+ CLOSE_FBK, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
76
+ ),
77
+ PERM_EN: DataItem(PERM_EN, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None),
78
+ PERMIT_: DataItem(PERMIT_, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None),
79
+ INTL_EN: DataItem(INTL_EN, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None),
80
+ INTERLOCK_: DataItem(
81
+ INTERLOCK_, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
82
+ ),
83
+ PROT_EN: DataItem(PROT_EN, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None),
84
+ PROTECT_: DataItem(
85
+ PROTECT_, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
86
+ ),
87
+ RESET_OP: DataItem(
88
+ RESET_OP, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadWriteAccess, None
89
+ ),
90
+ RESET_AUT: DataItem(
91
+ RESET_AUT, W3cXmlDataTypes.BOOLEAN, MTPAccess.ReadAccess, None
92
+ ),
93
+ }
94
+
95
+ op_mode: OperationMode
96
+ src_mode: SourceMode
97
+
98
+ def __init__(
99
+ self,
100
+ tag_name: str,
101
+ tag_description: str = "",
102
+ open_fbk_calc: bool = True,
103
+ close_fbk_calc: bool = True,
104
+ safe_pos: int = 0,
105
+ safe_pos_en: bool = False,
106
+ perm_en: bool = False,
107
+ intl_en: bool = False,
108
+ prot_en: bool = False,
109
+ ):
110
+ """
111
+ Binary Valve (BinVlv).
112
+ """
113
+
114
+ super().__init__(tag_name, tag_description)
115
+ self.mtpObjectType = "MTPDataObjectSUCLib/DataAssembly/ActiveElement/BinVlv"
116
+
117
+ self.op_mode = OperationMode()
118
+ self.src_mode = SourceMode()
119
+
120
+ # Initialize data items with dynamic values (using class-defined data items)
121
+ self[BinVlv.SAFE_POS] = safe_pos
122
+ self[BinVlv.SAFE_POS_EN] = safe_pos_en
123
+ self[BinVlv.SAFE_POS_ACT] = False
124
+ self[BinVlv.OPEN_OP] = 0
125
+ self[BinVlv.CLOSE_OP] = 0
126
+ self[BinVlv.OPEN_AUT] = 0
127
+ self[BinVlv.CLOSE_AUT] = 0
128
+ self[BinVlv.CTRL_] = 0
129
+ self[BinVlv.OPEN_FBK_CALC] = open_fbk_calc
130
+ self[BinVlv.OPEN_FBK] = False
131
+ self[BinVlv.CLOSE_FBK_CALC] = close_fbk_calc
132
+ self[BinVlv.CLOSE_FBK] = False
133
+ self[BinVlv.PERM_EN] = perm_en
134
+ self[BinVlv.PERMIT_] = 0
135
+ self[BinVlv.INTL_EN] = intl_en
136
+ self[BinVlv.INTERLOCK_] = 0
137
+ self[BinVlv.PROT_EN] = prot_en
138
+ self[BinVlv.PROTECT_] = 0
139
+ self[BinVlv.RESET_OP] = 0
140
+ self[BinVlv.RESET_AUT] = 0
141
+
142
+ # Set callbacks for writable items
143
+ self.get_item(BinVlv.OPEN_OP).ext_wrt_cb = self.set_open_op
144
+ self.get_item(BinVlv.CLOSE_OP).ext_wrt_cb = self.set_close_op
145
+ self.get_item(BinVlv.RESET_OP).ext_wrt_cb = self.set_reset_op
146
+
147
+ def _expect_save_pos(self):
148
+ if self._run_allowed():
149
+ self[BinVlv.SAFE_POS_ACT] = False
150
+ else:
151
+ if self[BinVlv.SAFE_POS_EN]:
152
+ self._go_safe_pos()
153
+ else:
154
+ logger.debug("Device has no safe position")
155
+ self[BinVlv.SAFE_POS_ACT] = True
156
+
157
+ def _go_safe_pos(self):
158
+ if self[BinVlv.SAFE_POS]:
159
+ self._run_open_vlv()
160
+ else:
161
+ self._run_close_vlv()
162
+
163
+ def set_open_aut(self, value: bool):
164
+ logger.debug(f"OpenAut set to {value}")
165
+ if self.op_mode[OperationMode.STATE_AUT_ACT]:
166
+ if value and self._run_allowed():
167
+ self._run_open_vlv()
168
+
169
+ def set_close_aut(self, value: bool):
170
+ logger.debug(f"CloseAut set to {value}")
171
+ if self.op_mode[OperationMode.STATE_AUT_ACT]:
172
+ if value and self._run_allowed():
173
+ self._run_close_vlv()
174
+
175
+ def set_reset_aut(self, value: bool):
176
+ logger.debug(f"ResetAut set to {value}")
177
+ if self.op_mode[OperationMode.STATE_AUT_ACT] and value:
178
+ self._reset_vlv()
179
+
180
+ def set_open_op(self, value: bool):
181
+ logger.debug(f"OpenOp set to {value}")
182
+ if self.op_mode[OperationMode.STATE_OP_ACT]:
183
+ if value and self._run_allowed():
184
+ self._run_open_vlv()
185
+ self[BinVlv.OPEN_OP] = False
186
+
187
+ def set_close_op(self, value: bool):
188
+ logger.debug(f"CloseOp set to {value}")
189
+ if self.op_mode[OperationMode.STATE_OP_ACT]:
190
+ if value and self._run_allowed():
191
+ self._run_close_vlv()
192
+ self[BinVlv.CLOSE_OP] = False
193
+
194
+ def set_reset_op(self, value: bool):
195
+ logger.debug(f"ResetOp set to {value}")
196
+ if self.op_mode[OperationMode.STATE_OP_ACT] and value:
197
+ self._reset_vlv()
198
+ self[BinVlv.RESET_OP] = False
199
+
200
+ def _run_allowed(self):
201
+ if self[BinVlv.PERM_EN] and self[BinVlv.PERMIT_] == 0:
202
+ logger.debug("Permission is not given")
203
+ return False
204
+ if self[BinVlv.INTL_EN] and self[BinVlv.INTERLOCK_] == 0:
205
+ logger.debug("Interlock is active")
206
+ return False
207
+ if self[BinVlv.PROT_EN] and self[BinVlv.PROTECT_] == 0:
208
+ logger.debug("Protect is active")
209
+ return False
210
+ return True
211
+
212
+ def _run_open_vlv(self):
213
+ self[BinVlv.CTRL_] = True
214
+ if self[BinVlv.OPEN_FBK_CALC]:
215
+ self[BinVlv.OPEN_FBK] = True
216
+
217
+ if self[BinVlv.CLOSE_FBK_CALC]:
218
+ self[BinVlv.CLOSE_FBK] = False
219
+
220
+ def _run_close_vlv(self):
221
+ self[BinVlv.CTRL_] = False
222
+ if self[BinVlv.OPEN_FBK_CALC]:
223
+ self[BinVlv.OPEN_FBK] = False
224
+
225
+ if self[BinVlv.CLOSE_FBK_CALC]:
226
+ self[BinVlv.CLOSE_FBK] = True
227
+
228
+ def _reset_vlv(self):
229
+ if self[BinVlv.PROT_EN] and self[BinVlv.PROTECT_] == 0:
230
+ self[BinVlv.PROTECT_] = True
231
+
232
+ if self[BinVlv.SAFE_POS_EN]:
233
+ self[BinVlv.SAFE_POS_ACT] = False
234
+
235
+ self[BinVlv.CTRL_] = False
236
+ if self[BinVlv.OPEN_FBK_CALC]:
237
+ self[BinVlv.OPEN_FBK] = False
238
+
239
+ if self[BinVlv.CLOSE_FBK_CALC]:
240
+ self[BinVlv.CLOSE_FBK] = False
241
+
242
+ def set_open_fbk(self, value: bool):
243
+ if not self[BinVlv.OPEN_FBK_CALC]:
244
+ self[BinVlv.OPEN_FBK] = value
245
+ logger.debug(f"OpenFbk set to {value}")
246
+
247
+ def set_close_fbk(self, value: bool):
248
+ if not self[BinVlv.CLOSE_FBK_CALC]:
249
+ self[BinVlv.CLOSE_FBK] = value
250
+ logger.debug(f"CloseFbk set to {value}")
251
+
252
+ def set_permit(self, value: bool):
253
+ if not self[BinVlv.PERM_EN]:
254
+ value = True
255
+ self[BinVlv.PERMIT_] = value
256
+ logger.debug(f"Permit set to {value}")
257
+ self[BinVlv.SAFE_POS_ACT] = False
258
+
259
+ def set_interlock(self, value: bool):
260
+ if not self[BinVlv.INTL_EN]:
261
+ value = True
262
+ self[BinVlv.INTERLOCK_] = value
263
+ logger.debug(f"Interlock set to {value}")
264
+ self._expect_save_pos()
265
+
266
+ def set_protect(self, value: bool):
267
+ if not self[BinVlv.PROT_EN]:
268
+ value = True
269
+ if value:
270
+ self._reset_vlv()
271
+ self[BinVlv.PROTECT_] = value
272
+ logger.debug(f"Protect set to {value}")
273
+ self._expect_save_pos()
274
+
275
+ def get_open_fbk(self):
276
+ return self[BinVlv.OPEN_FBK]
277
+
278
+ def get_close_fbk(self):
279
+ return self[BinVlv.CLOSE_FBK]