3
box . t e x t { c a p t i o n =" Func " , t e x t =hex . b y t e { pos=4 } }
4
box . t e x t { c a p t i o n =" R e g i s t e r " , t e x t =hex . i n t 1 6 { pos =6 , o r d e r ="BE " } }
5
box . t e x t { c a p t i o n =" Value " , t e x t =hex . i n t 1 6 { pos =8 , o r d e r ="BE " } }
6
box . t e x t { c a p t i o n = ' 'LRC' ' , t e x t = s t r i n g . f o r m a t ("%02X " , hex . b y t e { pos= t g . s i z e
( )
3}) }
7
box . hexdata { c a p t i o n ="End " , pos= t g . s i z e ( )
Im ersten Schritt ersetzen wir das tg Modul und wandeln alle hex ASCII Zei-
chen (die grünen und gelben Abschnitte) in eine rein binäre Sequenz zurück.
1
l o c a l t e l e = t e l e g r a m s . t h i s ( )
2
l o c a l b i n d a t a = base16 . decode ( t e l e : s t r i n g ( ) : sub (2 ,
Zeile 1 erfragt das aktuelle Telegramm und weist es der Variable tele zu. Die-
se Variable enthält damit alle Informationen, die zuvor per tg Modul verfügbar
waren. Im Gegensatz zu tg kann sich die Variable aber auch auf beliebige an-
dere Telegramme beziehen.
In Zeile 2 extrahieren wir den gelb/grünen Abschnitt aus dem Telegramm String
per Lua's (sub)string Funktion und übergeben ihn an die base16 decode Funk-
tion. Der gelb/grüne Abschnitt beginnt mit dem 2ten Byte (Index 2) und endet
mit dem drittletzten (Index -3). Das Result ist eine Binärsequenz der gelben
und grünen Bytes.
Bitte beachten Sie! Sie können nicht das komplette Telegramm zurückwandeln,
da der Doppelpunkt des Startzeichens als auch das CRLF keine gültigen Hex
ASCII (oder Base16) Zeichen sind!
Mit den originalen Binärdaten zur Hand gibt es keine Notwendigkeit die ver-
schiedenen Telegrammbestandteile wie z.B. Adresse, Funktion, Register, Wert
oder LRC Prüfsumme einzeln aus dem Hex ASCII Format zu konvertieren.
Die Funktion bunpack in Zeile 3 erledigt dies weitaus eleganter und in einem
Rutsch.
1
l o c a l t e l e = t e l e g r a m s . t h i s ( )
2
l o c a l b i n d a t a = base16 . decode ( t e l e : s t r i n g ( ) : sub (2 ,
3
l o c a l pos , adr , fnc , reg , v a l , l r c = bunpack ( b i n d a t a , " bb>H>Hb " )
bunpack entpackt (unpack) die ihm übergebene Datensequenz gemäß dem
zweiten Formatstring Parameter "bb>H>Hb". Übersetzt heißt das sinngemäß:
1
gebe IMMER das Ende der Umwandlung im String zurück (pos)
2
liefere das erste Zeichen als Byte (b) (adr)
3
liefere das zweite Zeichen als Byte (b) (fnc)
4
fasse das 3te und 4te Byte als vorzeichenlosen 16 Bit Wert (H) mit dem höher-
wertigen Byte zuerst (>) zusammen und gebe ihn zurück (reg)
5
fasse das 5te und 6te Byte als vorzeichenlosen 16 Bit Wert (H) mit dem höher-
wertigen Byte zuerst (>) zusammen und gebe ihn zurück (val)
6
liefere das 7te Zeichen als Byte (b) (lrc)
Insgesamt liefert der Aufruf 6 Resultate. Das erste Resultat ist immer die Posi-
tion an der die Extrahierung endete. Dies ist gleichbedeutend mit der Position
ab der ein eventuell folgender bunpack Aufruf weiter machen soll.
Zeile 3 fasst alle Resultate in den entsprechenden Variablen zusammen und
wir können diese dann ohne weitere Bearbeitung einfach ausgeben.
13.10. ÄNDERUNGEN ZU VORHERIGEN VERSIONEN
1, l e n =2 , w i d t h =2}
3) )
3) )
165