KAPITEL 17. SCHNELLEINSTIEG IN LUA
Lua Strings zu einem idealen Datentype um Protokoll Telegramme zu reprä-
sentieren bzw. zu generieren.
Betrachten Sie das folgende String Beispiel:
p r i n t ( s t r i n g . dump ( " \ 0 0 0 \ 0 0 1 \ 2 5 5 \ 1 2 8 " ) )
Sie können einen String mit beliebigen Bytewerten instantieren bzw. an einen
String anfügen, indem Sie den 3-stelligen Dezimalwert des Bytes mit einem
vorangestellten Backslash eingeben. In obigem Beispiel startet der String mit
einem Null Byte, gefolgt von den binären Werten 1, 255 und 128.
Die dump Funktion ist eine Analyser Erweiterung des Lua string Moduls. Sie
erlaubt die Ausgabe eines Strings in hexadezimaler Notation (neben anderen)
und ist sehr hilfreich wenn Sie eigens generierte Telegramm Sequenzen auf
ihre Korrektheit überprüfen wollen.
Das nächste Beispiel zeigt anhand einer einfachen Checksum Funktion wie Sie
auf beliebige Bytes innerhalb eines Strings zugreifen können.
Die meisten Feldbus Protokolle verwenden Prüfsummen um die Korrektheit der
übertragenen Datensequenzen sicherstellen zu können. Ein einfacher Prüf-
summen Algorithmus ist die Module 256 Summe über alle zu sendenden Da-
2
tenbytes
. Eine entsprechende Lua Funktion (Zeile 1...7) sieht wie folgt aus:
1
function Checksum ( data )
2
l o c a l chksum = 0
3
f o r i =1 ,# data do
4
chksum = chksum + s t r i n g . b y t e ( data , i )
5
end
6
r e t u r n chksum % 256
7
end
8
9
p r i n t ( Checksum ( " h e l l o w o r l d " ) )
Geben Sie die obigen Zeilen im Sketch Buffer des Editors ein und pressen Sie
F5
. Zeile 9 ruft die Checksum Funktion mit der Datensequenz bzw. dem Lua
String "Hello world" auf. Das Resultat ist 92.
Wie funktioniert es?
Im Funktionsrumpf legen wir zunächst eine lokale Variable chksum an und in-
itialisieren sie mit 0. Zeile 3 iteriert über alle im übergebenen String enthaltenen
Bytes (oder Zeichen) wobei i den Index (die Position) des jeweiligen Zeichens
enthält.
Beachten Sie hier: Im Gegensatz zu anderen Programmiersprachen zählt Lua
Tabellen und String Positionen (Indexe) von 1 an und nicht von 0!
# in Zeile 3 ist in Lua als sogenannter Längen Operator definiert. Er gibt die
Länge eines Strings oder Arrays zurück. Zum Beispiel liefert:
p r i n t ( #" h e l l o w o r l d " )
das Resultat 11.
Zeile 3 zählt daher die Variable i von 1 (dem ersten Zeichen im String) bis 11
(dem letzten Zeichen).
2
Optional verwendet z.B. in IEC60870-5-103
196
> 00 01 FF 80
> 92
> 11