snap7_connect.py 4.2 KB

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