Implemented Handarbeitinterface

This commit is contained in:
2017-09-28 20:44:53 +02:00
parent 34ac752485
commit 39c7d1de4d
9 changed files with 772 additions and 77 deletions

8
DB.py
View File

@@ -91,13 +91,17 @@ class DB:
return res
def addbde (self, data):
def addbde (self, data, anlage = 'Anlage'):
"""
Add Processdata
without station information
"""
try:
cursor = self.executesql ("INSERT OR REPLACE INTO bde (dmc, startts, ladungstraeger, seriennr) VALUES ('%(dmc)s', '%(startts)s', '%(ladungstraeger)s', '%(seriennr)s');" % data)
if anlage == 'Hand':
cursor = self.executesql ("INSERT OR REPLACE INTO bde (dmc, startts, ladungstraeger, seriennr, anlage) VALUES ('%(dmc)s', '%(startts)s', '%(ladungstraeger)s', '%(seriennr)s', 'Hand');" % data)
else:
cursor = self.executesql ("INSERT OR REPLACE INTO bde (dmc, startts, ladungstraeger, seriennr) VALUES ('%(dmc)s', '%(startts)s', '%(ladungstraeger)s', '%(seriennr)s');" % data)
except:
print ("Couldnt insert into BDE")
raise Warning

77
DM30_tel.py Executable file
View File

@@ -0,0 +1,77 @@
#!/usr/bin/python
__author__ = "Michael Rest"
__date__ = "2017/09/01"
__email__ = "mr@mir.systems"
__version__ = "$Revision: 1.1 $"[11:-2]
from telegram import TELEGRAM, TEL_DM30
from telegram import tsdecode
from states import *
from parts import *
def fromstring (data):
"""
Decode the binary representation of a PD_tel from the given
parameter and note the data in the instance of the object.
Parameters:
data: The binary form of the TELEGRAM
"""
tel = TEL_DM30 ()
try:
tel.attrib['nr'] = (data [0] << 8) + data [1]
except:
print ("Debug-Nr", data[0], data[1])
tel.attrib['src'] = data [2:4].decode ()
tel.attrib['dst'] = data [4:6].decode ()
tel.attrib['type'] = data [6:10].decode ()
tel.attrib['position'] = data [10:14].decode ()
tel.attrib['dmc'] = (data [14:42]).decode ().rstrip (' \x00')
tel.attrib['starts'] = tsdecode (data [42:56].decode ())
# Bitarray other Byte Order !!
tel.attrib['bauteil'] = bauteil.get ((data [57] << 8) + data [56], '')
tel.attrib['variante'] = variante.get ((data [59] << 8) + data [58], '')
tel.attrib['seriennr'] = '0'
tel.attrib['ladungstraeger'] = '0'
return tel
class TEL_DM30 (TELEGRAM):
def __init__ (self, nr = 0, src = '30', dst = 'PC', *args, **args2):
TELEGRAM.__init__(self)
self.code = TEL_DM30
self.attrib['nr'] = nr
self.attrib['src'] = src
self.attrib['dst'] = dst
self.attrib['type'] = 'DM30'
self.attrib['dmc'] = '1234'
self.attrib['position'] = 'BC01'
self.attrib['aufnahme'] = 0
self.len = 2220907
return
def identify (self):
"""
This method can be used to identify a TELEGRAM by string.
"""
return "DM30 TELEGRAM"
def __repr__ (self):
"""
Print a representation of the TPDU. Use this method via
`-pair to transfer it over the wire. This will just return
the header data and not the real data!
"""
# Note that the data is not included in the length
return "%c%c%c" % (2, self.code << 4, self.number) + self.data
def __str__ (self):
"""
Return a readable and quite verbose overview of the TPDU instance.
Use this for debugging purposes or if you're just curious.
"""
return "Packet: %s Data: %s" % (self.identify (), repr (self.attrib))

268
PD30_tel.py Executable file
View File

@@ -0,0 +1,268 @@
#!/usr/bin/python
__author__ = "Michael Rest"
__date__ = "2016709/01"
__email__ = "mr@mir.systems"
__version__ = "$Revision: 1.1 $"[11:-2]
from telegram import TELEGRAM, TEL_PD30
from telegram import tsdecode
from states import *
def fromstring (data):
"""
Decode the binary representation of a PD_tel from the given
parameter and note the data in the instance of the object.
Parameters:
data: The binary form of the TELEGRAM
"""
tel = TEL_PD30 ()
try:
tel.attrib['nr'] = (data [0] << 8) + data [1]
except:
print ("Debug-Nr", data[0], data[1])
tel.attrib['src'] = data [2:4].decode ()
tel.attrib['dst'] = data [4:6].decode ()
tel.attrib['type'] = data [6:10].decode ()
tel.attrib['dmc'] = (data [10:38]).decode ().rstrip (' \x00')
tel.attrib['startts'] = tsdecode (data [38:52].decode ())
tel.attrib['endts'] = tsdecode (data [38:52].decode ())
#52-56 Varianten daten
tel.attrib['PutzzelleStatus'] = bearbeitungsstatus.get (chr (data [56]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['NietM6status01'] = bearbeitungsstatus.get (chr (data [58]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
try:
tel.attrib['NietM6F01'] = (data [60] << 8) + data [61]
except:
print ("Debug-NietM6F01", data[60], data[61])
try:
tel.attrib['NietM6S01'] = (data [62] << 8) + data [63]
except:
print ("Debug-NietM6S01", data[62], data[63])
tel.attrib['NietM6status02'] = bearbeitungsstatus.get (chr (data [64]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
try:
tel.attrib['NietM6F02'] = (data [66] << 8) + data [67]
except:
print ("Debug-NietM6F02", data[66], data[67])
try:
tel.attrib['NietM6S02'] = (data [68] << 8) + data [69]
except:
print ("Debug-NietM6S02", data[68], data[69])
tel.attrib['NietM6status03'] = bearbeitungsstatus.get (chr (data [70]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
try:
tel.attrib['NietM6F03'] = (data [72] << 8) + data [73]
except:
print ("Debug-NietM6F03", data[72], data[73])
try:
tel.attrib['NietM6S03'] = (data [74] << 8) + data [75]
except:
print ("Debug-NietM6S03", data[74], data[75])
tel.attrib['NietM6status04'] = bearbeitungsstatus.get (chr (data [76]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
try:
tel.attrib['NietM6F04'] = (data [78] << 8) + data [79]
except:
print ("Debug-NietM6F04", data[78], data[79])
try:
tel.attrib['NietM6S04'] = (data [80] << 8) + data [81]
except:
print ("Debug-NietM6S04", data[80], data[81])
tel.attrib['NietM6status05'] = bearbeitungsstatus.get (chr (data [82]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
try:
tel.attrib['NietM6F05'] = (data [84] << 8) + data [85]
except:
print ("Debug-NietM6F05", data[84], data[85])
try:
tel.attrib['NietM6S05'] = (data [86] << 8) + data [87]
except:
print ("Debug-NietM6S05", data[86], data[87])
tel.attrib['NietM8status01'] = bearbeitungsstatus.get (chr (data [71]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['NietM8status02'] = bearbeitungsstatus.get (chr (data [72]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['DGBM8status01'] = bearbeitungsstatus.get (chr (data [73]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['DGBM8status02'] = bearbeitungsstatus.get (chr (data [74]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['DGBM8status03'] = bearbeitungsstatus.get (chr (data [75]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['DGBM8status04'] = bearbeitungsstatus.get (chr (data [76]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
try:
tel.attrib['DGBM8M01'] = (data [90] << 8) + data [91]
except:
print ("Debug-DGBM8M01", data[90], data[91])
try:
tel.attrib['DGBM8D01'] = (data [92] << 8) + data [93]
except:
print ("Debug-DGBM8D01", data[92], data[93])
try:
tel.attrib['DGBM8W01'] = (data [94] << 8) + data [95]
except:
print ("Debug-DGBM8W01", data[94], data[95])
try:
tel.attrib['DGBM8T01'] = (data [96] << 8) + data [97]
except:
print ("Debug-DGBM8T01", data[96], data[97])
try:
tel.attrib['DGBM8M02'] = (data [98] << 8) + data [99]
except:
print ("Debug-DGBM8M02", data[98], data[99])
try:
tel.attrib['DGBM8D02'] = (data [100] << 8) + data [101]
except:
print ("Debug-DGBM8D02", data[100], data[101])
try:
tel.attrib['DGBM8W02'] = (data [102] << 8) + data [103]
except:
print ("Debug-DGBM8W02", data[102], data[103])
try:
tel.attrib['DGBM8T02'] = (data [104] << 8) + data [105]
except:
print ("Debug-DGBM8T02", data[104], data[105])
try:
tel.attrib['DGBM8M03'] = (data [106] << 8) + data [107]
except:
print ("Debug-DGBM8M03", data[106], data[107])
try:
tel.attrib['DGBM8D03'] = (data [108] << 8) + data [109]
except:
print ("Debug-DGBM8D03", data[108], data[109])
try:
tel.attrib['DGBM8W03'] = (data [110] << 8) + data [111]
except:
print ("Debug-DGBM8W03", data[110], data[111])
try:
tel.attrib['DGBM8T03'] = (data [112] << 8) + data [113]
except:
print ("Debug-DGBM8T03", data[112], data[113])
try:
tel.attrib['DGBM8M04'] = (data [114] << 8) + data [115]
except:
print ("Debug-DGBM8M04", data[114], data[115])
try:
tel.attrib['DGBM8D04'] = (data [116] << 8) + data [117]
except:
print ("Debug-DGBM8D04", data[116], data[117])
try:
tel.attrib['DGBM8W04'] = (data [118] << 8) + data [119]
except:
print ("Debug-DGBM8W04", data[118], data[119])
try:
tel.attrib['DGBM8T04'] = (data [120] << 8) + data [121]
except:
print ("Debug-DGBM8T04", data[120], data[121])
try:
tel.attrib['NietM8F01'] = (data [142] << 8) + data [143]
except:
print ("Debug-NietM8F01", data[142], data[143])
try:
tel.attrib['NietM8S01'] = (data [144] << 8) + data [145]
except:
print ("Debug-NietM8S01", data[144], data[145])
try:
tel.attrib['NietM8F02'] = (data [146] << 8) + data [147]
except:
print ("Debug-NietM8F02", data[146], data[147])
try:
tel.attrib['NietM8S02'] = (data [148] << 8) + data [149]
except:
print ("Debug-NietM8S02", data[148], data[149])
#Bajonettclip Status
#tel.attrib['bauteilstatusbajo'] = bauteilstatus.get (chr (data [160]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['bajostatus01'] = bearbeitungsstatus.get (chr (data [161]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['bajostatus02'] = bearbeitungsstatus.get (chr (data [162]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['bajostatus03'] = bearbeitungsstatus.get (chr (data [163]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['bajostatus04'] = bearbeitungsstatus.get (chr (data [164]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
#CClip
tel.attrib['clipstatus01'] = bearbeitungsstatus.get (chr (data [191]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus02'] = bearbeitungsstatus.get (chr (data [192]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus03'] = bearbeitungsstatus.get (chr (data [193]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus04'] = bearbeitungsstatus.get (chr (data [194]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus05'] = bearbeitungsstatus.get (chr (data [195]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus06'] = bearbeitungsstatus.get (chr (data [196]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus07'] = bearbeitungsstatus.get (chr (data [197]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus08'] = bearbeitungsstatus.get (chr (data [198]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus09'] = bearbeitungsstatus.get (chr (data [199]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus10'] = bearbeitungsstatus.get (chr (data [200]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus11'] = bearbeitungsstatus.get (chr (data [201]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus12'] = bearbeitungsstatus.get (chr (data [202]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus13'] = bearbeitungsstatus.get (chr (data [203]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus14'] = bearbeitungsstatus.get (chr (data [204]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus15'] = bearbeitungsstatus.get (chr (data [205]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus16'] = bearbeitungsstatus.get (chr (data [206]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus17'] = bearbeitungsstatus.get (chr (data [207]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['clipstatus18'] = bearbeitungsstatus.get (chr (data [208]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
#Masseblech
#tel.attrib['bauteilstatus'] = bauteilstatus.get (chr (data [70]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['ausgleichselement'] = bearbeitungsstatus.get (chr (data [221]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['schallisolierung'] = bearbeitungsstatus.get (chr (data [222]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['masseblech'] = bearbeitungsstatus.get (chr (data [223]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['blindniet'] = bearbeitungsstatus.get (chr (data [224]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
tel.attrib['kombimutter'] = bearbeitungsstatus.get (chr (data [225]), '') #0 - unbearbeitet; 1 - iO; 2 - niO
try:
tel.attrib['fniet'] = (data [240] << 8) + data [241]
except:
print ("Debug-fniet", data[240], data[241])
try:
tel.attrib['sniet'] = (data [242] << 8) + data [243]
except:
print ("Debug-sniet", data[242], data[243])
try:
tel.attrib['mmutter'] = (data [244] << 8) + data [245]
except:
print ("Debug-mmutter", data[244], data[245])
try:
tel.attrib['dmutter'] = (data [246] << 8) + data [247]
except:
print ("Debug-dmutter", data[246], data[247])
try:
tel.attrib['wmutter'] = (data [248] << 8) + data [249]
except:
print ("Debug-wmutter", data[248], data[249])
try:
tel.attrib['tmutter'] = (data [250] << 8) + data [251]
except:
print ("Debug-tmutter", data[250], data[251])
tel.attrib['ladungstraeger'] = ''
return tel
class TEL_PD30 (TELEGRAM):
def __init__ (self, nr = 0, src = '30', dst = 'PC', *args, **args2):
TELEGRAM.__init__(self)
self.code = TEL_PD30
self.attrib['nr'] = nr
self.attrib['src'] = src
self.attrib['dst'] = dst
self.attrib['type'] = 'PD30'
self.attrib['startts'] = ''
self.attrib['endts'] = ''
self.attrib['dmc'] = ''
self.attrib['ladungstraeger'] = ''
self.len = 2220908
return
def identify (self):
"""
This method can be used to identify a TELEGRAM by string.
"""
return "PD30 TELEGRAM"
def __repr__ (self):
"""
Print a representation of the TPDU. Use this method via
`-pair to transfer it over the wire. This will just return
the header data and not the real data!
"""
# Note that the data is not included in the length
return "%c%c%c" % (2, self.code << 4, self.number) + self.data
def __str__ (self):
"""
Return a readable and quite verbose overview of the TPDU instance.
Use this for debugging purposes or if you're just curious.
"""
return "Packet: %s Data: %s" % (self.identify (), repr (self.attrib))

View File

@@ -53,6 +53,10 @@ ipsps = 192.168.6.70
name = Fillzelle
ipsps = 192.168.6.210
[PD30]
name = Handarbeit
ipsps = 192.168.6.200
[PD98]
name = Test
ipsps = 192.168.1.150

419
bde.py
View File

@@ -140,8 +140,8 @@ class BDEServer ():
raise Warning
self.message (1, "Connection : " + ipsps + "-" + name + " added " + mode)
#Socket , Counter, Mode, StId, Name
self.connections['TCP'][ipsps] = [None, 0, mode, stid, name]
#Socket , Counterdict , Mode, StId, Name
self.connections['TCP'][ipsps] = [None, {stid : 0, 'DM' + stid [2:] : 0}, mode, stid, name]
def dt_handler (self, data, client_id, source = ''):
@@ -165,11 +165,15 @@ class BDEServer ():
if teltype == 'DM20' and self.connections[_channel][(client_id)][3] !='PD20':
print ("Invalid Telegram from this Station")
raise Warning
if teltype == 'DM30' and self.connections[_channel][(client_id)][3] !='PD30':
print ("Invalid Telegram from this Station")
raise Warning
DB_con = self.connections['DB']
# Do counter checking if a valid telegram arrived
count_old = self.connections[_channel][(client_id)][1]
count_old = self.connections[_channel][(client_id)][1][teltype]
#if 'nr' in ret_val: FixMe add method to Telegram
if ret_val.has_key('nr'):
count = ret_val['nr']
@@ -226,6 +230,51 @@ class BDEServer ():
DB_con.addpruefzelle3 (ret_val)
else:
self.message (3, ' DT_handler : DONNOT Store Data from PD20 Pruefzelle Fill for %s' % ret_val['dmc'])
elif teltype == 'PD30':
self.message (3, ' DT_handler : Store Data from PD30 Nacharbeit for %s' % ret_val['dmc'])
elif teltype == 'DM30':
self.message (3, ' DT_handler : Requested Data from PD30 Handmontage Scanner %s for %s' % (ret_val['position'], ret_val['dmc']))
#1st Check if Part in Table
_partinfo = []
if (ret_val['dmc'] in ('G11', 'G32')):
self.message (3, ' DT_handler : Found G11/G32 Data in BDE for %s' % ret_val['dmc'])
_partinfo = DB_con.getbde (ret_val['dmc'])
if ret_val['position'] == 'BC01':
#Scanner BC01 Putzzelle
#Teil anlegen und geputzt setzen
if (ret_val['dmc'] in ('G11', 'G32')):
if not len (_partinfo):
self.message (3, ' DT_handler : Create G11/G32 Data from BC01 in BDE for %s' % ret_val['dmc'])
DB_con.addbde (ret_val, anlage = 'Hand')
self.message (3, ' DT_handler : Add Putzzellendata for G11/G32 from BC01 in BDE for %s' % ret_val['dmc'])
ret_val['bauteilstatus'] = 'i.O.'
ret_val['endts'] = ret_val['startts']
DB_con.addputzzelle (ret_val)
else:
if len (_partinfo):
if ret_val['position'] == 'BC02':
#Scanner BC02 Chiron
xx = 0
elif ret_val['position'] == 'BC03':
#Scanner BC03 Vormontage RR
xx = 0
elif ret_val['position'] == 'BC04':
#Scanner BC04 WE
if (ret_val['dmc'] in ('G11', 'G32')):
if _partinfo[7] == 'n.Durchlaufen':
self.message (3, ' DT_handler : Bad state G11/G32 at BC04 for %s' % ret_val['dmc'])
_quit = 2
else:
self.message (3, ' DT_handler : Not G11/G32 at BC04 for %s' % ret_val['dmc'])
_quit = 3
elif ret_val['position'] in ('BC05', 'BC06', 'BC07'):
if (ret_val['dmc'] in ('G11', 'G32')):
print ('passt scho')
else:
#Part not found return error Code
_quit = 1
elif teltype == 'PD99':
self.message (3, ' DT_handler : Store Data from PD99 Chiron for %s' % ret_val['dmc'])
DB_con.addchiron (ret_val)
@@ -245,21 +294,28 @@ class BDEServer ():
self.log (2, ' DT_handler : Tel count FAILED --> Synchronisation')
_quit = 99
if _quit > -1 and teltype not in ('DM01', 'DM09', 'DM20'):
# Prepare Quit teltgramm
self.generatequit (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], _quit)
self.message (5, ' DT_handler : Quit Tel queued: Result: %d teltype %s' % (_quit, teltype))
count_old = count
self.connections[_channel][(client_id)][1] = count
elif teltype == 'DM01':
self.message (5, ' DT_handler : Send Lock Data Tel queued:"')
self.generatelockdata (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], ret_val['dmc'])
elif teltype == 'DM09':
self.message (5, ' DT_handler : Send PD Data Tel queued:"')
self.generatepd (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], ret_val['dmc'])
elif teltype == 'DM20':
self.message (5, ' DT_handler : Send PD Data Tel queued:"')
self.generatepdfill (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], ret_val['dmc'])
if _quit > -1:
if teltype not in ('DM01', 'DM09', 'DM20', 'DM30'):
# Prepare Quit teltgramm
self.generatequit (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], _quit)
self.message (5, ' DT_handler : Quit Tel queued: Result: %d teltype %s' % (_quit, teltype))
elif teltype == 'DM01':
self.message (5, ' DT_handler : Send Lock Data Tel queued:"')
self.generatelockdata (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], ret_val['dmc'])
elif teltype == 'DM09':
self.generatepd (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], ret_val['dmc'])
self.message (5, ' DT_handler : Send PD09 Data Tel queued:"')
elif teltype == 'DM20':
self.generatepdfill (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], ret_val['dmc'])
self.message (5, ' DT_handler : Send PD20 Data Tel queued:"')
elif teltype == 'DM30':
if ret_val['position'] in ('BC05', 'BC06', 'BC07'):
self.generatepdg11 (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], ret_val['dmc'], _quit)
else:
self.generatequit (count, _channel, client_id, teltype, ret_val ['src'], ret_val ['dst'], _quit)
#count_old = count
self.connections[_channel][(client_id)][1][teltype] = count
else:
self.message (1,'"DT_Handler : unknown Telegram type, no Number')
self.debug ()
@@ -359,6 +415,331 @@ class BDEServer ():
return
def generatepdg11 (self, count, channel, client_id, msgtype, src, dst, dmc, quit):
"""
Generate an PD30 telegram for G11 qith quit code and queue it
"""
DB_con = self.connections['DB']
self. message (3, " generatepd : generate PD30 G11 Telegram for %s on channel %s, dmc %s" % (msgtype, channel, dmc))
#Fillword
_data = bytes ([1]) + bytes ([1]) + bytes ([((count >> 8) & 0xFF)]) + bytes ([(count & 0xFF)])
_dataheader = \
doublechar (src) +\
doublechar (dst) +\
msgtype + + (4 - len(dmc)) * ' '
_datastate = bytes ([0]) + bytes ([quit % 256])
_dmc = dmc + (28 - len(dmc)) * ' '
_start = 14 * ' '
#Bde Daten holen
bde = DB_con.getbde (dmc)
_typ = ' '.encode ()
_var = ' '.encode ()
_putz = ' '
if len (bde):
dmc1, startts, endts, ladungstraeger, seriennr, variante, pruefzelle1, putzzelle, chiron, blindniet, bajonettclip, cclip, masseblech, pruefzelle2, nacharbeit, csv, pruefzelle3, gesamtstatus = bde [0]
_t = 0
if 'G11' in variante:
_typ = bytes ([1]) + bytes ([0])
_t = 1
elif 'G3' in variante:
_typ = bytes ([2]) + bytes ([0])
_t = 2
_rl = 0
if 'RL' in variante:
_rl = 1
if 'HUD' in variante:
_var = bytes ([_rl + 2]) + bytes ([0])
else:
_var = bytes ([_rl]) + bytes ([0])
_putz = bauteilstatusRev.get (putzzelle)
bn = DB_con.getblindniet (dmc)
_NietM8st01 = ' '
_NietM8st02 = ' '
_DGBM8st01 = ' '
_DGBM8st02 = ' '
_DGBM8st03 = ' '
_DGBM8st04 = ' '
_NietM6st01 = ' '
_NietM6st02 = ' '
_NietM6st03 = ' '
_NietM6st04 = ' '
_NietM6st05 = ' '
_DGBM8M01 = bytes ([0]) + bytes ([0])
_DGBM8D01 = bytes ([0]) + bytes ([0])
_DGBM8W01 = bytes ([0]) + bytes ([0])
_DGBM8T01 = bytes ([0]) + bytes ([0])
_DGBM8M02 = bytes ([0]) + bytes ([0])
_DGBM8D02 = bytes ([0]) + bytes ([0])
_DGBM8W02 = bytes ([0]) + bytes ([0])
_DGBM8T02 = bytes ([0]) + bytes ([0])
_DGBM8M03 = bytes ([0]) + bytes ([0])
_DGBM8D03 = bytes ([0]) + bytes ([0])
_DGBM8W03 = bytes ([0]) + bytes ([0])
_DGBM8T03 = bytes ([0]) + bytes ([0])
_DGBM8M04 = bytes ([0]) + bytes ([0])
_DGBM8D04 = bytes ([0]) + bytes ([0])
_DGBM8W04 = bytes ([0]) + bytes ([0])
_DGBM8T04 = bytes ([0]) + bytes ([0])
_NietM8F01 = bytes ([0]) + bytes ([0])
_NietM8S01 = bytes ([0]) + bytes ([0])
_NietM8F02 = bytes ([0]) + bytes ([0])
_NietM8S02 = bytes ([0]) + bytes ([0])
_NietM6F01 = bytes ([0]) + bytes ([0])
_NietM6S01 = bytes ([0]) + bytes ([0])
_NietM6F02 = bytes ([0]) + bytes ([0])
_NietM6S02 = bytes ([0]) + bytes ([0])
_NietM6F03 = bytes ([0]) + bytes ([0])
_NietM6S03 = bytes ([0]) + bytes ([0])
_NietM6F04 = bytes ([0]) + bytes ([0])
_NietM6S04 = bytes ([0]) + bytes ([0])
_NietM6F05 = bytes ([0]) + bytes ([0])
_NietM6S05 = bytes ([0]) + bytes ([0])
if len (bn):
dmc1, startts, endts, DGBM8status01, DGBM8status02, DGBM8status03, DGBM8status04, NietM8status01, NietM8status02, NietM6status01, NietM6status02, NietM6status03, NietM6status04, NietM6status05, DGBM8M01, DGBM8D01, DGBM8W01, DGBM8T01, DGBM8M02, DGBM8D02, DGBM8W02, DGBM8T02, DGBM8M03, DGBM8D03, DGBM8W03, DGBM8T03, DGBM8M04, DGBM8D04, DGBM8W04, DGBM8T04, NietM8F01, NietM8S01, NietM8F02, NietM8S02, NietM6F01, NietM6S01, NietM6F02, NietM6S02, NietM6F03, NietM6S03, NietM6F04, NietM6S04, NietM6F05, NietM6S05 = bn [0]
_NietM8st01 = bearbeitungstatusRev.get (NietM8status01)
_NietM8st02 = bearbeitungstatusRev.get (NietM8status02)
_DGBM8st01 = bearbeitungstatusRev.get (DGBM8status01)
_DGBM8st02 = bearbeitungstatusRev.get (DGBM8status02)
_DGBM8st03 = bearbeitungstatusRev.get (DGBM8status03)
_DGBM8st04 = bearbeitungstatusRev.get (DGBM8status04)
_NietM6st01 = bearbeitungstatusRev.get (NietM6status01)
_NietM6st02 = bearbeitungstatusRev.get (NietM6status02)
_NietM6st03 = bearbeitungstatusRev.get (NietM6status03)
_NietM6st04 = bearbeitungstatusRev.get (NietM6status04)
_NietM6st05 = bearbeitungstatusRev.get (NietM6status05)
_DGBM8M01 = bytes ([((DGBM8M01 >> 8) & 0xFF)]) + bytes ([(DGBM8M01 & 0xFF)])
_DGBM8D01 = bytes ([((DGBM8D01 >> 8) & 0xFF)]) + bytes ([(DGBM8D01 & 0xFF)])
_DGBM8W01 = bytes ([((DGBM8W01 >> 8) & 0xFF)]) + bytes ([(DGBM8W01 & 0xFF)])
_DGBM8T01 = bytes ([((DGBM8T01 >> 8) & 0xFF)]) + bytes ([(DGBM8T01 & 0xFF)])
_DGBM8M02 = bytes ([((DGBM8M02 >> 8) & 0xFF)]) + bytes ([(DGBM8M02 & 0xFF)])
_DGBM8D02 = bytes ([((DGBM8D02 >> 8) & 0xFF)]) + bytes ([(DGBM8D02 & 0xFF)])
_DGBM8W02 = bytes ([((DGBM8W02 >> 8) & 0xFF)]) + bytes ([(DGBM8W02 & 0xFF)])
_DGBM8T02 = bytes ([((DGBM8T02 >> 8) & 0xFF)]) + bytes ([(DGBM8T02 & 0xFF)])
_DGBM8M03 = bytes ([((DGBM8M03 >> 8) & 0xFF)]) + bytes ([(DGBM8M03 & 0xFF)])
_DGBM8D03 = bytes ([((DGBM8D03 >> 8) & 0xFF)]) + bytes ([(DGBM8D03 & 0xFF)])
_DGBM8W03 = bytes ([((DGBM8W03 >> 8) & 0xFF)]) + bytes ([(DGBM8W03 & 0xFF)])
_DGBM8T03 = bytes ([((DGBM8T03 >> 8) & 0xFF)]) + bytes ([(DGBM8T03 & 0xFF)])
_DGBM8M04 = bytes ([((DGBM8M04 >> 8) & 0xFF)]) + bytes ([(DGBM8M04 & 0xFF)])
_DGBM8D04 = bytes ([((DGBM8D04 >> 8) & 0xFF)]) + bytes ([(DGBM8D04 & 0xFF)])
_DGBM8W04 = bytes ([((DGBM8W04 >> 8) & 0xFF)]) + bytes ([(DGBM8W04 & 0xFF)])
_DGBM8T04 = bytes ([((DGBM8T04 >> 8) & 0xFF)]) + bytes ([(DGBM8T04 & 0xFF)])
_NietM8F01 = bytes ([((NietM8F01 >> 8) & 0xFF)]) + bytes ([(NietM8F01 & 0xFF)])
_NietM8S01 = bytes ([((NietM8S01 >> 8) & 0xFF)]) + bytes ([(NietM8S01 & 0xFF)])
_NietM8F02 = bytes ([((NietM8F02 >> 8) & 0xFF)]) + bytes ([(NietM8F02 & 0xFF)])
_NietM8S02 = bytes ([((NietM8S02 >> 8) & 0xFF)]) + bytes ([(NietM8S02 & 0xFF)])
_NietM6F01 = bytes ([((NietM6F01 >> 8) & 0xFF)]) + bytes ([(NietM6F01 & 0xFF)])
_NietM6S01 = bytes ([((NietM6S01 >> 8) & 0xFF)]) + bytes ([(NietM6S01 & 0xFF)])
_NietM6F02 = bytes ([((NietM6F02 >> 8) & 0xFF)]) + bytes ([(NietM6F02 & 0xFF)])
_NietM6S02 = bytes ([((NietM6S02 >> 8) & 0xFF)]) + bytes ([(NietM6S02 & 0xFF)])
_NietM6F03 = bytes ([((NietM6F03 >> 8) & 0xFF)]) + bytes ([(NietM6F03 & 0xFF)])
_NietM6S03 = bytes ([((NietM6S03 >> 8) & 0xFF)]) + bytes ([(NietM6S03 & 0xFF)])
_NietM6F04 = bytes ([((NietM6F04 >> 8) & 0xFF)]) + bytes ([(NietM6F04 & 0xFF)])
_NietM6S04 = bytes ([((NietM6S04 >> 8) & 0xFF)]) + bytes ([(NietM6S04 & 0xFF)])
_NietM6F05 = bytes ([((NietM6F05 >> 8) & 0xFF)]) + bytes ([(NietM6F05 & 0xFF)])
_NietM6S05 = bytes ([((NietM6S05 >> 8) & 0xFF)]) + bytes ([(NietM6S05 & 0xFF)])
bj = DB_con.getbajonettclip (dmc)
_bj1 = ' '
_bj2 = ' '
_bj3 = ' '
_bj4 = ' '
if len (bj):
dmc1, startts, endts, aufnahme, bajostatus01, bajostatus02, bajostatus03, bajostatus04 = bj [0]
_bj1 = bearbeitungstatusRev.get (bajostatus01)
_bj2 = bearbeitungstatusRev.get (bajostatus02)
_bj3 = bearbeitungstatusRev.get (bajostatus03)
_bj4 = bearbeitungstatusRev.get (bajostatus04)
cc = DB_con.getcclip (dmc)
_ccs1 = ' '
_ccs2 = ' '
_ccs3 = ' '
_ccs4 = ' '
_ccs5 = ' '
_ccs6 = ' '
_ccs7 = ' '
_ccs8 = ' '
_ccs9 = ' '
_ccs10 = ' '
_ccs11 = ' '
_ccs12 = ' '
_ccs13 = ' '
_ccs14 = ' '
_ccs15 = ' '
_ccs16 = ' '
_ccs17 = ' '
_ccs18 = ' '
_ccs19 = ' '
_ccs20 = ' '
_ccs21 = ' '
_ccs22 = ' '
_ccs23 = ' '
_ccs24 = ' '
_ccs25 = ' '
_ccs26 = ' '
_ccs27 = ' '
_ccs28 = ' '
_ccs29 = ' '
if len (cc):
dmc1, startts, endts, aufnahme, clipstatus01, clipstatus02, clipstatus03, clipstatus04, clipstatus05, clipstatus06, clipstatus07, clipstatus08, clipstatus09, clipstatus10, clipstatus11, clipstatus12, clipstatus13, clipstatus14, clipstatus15, clipstatus16, clipstatus17, clipstatus18 = cc [0]
_ccs1 = bearbeitungstatusRev.get (clipstatus01)
_ccs2 = bearbeitungstatusRev.get (clipstatus02)
_ccs3 = bearbeitungstatusRev.get (clipstatus03)
_ccs4 = bearbeitungstatusRev.get (clipstatus04)
_ccs5 = bearbeitungstatusRev.get (clipstatus05)
_ccs6 = bearbeitungstatusRev.get (clipstatus06)
_ccs7 = bearbeitungstatusRev.get (clipstatus07)
_ccs8 = bearbeitungstatusRev.get (clipstatus08)
_ccs9 = bearbeitungstatusRev.get (clipstatus09)
_ccs10 = bearbeitungstatusRev.get (clipstatus10)
_ccs11 = bearbeitungstatusRev.get (clipstatus11)
_ccs12 = bearbeitungstatusRev.get (clipstatus12)
_ccs13 = bearbeitungstatusRev.get (clipstatus13)
_ccs14 = bearbeitungstatusRev.get (clipstatus14)
_ccs15 = bearbeitungstatusRev.get (clipstatus15)
_ccs16 = bearbeitungstatusRev.get (clipstatus16)
_ccs17 = bearbeitungstatusRev.get (clipstatus17)
_ccs18 = bearbeitungstatusRev.get (clipstatus18)
mb = DB_con.getmasseblech (dmc)
_ae = ' '
_se = ' '
_mb = ' '
_bl = ' '
_km = ' '
_fniet = bytes ([0]) + bytes ([0])
_sniet = bytes ([0]) + bytes ([0])
_mmutter = bytes ([0]) + bytes ([0])
_dmutter = bytes ([0]) + bytes ([0])
_wmutter = bytes ([0]) + bytes ([0])
_tmutter = bytes ([0]) + bytes ([0])
if len (mb):
dmc1, startts, endts, ausgleichselement, schallisolierung, masseblech, blindniet, kombimutter, fniet, sniet, mmutter, dmutter, wmutter, tmutter = mb [0]
_ae = bearbeitungstatusRev.get (ausgleichselement)
_se = bearbeitungstatusRev.get (schallisolierung)
_mb = bearbeitungstatusRev.get (masseblech)
_bl = bearbeitungstatusRev.get (blindniet)
_km = bearbeitungstatusRev.get (kombimutter)
_fniet = bytes ([((fniet >> 8) & 0xFF)]) + bytes ([(fniet & 0xFF)])
_sniet = bytes ([((sniet >> 8) & 0xFF)]) + bytes ([(sniet & 0xFF)])
_mmutter = bytes ([((mmutter >> 8) & 0xFF)]) + bytes ([(mmutter & 0xFF)])
_dmutter = bytes ([((dmutter >> 8) & 0xFF)]) + bytes ([(dmutter & 0xFF)])
_wmutter = bytes ([((wmutter >> 8) & 0xFF)]) + bytes ([(wmutter & 0xFF)])
_tmutter = bytes ([((tmutter >> 8) & 0xFF)]) + bytes ([(tmutter & 0xFF)])
#RRSpezifisch
_BNMM8st01 = ' '
_BNMM8st02 = ' '
_BNMM8st03 = ' '
_BNMM8st04 = ' '
_BNMM8F01 = bytes ([0]) + bytes ([0])
_BNMM8F02 = bytes ([0]) + bytes ([0])
_BNMM8F03 = bytes ([0]) + bytes ([0])
_BNMM8F04 = bytes ([0]) + bytes ([0])
_BNMM8S01 = bytes ([0]) + bytes ([0])
_BNMM8S02 = bytes ([0]) + bytes ([0])
_BNMM8S03 = bytes ([0]) + bytes ([0])
_BNMM8S04 = bytes ([0]) + bytes ([0])
_6KSM8st01 = ' '
_6KSM8st02 = ' '
_6KSM8st03 = ' '
_6KSM8st04 = ' '
_6KSM8M01 = bytes ([0]) + bytes ([0])
_6KSM8M02 = bytes ([0]) + bytes ([0])
_6KSM8M03 = bytes ([0]) + bytes ([0])
_6KSM8M04 = bytes ([0]) + bytes ([0])
_6KSM8W01 = bytes ([0]) + bytes ([0])
_6KSM8W02 = bytes ([0]) + bytes ([0])
_6KSM8W03 = bytes ([0]) + bytes ([0])
_6KSM8W04 = bytes ([0]) + bytes ([0])
_Blechst01 = ' '
_Blechst02 = ' '
_Blechst03 = ' '
_Blechst04 = ' '
_LSKst01 = ' '
_LSKst02 = ' '
_LSKst03 = ' '
_LSKst04 = ' '
_ODBst = ' '
_ODBSst = ' '
_Filzst01 = ' '
_Filzst02 = ' '
_Filzst03 = ' '
_Filzst04 = ' '
_Bohrungst01 = ' '
_Bohrungst02 = ' '
_Bohrungst03 = ' '
_Bohrungst04 = ' '
_Bohrungst05 = ' '
_Bohrungst06 = ' '
_Bohrungst07 = ' '
_Bohrungst08 = ' '
_BTStatus = ' '
_UserID = bytes ([0]) + bytes ([0])
_space1 = ' '
_data += _dataheader.encode () + _datastate +\
_dmc.encode () + _start.encode () + _typ + _var + _putz.encode () + _space1.encode () +\
_NietM6st01.encode () + _space1.encode () + _NietM6F01 + _NietM6S01 +\
_NietM6st02.encode () + _space1.encode () + _NietM6F02 + _NietM6S01 +\
_NietM6st03.encode () + _space1.encode () + _NietM6F03 + _NietM6S01 +\
_NietM6st04.encode () + _space1.encode () + _NietM6F04 + _NietM6S01 +\
_NietM6st05.encode () + _space1.encode () + _NietM6F05 + _NietM6S01 +\
_DGBM8st01.encode () + _space1.encode () + _DGBM8M01 + _DGBM8W01 + _DGBM8D01 + _DGBM8T01 +\
_DGBM8st02.encode () + _space1.encode () + _DGBM8M02 + _DGBM8W02 + _DGBM8D02 + _DGBM8T02 +\
_DGBM8st03.encode () + _space1.encode () + _DGBM8M03 + _DGBM8W03 + _DGBM8D03 + _DGBM8T03 +\
_DGBM8st04.encode () + _space1.encode () + _DGBM8M04 + _DGBM8W04 + _DGBM8D04 + _DGBM8T04 +\
_NietM8st01.encode () + _space1.encode () + _NietM8F01 + _NietM8S01 +\
_NietM8st02.encode () + _space1.encode () + _NietM8F02 + _NietM8S02 +\
_bj1.encode () + _bj2.encode () + _bj3.encode () + _bj4.encode () +\
_ccs1.encode () + _ccs2.encode () + _ccs3.encode () + _ccs4.encode () + _ccs5.encode () +\
_ccs6.encode () + _ccs7.encode () + _ccs8.encode () + _ccs9.encode () + _ccs10.encode () +\
_ccs11.encode () + _ccs12.encode () + _ccs13.encode () + _ccs14.encode () + _ccs15.encode () +\
_ccs16.encode () + _ccs17.encode () + _ccs18.encode () + _ccs19.encode () + _ccs20.encode () +\
_ccs21.encode () + _ccs22.encode () + _ccs23.encode () + _ccs24.encode () + _ccs25.encode () +\
_ccs26.encode () + _ccs27.encode () + _ccs28.encode () + _ccs29.encode () + _space1.encode () +\
_bl.encode () + _space1.encode () + _fniet + _sniet +\
_km.encode () + _space1.encode () + _mmutter + _wmutter + _dmutter + _tmutter +\
_mb.encode () + _ae.encode () + _se.encode () + _space1.encode () +\
_BNMM8st01.encode () + _space1.encode () + _BNMM8F01 + _BNMM8S01 +\
_BNMM8st02.encode () + _space1.encode () + _BNMM8F02 + _BNMM8S02 +\
_BNMM8st03.encode () + _space1.encode () + _BNMM8F03 + _BNMM8S03 +\
_BNMM8st04.encode () + _space1.encode () + _BNMM8F04 + _BNMM8S04 +\
_6KSM8st01.encode () + _space1.encode () + _6KSM8M01 + _6KSM8W01 +\
_6KSM8st02.encode () + _space1.encode () + _6KSM8M02 + _6KSM8W02 +\
_6KSM8st03.encode () + _space1.encode () + _6KSM8M03 + _6KSM8W03 +\
_6KSM8st04.encode () + _space1.encode () + _6KSM8M04 + _6KSM8W04 +\
_Blechst01.encode () + _Blechst02.encode () + _Blechst03.encode () + _Blechst04.encode () +\
_LSKst01.encode () + _LSKst02.encode () + _LSKst03.encode () + _LSKst04.encode () +\
_ODBst.encode () + _ODBSst.encode () +\
_Filzst01.encode () + _Filzst02.encode () + _Filzst03.encode () + _Filzst04.encode () +\
_Bohrungst01.encode () + _Bohrungst02.encode () + _Bohrungst03.encode () + _Bohrungst04.encode () +\
_Bohrungst05.encode () + _Bohrungst06.encode () + _Bohrungst07.encode () + _Bohrungst08.encode () +\
_BTStatus.encode () + _space1.encode () + \
_UserID
#print (_data[1:30])
self.queue_add (channel, client_id, msgtype, _data)
return
def generatepd (self, count, channel, client_id, msgtype, src, dst, dmc):
"""
Generate an QUIT telegram and send it
@@ -874,7 +1255,7 @@ if __name__ == '__main__':
server = BDEServer (address = IP_BDE, verbose = loglevel, debug = debuglevel, DB = (DBFILE, DBTALOG) )
for i in chain (range (1, 11), range (20, 21), range (98,100)):
for i in chain (range (1, 11), range (20, 21), range (30, 31), range (98,100)):
IPPLC = config.get ('PD%02d' % i , 'ipsps')
if not IPPLC:
print ('No IP for PD%02d' % i)

View File

@@ -1,56 +0,0 @@
#! /usr/bin/python3
from socket import *
from select import select
import sys, os
import pdb
from datetime import datetime
import tel_decode
def log (msg):
"""
Print message if in verbose mode.
"""
file = open ("log.txt", "a")
dt = datetime.now ()
file.write ("%4d-%02d-%02d %02d:%02d:%02d.%06d: " %(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond))
file.write (msg + "\n")
file.close ()
if __name__ == "__main__":
s = socket(AF_INET, SOCK_STREAM)
s.setsockopt (SOL_SOCKET, SO_REUSEADDR, 1)
print ("got Socket", s)
#s.bind(("192.168.2.2", 2002))
s.bind(("0.0.0.0", 2002))
#s.bind(("192.168.6.254", 2002))
s.listen (1)
# Select free sockets for transmission
read = [s]
writes = []
while 1:
(reads, writes, xlist) = select (read, writes, [], 0.1)
# First write all remaining messages
for conn in writes:
#conn.send ('LEBELVTRAB')
writes = []
# Then read all remaining messages from ready sockets
for conn in reads:
if conn == s:
try:
print ("Connection Request on Listener Socket")
cs, client = conn.accept ()
print ("Client" , client)
read.append (cs)
print ("Read Sockets", read)
except:
print ("No Connection")
else:
data = conn.recv (16384)
if data:
writes = [conn]
print (len (data), data)
telegram = tel_decode.decodetelegram (data)
print (telegram)

View File

@@ -26,9 +26,13 @@ CREATE TABLE bde (
nacharbeit char(25) NOT NULL default 'n.Durchlaufen',
pruefzelle3 char(25) NOT NULL default 'n.Durchlaufen',
gesamtstatus char(25) NOT NULL default 'n.Durchlaufen',
anlage char(25) NOT NULL default 'Anlage',
userid INTEGER NOT NULL default 0,
csv integer NOT NULL default 0
);
alter table bde add anlage char(25) NOT NULL default 'Anlage';
alter table bde add userid INTEGER NOT NULL default 0;
CREATE TABLE blindniet (
dmc char(25) UNIQUE,

View File

@@ -58,6 +58,15 @@ def decode_PD20 (data):
from PD20_tel import fromstring
return fromstring (data)
def decode_DM30 (data):
from DM30_tel import fromstring
return fromstring (data)
def decode_PD30 (data):
from PD30_tel import fromstring
return fromstring (data)
def decode_PD98 (data):
from PD98_tel import fromstring
return fromstring (data)
@@ -87,6 +96,8 @@ b'PD99': decode_PD99,
b'PD10': decode_PD10,
b'DM20': decode_DM20,
b'PD20': decode_PD20,
b'DM30': decode_DM30,
b'PD30': decode_PD30,
b'STAT': decode_STAT
}

View File

@@ -17,6 +17,7 @@ TEL_PD08 = 0x8 # Masseblech
TEL_PD09 = 0x9 # Nacharbeit
TEL_PD10 = 0xa # Messzelle2
TEL_PD20 = 0xa # Messzelle Fill
TEL_PD30 = 0xa # Handarbeit
TEL_PD98 = 0xb # TestSPS
TEL_PD99 = 0xc # Zentrale
@@ -27,6 +28,7 @@ TEL_QUIT = 0xf #
TEL_DM09 = 0x01 # Nacharbeit
TEL_DM01 = 0x02 # DMC Messzelle 1
TEL_DM20 = 0x0a # DMC Messzelle Finn
TEL_DM30 = 0x0a # DMC Handarbeit
#Helper
def tsdecode (data):
"""