snap7_connect.py 4.2 KB

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