Die OOBD Lua Anleitung

Während die Lua Skripte in OOBD Seite Dir Basiskenntnisse über die Funktionsweise von Lua innerhalb von OOBD vermittelt, will diese Anleitung Dir zeigen, wie Du Lua benutzen kannst, um Deine eigenen Ideen zu realisieren.

In dieser Anleitung werden wir die Vehikelidentifikationsnummer (VIN) aus einem Fahrzeug auslesen. Während wir das Vorhaben umsetzen, werden wir ein Menü erstellen, die Hardware identifizieren, die OOBD Lua Funktionsbibliothek nutzen, die Kommunikation mit dem Fahrzeug aufnehmen und das Ergebnis anzeigen.

Zunächst brauchen wir ein Menü, auf dem Gerät das wir benutzen, um in der Lage zu sein das hier alles zu starten. Wir machen dies mit der folgenden Kodesequenz

function Start(oldvalue,id)
	identifyOOBDInterface()
	openPage("VIN Test")
	addElement("VIN Number", "vin","-",0x2, "")
	pageDone()
	return oldvalue
end
 
 
----------------- Stelle die Anfangsbedingungen ein --------------
 
Start("","")
return

Nun, was passiert hier? Wenn der Lua Interpretierer sich durch das Skript arbeitet, findet er das

 Start("","")
 

Kommando an dessen Ende. Dies ist eine der Namenskonventionen in OOBD: Die Funktion welches alles initialisiert, muss “Start” genannt werden.;-)

Wenn wir nun in die Start Funktion schauen, finden wir

identifyOOBDInterface()

Das ist eine Funktion aus der serial_dxm.lua Support Bibliothek. In dieser findest Du nützliche Funktionen, die mehr oder weniger in allen OOBD Skripts verwendet werden. Wir werden diese in eine gemeinsame Datei speichern.

identifyOOBDInterface findet heraus, welcher CAN-Invader verbunden ist, um zukünftige Kommandos innerhalb der Bibliothek hardwareunabhängiger zu machen.

Die Kommandosequenz openPage(“VIN Test”), addElement(“VIN Number”, “vin”,“-”,0x2, “”) und pageDone() erstellt und zeigt ein einzigen Menüeintrag “VIN Nummer”. Das addElement() Kommando weist einer Lua Funktion vin diesen Menüeintrag zu:

function vin(oldvalue,id)
	echoWrite("0902\r")
	udsLen=receive()
	if udsLen>0 then
		if udsBuffer[1]==73 then
			local pos=4
			local res=""
			while pos <= udsLen and pos < 36 do
				if udsBuffer[pos]>31 then
					res=res..string.char(udsBuffer[pos])
				end
				pos= pos +1
			end
			return res
		else
			return "Error"
		end
	else
		return "NO DATA"
	end
end

Diese Funktion wird aufgerufen, wenn der Benutzer den Menüeintrag “VIN Number” auswählt. Innerhalb dieser Funktion, sendet zuerst

echoWrite("0902\r")

den Text “0902” als hexadezimales Zeichenfeld zum CAN-Invader, welches das OBD Standard Kommando ist um die Vehikelidentifikationsnummer (VIN) von einem Fahrzeug anzufordern. Der CAN-Invader selbst leitet diese Datensequenz als binäres Telegramm weiter auf den Diagnosebus (CAN) und wartet auf eine Antwort vom dem Steuergerät.

Das Kommando

udsLen=receive()

nimmt die Antwort des Moduls auf welche der CAN-Invader empfängt. Wenn udsLen größer als 0 ist, bedeutet das das etwas empfangen worden ist. Die empfangenen Bytes werden in dem Datenfeld udsBuffer[] abgespeichert.

Weil wir einen ASCII VIN Zeichensatz in den empfangenen Daten erwarten, arbeiten wir den Empfangspuffer udsBuffer[] durch und speichern alle gefundenen Bytes, als ASCII Werte in dem Datenfeld res. Dieses Datenfeld res wird dann mit

return res

zurückgegeben an die aufrufende Funktion.

Dies ist noch wichtig für Dich: Alle Lua Funktionen, welche von einem Menüeintrag aufgerufen werden, müssen ein Zeichenfeld zurückgeben, welches dann als aktueller Wert im Menü angezeigt wird. So repräsentiert dies, das Ergebnis des Aufrufs durch den Benutzer.

Und das ist schon die ganze Magie…. Basierend auf diesem Schema können alle Funktionalitäten in OOBD mit Lua realisiert werden