snap7_connect.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import time
  2. from datetime import datetime
  3. import struct
  4. from snap7.client import Client
  5. from snap7.exceptions import Snap7Exception
  6. from snap7.types import Areas
  7. from structures.plant import *
  8. from inputs.common import Input
  9. localtz = datetime.now().astimezone().tzinfo
  10. class SiemensCPU(Input):
  11. interval = 0.05
  12. def __init__(self, address) -> None:
  13. super().__init__(self.read_handler)
  14. self.address = address
  15. self.cpu = Client()
  16. def start(self):
  17. try:
  18. self.cpu.connect(self.address, rack=0, slot=0)
  19. except Snap7Exception:
  20. pass
  21. super().start()
  22. def read_handler(self):
  23. timestamp = datetime.now(localtz)
  24. cpu_state = self.cpu.get_cpu_state() == "S7CpuStatusRun"
  25. if self.cpu.get_connected():
  26. try:
  27. status = self.cpu.read_area(area=Areas.DB, dbnumber=3, start=0, size=4)
  28. #inputs = self.cpu.read_area(area=Areas.PE, dbnumber=0, start=32, size=112-32)
  29. except Snap7Exception as ex:
  30. if "TCP" in str(ex):
  31. self.cpu.disconnect()
  32. return
  33. else:
  34. raise ex
  35. else:
  36. self.cpu.disconnect()
  37. self.cpu.connect(self.address, rack=0, slot=0)
  38. return
  39. hydraulics_powered = status[0] & 1 > 0
  40. data = struct.unpack(">BBBB", status)
  41. #print(''.join(["{:02X}".format(x) for x in inputs]))
  42. unterteil_faehrt_aus, \
  43. unterteil_faehrt_ein, \
  44. auswerfer_1_heben, \
  45. auswerfer_1_senken, \
  46. auswerfer_2_heben, \
  47. auswerfer_2_senken, \
  48. abdruecker_seitenteil_links_einfahren, \
  49. abdruecker_seitenteil_links_ausfahren = [data[0] & (1 << i) > 0 for i in range(8)]
  50. abdruecker_seitenteil_rechts_einfahren, \
  51. abdruecker_seitenteil_rechts_ausfahren, \
  52. rolltor_schliessen, \
  53. rolltor_oeffnen, \
  54. gaswagen_ausfahren, \
  55. gaswagen_einfahren, \
  56. schwenkplatte_abklappen, \
  57. schwenkplatte_einklappen = [data[1] & (1 << i) > 0 for i in range(8)]
  58. losteil_1_unterteil_einfahren, \
  59. losteil_1_unterteil_ausfahren, \
  60. losteil_2_einfahren, \
  61. losteil_2_ausfahren, \
  62. losteil_3_einfahren, \
  63. losteil_3_ausfahren, \
  64. losteil_4_einfahren, \
  65. losteil_4_ausfahren = [data[2] & (1 << i) > 0 for i in range(8)]
  66. losteil_5_einfahren, \
  67. losteil_5_ausfahren, \
  68. seitenteil_links_schliessen, \
  69. seitenteil_rechts_schliessen, \
  70. seitenteil_links_und_rechts_oeffnen, \
  71. sandschleuse_schliessen, \
  72. sandschleuse_oeffnen, \
  73. sandmessung_3_wege_ventil_schliessen = [data[3] & (1 << i) > 0 for i in range(8)]
  74. sandmessung_3_wege_ventil_oeffnen, \
  75. schuss, \
  76. hubtisch_senken, \
  77. hubtisch_heben, \
  78. oberteil_heben, \
  79. oberteil_senken = [data[4] & (1 << i) > 0 for i in range(6)]
  80. self._q.put(PlantState(timestamp, "S7", cpu_state,
  81. unterteil_faehrt_aus, \
  82. unterteil_faehrt_ein, \
  83. auswerfer_1_heben, \
  84. auswerfer_1_senken, \
  85. auswerfer_2_heben, \
  86. auswerfer_2_senken, \
  87. abdruecker_seitenteil_links_einfahren, \
  88. abdruecker_seitenteil_links_ausfahren, \
  89. abdruecker_seitenteil_rechts_einfahren, \
  90. abdruecker_seitenteil_rechts_ausfahren, \
  91. rolltor_schliessen, \
  92. rolltor_oeffnen, \
  93. gaswagen_ausfahren, \
  94. gaswagen_einfahren, \
  95. schwenkplatte_abklappen, \
  96. schwenkplatte_einklappen, \
  97. losteil_1_unterteil_einfahren, \
  98. losteil_1_unterteil_ausfahren, \
  99. losteil_2_einfahren, \
  100. losteil_2_ausfahren, \
  101. losteil_3_einfahren, \
  102. losteil_3_ausfahren, \
  103. losteil_4_einfahren, \
  104. losteil_4_ausfahren, \
  105. losteil_5_einfahren, \
  106. losteil_5_ausfahren, \
  107. seitenteil_links_schliessen, \
  108. seitenteil_rechts_schliessen, \
  109. seitenteil_links_und_rechts_oeffnen, \
  110. sandschleuse_schliessen, \
  111. sandschleuse_oeffnen, \
  112. sandmessung_3_wege_ventil_schliessen, \
  113. sandmessung_3_wege_ventil_oeffnen, \
  114. schuss, \
  115. hubtisch_senken, \
  116. hubtisch_heben, \
  117. oberteil_heben, \
  118. oberteil_senken
  119. ))
  120. def get_timestamp(self, cpu_time):
  121. if not self.cpu_start_time:
  122. self.synchronize()
  123. cpu_diff = cpu_time - self.cpu_start_time
  124. date = datetime.fromtimestamp(self.local_start_time + cpu_diff, localtz)
  125. return date