ARM_sblib_Verwendung_LPC11xx

Last modified by Olli S. on 2017/04/28 21:52

In diesem Dokument soll beschrieben werden, wie man die Daten für ein erstes eigenes (nachgebautes) KNX Gerät zusammenträgt und in ein Programm für den sogenannten „ARM“ Controller auf Basis des LPC1115 bzw. 1114 einträgt.
Mit diesen Daten, der sblib, der passenden Produktdatenbank und der ETS Software ist es dann möglich dem Gerät die physikalische Adresse und das Applikationsprogramm zu übermitteln.

Erster Schritt: ein Gerät bestimmen, welches nachgebaut werden soll. Beispielsweise nehmen wir hier mal den „Glas Raumtemperaturregler“ (SCN-RT1GS.01) von MDT. Für dieses Gerät kann die Produktdatenbank in Form einer *.knxprod Datei herunter geladen werden. Diese Datei lässt sich z.B. mit dem Tool 7-ZIP öffnen und es erscheint folgende Ansicht:

knxprod_hauptverzeichnis.png

Abbildung 1: Dateistruktur der *.knxprod Datei

 

Hier ist der Ordner „M-0083“ auszuwählen und es wird folgender Inhalt angezeigt:

knxprod_unterverzeichnis.png

Abbildung 2: Dateistruktur des Ordners „M-0083“

 

Die Datei „M-0083_A-0047-12-AADB.xml“ lässt sich gut mit z.B. dem Notepad++ öffnen.

Nun sollte man sich klar machen, welche Daten überhaupt für ein KNX Gerät zur Identifizierung benötigt werden:
Hersteller Code (manufacturer)
Gerätetyp (deviceType)
Version
Hardware Version
Typ des Busankopplers

Für den Start kann man sich am besten ein bestehendes Programm aus dem Repository von selfbus laden und dieses verändern. Um eine lauffähige Umgebung zu bekommen sollte dieses Tutorial durch gearbeitet werden: Eclipse_ARM
Anschließend kopiert man sich ein Projekt in LPCXpresso und kann loslegen:
In der Datei „app_main.cpp“ findet sich die Routine „void setup()“ in der sich wiederrum der Aufruf der Routine „bcu.begin“ befindet.

app_main_cpp.png

Abbildung 3: Setup eines KNX Gerätes

 

Diese hat die Übergabeparameter
void BcuBase::begin(int manufacturer, int deviceType, int version)

Der Hersteller Code (manufacturer), der Gerätetyp (deviceType) und die Version ist aus dem Dateinamen der bereits erwähnten Datei „M-0083_A-0047-12-AADB.xml“ zu entnehmen.
In diesem Fall ist
0x0083 der Hersteller Code (manufacturer),
0x0047 der Gerätetyp (deviceType) und
0x12 die Version

Analog dazu sind die entsprechenden Stellen für andere Geräte auszuwerten.

Die Hardware Version, die wie in Abbildung 3 abgebildet ist, in einem Array abgelegt und anschließend in das userEeprom kopiert wird, lässt sich aus der Datei „M-0083_A-0047-12-AADB.xml“ entnehmen. Sie ist unter dem Parameter „LdCtrlCompareProp“ zu finden. In der Datei ist in diesem Fall der Eintrag
<LdCtrlCompareProp ObjIdx="0" PropId="78" InlineData="00000000004800000000" />
zu erkennen. Dieser wird folgerndermaßen ausgewertet:
Die Angabe ist Hexadezimal und 6 Byte lang. Angefangen wird hier bei der linken Stelle (MSB) und dann entsprechend 6 Bytes hinunter. Diese Daten werden dann in das Array übertragen.

Für die Wahl des korrekten Busankopplers, für die die sblib kompiliert werden muss und an den auch die Parameter des Projektes in LPCXpresso angepasst werden müssen, ist der Parameter „MaskVersion“ wichtig. In der Datei „M-0083_A-0047-12-AADB.xml“ ist der Eintrag MaskVersion="MV-0701" zu finden.
Ist dort *70*, so wie hier zu finden, handelt es sich um ein BIM112 Busankoppler.
*01* steht für eine BCU1, *02* für eine BCU2.
Die Parameter in LPCXpresso für das neu erzeugte Projekt müssen an folgenden Stellen angepasst werden:

Preprocessor_BCU_settings.png

Abbildung 4: Projekteinstellungen C++ Compiler für den Busankoppler

 

BCU1 -> BCU_TYPE=10
BCU2 -> BCU_TYPE=20
BIM112 -> BIM112

Libraries_BCU_settings.png

Abbildung 5: Projekteinstellungen C++ Linker für den Busankoppler

BCU1 -> "${workspace_loc:/sblib/Debug_BCU1}"
BCU2 -> "${workspace_loc:/sblib/Debug_BCU2}"
BIM112 -> "${workspace_loc:/sblib/Debug_BIM112}"

Wenn nun noch die sblib in der korrekten Busankoppler Version kompiliert wurde, sollte ich das Projekt übersetzen lassen und das Gerät sich mittels ETS mit einer physikalischen Adresse und dem Applikationsprogramm versehen lassen.
Natürlich passiert (wenn überhaupt etwas passiert) nicht das richtige, aber man hat der ETS glaubhaft gemacht, dass ein entsprechendes Gerät am Bus angeschlossen ist.

Nun sollte auch das Programm im Gerät auf die entsprechenden Daten zugreifen können, die mittels ETS in das Gerät geschrieben wurden. Diese Daten werden im sogenannten userEeprom abgelegt und können dort ausgelesen werden. Nun muss man für das Auslesen eine bestimmte Adresse angeben, an der sich die gewünschten Daten verbergen. Wie kommt man also an die Informationen, an welcher Adresse sich welche Daten befinden?

Dafür nimmt man sich wieder die Datei „M-0083_A-0047-12-AADB.xml“ vor und hält nach einer Sektion Ausschau, die die Anfangsparameter <Parameter… und in der nächsten Zeile <Memory… hat. In diesem Fall ist das ab Zeile 1309:

knxprod_xml_memory.png

Abbildung 6:Ausschnitt der Applikationsprogramm-Parameter

Hier sind zu jedem Parameter, der in der ETS eingestellt und über den Bus übertragen wird, die Grundadresse und der Offset zu finden. Zusätzlich hat man durch die Namen einen guten Ansatz, welche Funktion durch den entsprechenden Parameter beeinflusst wird.

Für ein Beispiel nehmen wir den Parameter aus Zeile 1324: ZyklSenden

Dieser Parameter ist in der ETS unter der Bezeichnung „Messwert zyklisch senden“ zu finden:

ets_parameter.png

Abbildung 7: Ansicht in der ETS der Applikationsprogramm-Parameter

Nun gilt es die Adresse dieses Parameters in dem userEeprom zu finden. Dazu wird der Parameter aus Zeile 1325 „CodeSegment=“M-0083_A-0047-12-AADB_AS-4400“ herangezogen. Die 0x4400 in diesem Parameter sind die Grundadresse aller Parameter. Dazu kommt jeweils der Offset, in diesem Fall Offset=“361“. Dieser Parameter ist allerdings in dezimaler Schreibweise angegeben! Somit sind 361 dez = 0x169, welche sich für die Gesamtadresse zu den 0x4400 hinzuaddieren.

Für das Auslesen benötigt man allerdings noch die Information, wie viele Bytes man ab dieser Startadresse lesen möchte.
Dazu sucht man in der Datei „M-0083_A-0047-12-AADB.xml“ die Sektion
<ParameterType Id="M-0083_A-0047-12-AADB_PT-TempCycle" Name="TempCycle">
Die Id wird aus der Zeile 1324 unter „ParameterType“ herausgenommen und entsprechend danach gesucht.

knxprod_xml_size.png

Abbildung 8: Datentypgröße eines Applikationsprogramm-Parameters

In dieser Sektion ist der Parameter „SizeInBit=8“ (Zeile 222) zu finden.
Also kann der übertragene und in userEeprom abgespeicherte Wert mittels der Funktion userEeprom.getUInt8(0x4400 + 361);
erfolgen.

Es folgt in Zukunft noch ein Überblick, wie mit die Kommunikationsobjekte unter Verwendung der sblib behandelt werden.