diff --git a/tt/STE.csv b/tt/STE.csv index de6c2ac..fbc1c25 100644 --- a/tt/STE.csv +++ b/tt/STE.csv @@ -122,3 +122,4 @@ date,from,to,hours,category,name 2023-08-09,17:00,20:00,3,printing,Page layout 2023-08-10,10:00,14:00,4,meeting,Test Waage 2023-08-10,16:00,19:00,3,wpf,Bug fixing +2023-08-11,16:00,18:45,2.75,scales,Waage diff --git a/waagen/SysTec/Datensatzbeschreibung SysTec IT.pdf b/waagen/SysTec/Datensatzbeschreibung SysTec IT.pdf new file mode 100644 index 0000000..b334480 Binary files /dev/null and b/waagen/SysTec/Datensatzbeschreibung SysTec IT.pdf differ diff --git a/waagen/SysTec/IT3000A/aufzeichnung1.txt b/waagen/SysTec/IT3000A/aufzeichnung1.txt new file mode 100644 index 0000000..4f436b8 --- /dev/null +++ b/waagen/SysTec/IT3000A/aufzeichnung1.txt @@ -0,0 +1,24 @@ +<000011.08.2319:03 01 0 0 0kg 1 43166> +<000011.08.2319:03 01 0 0 0kg 1 43166> +<000011.08.2319:03 01 0 0 0kg 1 43166> +<000011.08.2319:03 01 0 0 0kg 1 43166> +<000011.08.2319:04 01 0 0 0kg 1 21615> +<000011.08.2319:04 01 0 0 0kg 1 21615> +<000011.08.2319:04 01 0 0 0kg 1 21615> +<000011.08.2319:04 01 0 0 0kg 1 21615> +<000011.08.2319:05 01 0 0 0kg 1 40446> +<000011.08.2319:05 01 0 0 0kg 1 40446> +<000011.08.2319:05 01 0 0 0kg 1 40446> +<000011.08.2319:05 01 0 0 0kg 1 40446> +<000011.08.2319:06 01 0 0 0kg 1 34638> +<000011.08.2319:06 01 0 0 0kg 1 34638> +<000011.08.2319:07 01 0 0 0kg 1 20191> +<000011.08.2319:07 01 0 0 0kg 1 20191> +<000011.08.2319:08 01 0 0 0kg 1 16047> +<000011.08.2319:08 01 0 0 0kg 1 16047> +<000011.08.2319:09 01 0 0 0kg 1 63294> +<000011.08.2319:09 01 0 0 0kg 1 63294> +<000011.08.2319:10 01 0 0 0kg 1 7718> +<000011.08.2319:10 01 0 0 0kg 1 7718> +<000011.08.2319:12 01 0 0 0kg 1 52487> +<000011.08.2319:12 01 0 0 0kg 1 52487> diff --git a/waagen/simulator.py b/waagen/simulator.py new file mode 100755 index 0000000..87b59f0 --- /dev/null +++ b/waagen/simulator.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# SysTec IT3000A uses CRC16-modbus + +import argparse +import socket +import datetime +import random +import time +import crcmod.predefined + + +IDENT_NR = 0 + + +def crc16_modbus(data: bytes) -> int: + crc = crcmod.predefined.Crc('modbus') + crc.update(data) + return int(crc.hexdigest(), 16) + + +def handle_systec_it3000a(req: bytes) -> bytes: + global IDENT_NR + + if not req.startswith(b'<') or not req.endswith(b'>'): + return b'<01>\r\n' + req = req[1:-1] + + if len(req) > 3: + return b'<02>\r\n' + if req.startswith(b'RN'): + incr = True + elif req.startswith(b'RM'): + incr = False + else: + return b'<02>\r\n' + + if incr: + time.sleep(random.randint(0, 40) / 10.0) + + gew = random.randint(40, 4000) + m = random.randint(1, 10) + match m: + case 1: + return b'<12>\r\n' + case 2: + incr = False + gew = 0 + + if incr: + IDENT_NR += 1 + now = datetime.datetime.now() + data = f'0000{now:%d.%m.%y%H:%M}{IDENT_NR if incr else 0:4}1{gew:8}{0:8}{gew:8}kg {1:3}'.encode('ascii') + return b'<' + data + f'{crc16_modbus(data):8}'.encode('ascii') + b'>\r\n' + + +def main() -> None: + s = socket.socket() + s.bind(('0.0.0.0', 1234)) + s.listen() + print('Ready for connections') + + while True: + c, a = s.accept() + print(f'Accepting connection from {a}') + try: + while True: + req = c.recv(1024) + print(req.decode('ascii'), end='') + res = handle_systec_it3000a(req) + print(res.decode('ascii'), end='') + c.send(res) + except: + pass + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + args = parser.parse_args() + main()