Prechádzať zdrojové kódy

add timestamp correction

Johannes Müller 3 rokov pred
rodič
commit
939457fc2b
36 zmenil súbory, kde vykonal 33 pridanie a 12 odobranie
  1. BIN
      AI-energy-meter-Project.backup/2022-04-19.022954.262/2022-04-19.022954.262.zip
  2. BIN
      AI-energy-meter-Project/IM/SPL/options
  3. 0 0
      AI-energy-meter-Project/IM/SearchIndex/_og.frq
  4. BIN
      AI-energy-meter-Project/IM/SearchIndex/_og.prx
  5. BIN
      AI-energy-meter-Project/IM/SearchIndex/_og.tii
  6. BIN
      AI-energy-meter-Project/IM/SearchIndex/_og_3.del
  7. BIN
      AI-energy-meter-Project/IM/SearchIndex/_oh.cfs
  8. BIN
      AI-energy-meter-Project/IM/SearchIndex/_oi.cfs
  9. BIN
      AI-energy-meter-Project/IM/SearchIndex/_oi_1.del
  10. BIN
      AI-energy-meter-Project/IM/SearchIndex/_oj.cfs
  11. BIN
      AI-energy-meter-Project/IM/SearchIndex/_oj_1.del
  12. BIN
      AI-energy-meter-Project/IM/SearchIndex/_ok.cfs
  13. BIN
      AI-energy-meter-Project/IM/SearchIndex/_ok_1.del
  14. BIN
      AI-energy-meter-Project/IM/SearchIndex/_ol.cfs
  15. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg.fdt
  16. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg.fdx
  17. 0 0
      AI-energy-meter-Project/IM/SearchIndex/_tg.fnm
  18. 0 0
      AI-energy-meter-Project/IM/SearchIndex/_tg.frq
  19. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg.prx
  20. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg.tii
  21. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg.tis
  22. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg.tvd
  23. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg.tvf
  24. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg.tvx
  25. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tg_2.del
  26. BIN
      AI-energy-meter-Project/IM/SearchIndex/_th.cfs
  27. BIN
      AI-energy-meter-Project/IM/SearchIndex/_ti.cfs
  28. 0 0
      AI-energy-meter-Project/IM/SearchIndex/_ti_1.del
  29. BIN
      AI-energy-meter-Project/IM/SearchIndex/_tj.cfs
  30. BIN
      AI-energy-meter-Project/IM/SearchIndex/segments.gen
  31. BIN
      AI-energy-meter-Project/IM/SearchIndex/segments_hd
  32. BIN
      AI-energy-meter-Project/IM/SearchIndex/segments_l8
  33. BIN
      AI-energy-meter-Project/System/PEData.idx
  34. BIN
      AI-energy-meter-Project/System/PEData.plf
  35. BIN
      AI-energy-meter-Project/XRef/XRef.db
  36. 33 12
      box-pc/application/inputs/snap7_server.py

BIN
AI-energy-meter-Project.backup/2022-04-19.022954.262/2022-04-19.022954.262.zip


BIN
AI-energy-meter-Project/IM/SPL/options


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
AI-energy-meter-Project/IM/SearchIndex/_og.frq


BIN
AI-energy-meter-Project/IM/SearchIndex/_og.prx


BIN
AI-energy-meter-Project/IM/SearchIndex/_og.tii


BIN
AI-energy-meter-Project/IM/SearchIndex/_og_3.del


BIN
AI-energy-meter-Project/IM/SearchIndex/_oh.cfs


BIN
AI-energy-meter-Project/IM/SearchIndex/_oi.cfs


BIN
AI-energy-meter-Project/IM/SearchIndex/_oi_1.del


BIN
AI-energy-meter-Project/IM/SearchIndex/_oj.cfs


BIN
AI-energy-meter-Project/IM/SearchIndex/_oj_1.del


BIN
AI-energy-meter-Project/IM/SearchIndex/_ok.cfs


BIN
AI-energy-meter-Project/IM/SearchIndex/_ok_1.del


BIN
AI-energy-meter-Project/IM/SearchIndex/_ol.cfs


BIN
AI-energy-meter-Project/IM/SearchIndex/_og.fdt → AI-energy-meter-Project/IM/SearchIndex/_tg.fdt


BIN
AI-energy-meter-Project/IM/SearchIndex/_og.fdx → AI-energy-meter-Project/IM/SearchIndex/_tg.fdx


+ 0 - 0
AI-energy-meter-Project/IM/SearchIndex/_og.fnm → AI-energy-meter-Project/IM/SearchIndex/_tg.fnm


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
AI-energy-meter-Project/IM/SearchIndex/_tg.frq


BIN
AI-energy-meter-Project/IM/SearchIndex/_tg.prx


BIN
AI-energy-meter-Project/IM/SearchIndex/_tg.tii


BIN
AI-energy-meter-Project/IM/SearchIndex/_og.tis → AI-energy-meter-Project/IM/SearchIndex/_tg.tis


BIN
AI-energy-meter-Project/IM/SearchIndex/_og.tvd → AI-energy-meter-Project/IM/SearchIndex/_tg.tvd


BIN
AI-energy-meter-Project/IM/SearchIndex/_og.tvf → AI-energy-meter-Project/IM/SearchIndex/_tg.tvf


BIN
AI-energy-meter-Project/IM/SearchIndex/_og.tvx → AI-energy-meter-Project/IM/SearchIndex/_tg.tvx


BIN
AI-energy-meter-Project/IM/SearchIndex/_tg_2.del


BIN
AI-energy-meter-Project/IM/SearchIndex/_th.cfs


BIN
AI-energy-meter-Project/IM/SearchIndex/_om.cfs → AI-energy-meter-Project/IM/SearchIndex/_ti.cfs


+ 0 - 0
AI-energy-meter-Project/IM/SearchIndex/_om_1.del → AI-energy-meter-Project/IM/SearchIndex/_ti_1.del


BIN
AI-energy-meter-Project/IM/SearchIndex/_on.cfs → AI-energy-meter-Project/IM/SearchIndex/_tj.cfs


BIN
AI-energy-meter-Project/IM/SearchIndex/segments.gen


BIN
AI-energy-meter-Project/IM/SearchIndex/segments_hd


BIN
AI-energy-meter-Project/IM/SearchIndex/segments_l8


BIN
AI-energy-meter-Project/System/PEData.idx


BIN
AI-energy-meter-Project/System/PEData.plf


BIN
AI-energy-meter-Project/XRef/XRef.db


+ 33 - 12
box-pc/application/inputs/snap7_server.py

@@ -1,7 +1,9 @@
+from psutil import cpu_times
 import snap7
 import time
+import struct
 import re
-from datetime import datetime
+from datetime import datetime, tzinfo
 
 from inputs.common import Input
 
@@ -10,32 +12,51 @@ localtz = datetime.now().astimezone().tzinfo
 class SiemensCPU(Input):
   interval = 0.02
 
+  time_offset = None
+
   def __init__(self):
     super().__init__(self.read_handler)
     self.server = snap7.server.Server(True)
     size = 100
-    self.DBdata = (snap7.types.wordlen_to_ctypes[snap7.types.WordLen.Byte.value] * size)()
-    self.server.register_area(snap7.types.srvAreaDB, 1, self.DBdata)
+    self.DB1 = (snap7.types.wordlen_to_ctypes[snap7.types.WordLen.Byte.value] * size)()
+    self.DB2 = (snap7.types.wordlen_to_ctypes[snap7.types.WordLen.Byte.value] * size)()
+    self.server.register_area(snap7.types.srvAreaDB, 1, self.DB1)
+    self.server.register_area(snap7.types.srvAreaDB, 2, self.DB2)
     self.server.start(102)
 
   def read_handler(self):
     event : snap7.types.SrvEvent
     while event := self.server.pick_event():
-      timestamp = datetime.now(localtz)
       text = self.server.event_text(event)
       match = re.match("^(?P<datetime>\d+-\d+-\d+ \d+:\d+:\d+) \[(?P<host>[\w\.:]+)\] (?P<type>[\w ]+), Area : (?P<area>.+), Start : (?P<start>\d+), Size : (?P<size>\d+) --> (?P<response>.+)$", text)
       if not match:
         print(text)
         continue
       
-      if match.group("type") != "Write request" or match.group("area") != "DB1":
+      if match.group("type") != "Write request":
         print(text)
         continue
       
-      raw = bytearray(self.DBdata)
-      
-      #print("{} {:4d} {:4d}".format(timestamp.microsecond, int(match.group("start")), int(match.group("size"))))
-      if int(match.group("start")) < 30:
-        self.queue_ifm_from_bytes("S7", timestamp, raw[0:30])
-      if int(match.group("start")) < 68 and int(match.group("start")) + int(match.group("size")) > 32:
-        self.queue_energy_meter_from_bytes("S7", timestamp, raw[32:68])
+      if int(match.group("start")) + int(match.group("size")) <= 4:
+        continue
+
+      if match.group("area") == "DB1":
+        raw = bytearray(self.DB1)
+        timestamp = self.get_timestamp(raw[0:4])
+        self.queue_ifm_from_bytes("S7", timestamp, raw[4:34])
+      elif match.group("area") == "DB2":
+        raw = bytearray(self.DB2)
+        timestamp = self.get_timestamp(raw[0:4])
+        self.queue_energy_meter_from_bytes("S7", timestamp, raw[4:40])
+
+  def get_timestamp(self, raw):
+    now = datetime.now(localtz)
+    cpu_time = struct.unpack(">I", raw)[0] / 1000
+    offset = now.timestamp() - cpu_time
+    if self.time_offset:
+      self.time_offset = self.time_offset * 0.999 + offset * 0.001
+    else:
+      self.time_offset = offset
+    
+    timestamp = datetime.fromtimestamp(self.time_offset + cpu_time, localtz)
+    return timestamp

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov