Home

News

Schnelleinstieg

Hintergrund

Doku

Bilder

Download

Forum

Kontakt

5 PC-Software

5.1 Beschreibung der VisualBasic Software und deren Realisierung

Um sämtliche für die Programmierung und Visualisierung relevanten Daten zu sammeln und zu organisieren, mußte eine Datenstruktur gefunden werden, die die Daten in der vorhandenen Hardware möglichst gut abbildet.

Diese Aufgabe läßt sich am Besten mit einer eigenen Klasse lösen. Hierfür wurde ein realer Knoten durch seine Eigenschaften und Methoden beschrieben und in einer eigenen Klasse definiert. Eine ausführliche Beschreibung folgt in Kapitel 5.1.1.

Weiterhin war ein Konzept zu erstellen, wie die Anfragen an das Bussystem und die Antworten darauf in einen Zusammenhang gebracht werden können.

Die vom Bussystem gelieferten Antworten sollen dabei ausgewertet werden. Kapitel 5.1.2 beschäftigt sich mit den Ausführungen genauer.

Am Ende war die „Programmierung“/Belegung der Taster möglichst einfach für den Benutzer zu realisieren. Dies wurde grafisch mit Hilfe der Windows eigenen OLEDrag&Drop-Operation gelöst. Kapitel 5.1.3 bietet hierzu einen kurzen Überblick.

Kapitel 5.1.4 schließlich erläutert die Funktionsweise der beiden Umwandlungsfunktionen, die den EEPromInhalt in eine Strukturansicht abbilden sollen und umgekehrt.

 

5.1.1 Knotenobjekt

Das Knotenobjekt beschreibt einen vorhandenen Hardwareknoten mit seinen Eigenschaften und Methoden, die in der Klasse clsKnoten festgelegt sind. Er ist nicht zu verwechseln mit dem Node-Objekt einer Strukturansicht. Die einzelnen Eigenschaften eines Knotenobjekts lassen sich nach der Instanzierung des Knotens durch einfache Zuweisungen festlegen:

Private Sub Form_Load()

Public bKnoten As New clsKnoten               ‘bKnoten = betrachteter Knoten

            bKnoten.Knotennr = 0

End Sub

Eine Abfrage kann mittels

            knr = bKnoten.Knotennr

erfolgen.

Sämtliche Eigenschaften eines Knotenobjekts zeigt Tabelle 5.1:

Eigenschaft

Bedeutung

Knotennr

Beschreibt die Knotennummer des Knotens

MOB0 (0 to 15)

MessageObject-Byte0, beschreibt das Byte0 der MO-Register im CAN-Controller

MOB1 (0 to 15)

MessageObject-Byte1, beschreibt das Byte1 der MO-Register im CAN-Controller

EEProm (0 to 511)

Beschreibt den EEPromInhalt einer Adresse (0 bis 511)

Seriennr

Beschreibt die Seriennummer des Knotens

Taster

Beschreibt den RegisterInhalt einer Adresse &H29 des CAN-Controllers, dieser spiegelt die aktuellen Tasterzustände wieder

Relais

Beschreibt den RegisterInhalt einer Adresse &H2E des CAN-Controllers, dieser spiegelt die aktuellen Relaiszustände wieder

Typ

Bezeichnet den Knotentyp (1: I/O-Applikation, 2: RS232-Applikation)

Tabelle 5.1:: Eigenschaften des Knoten-Objekts

Daneben kennt das Knotenobjekt 2 Methoden, die den Zugriff auf das KnotenEEProm (µC-EEProm) erlauben. Die Methode EEPromLesen versendet dazu über den RS232-Knoten Pakete, die den Zielknoten dazu bewegen, die Inhalte der geforderten EEProm-Adressen zurückzusenden. Die EEPromSchreiben-Methode verschickt Pakete, die den Zielknoten Änderungen an seinen EEPromInhalten durchführen lassen.

bKnoten.EEPromLesen(EEStart As Integer, EEStop As Integer), wobei EEStart und EEStop einen Adressraum begrenzen, dessen Inhalt der Zielknoten (an den RS232-Knoten) in mehreren Telegrammen verschicken soll.

bKnoten.EEPromSchreiben(AdresseHigh As Integer, AdresseLow As Integer, Daten As Integer) hingegen beschreibt nur eine einzelne Speicherstelle (AdresseHigh, AdresseLow) im EEProm des Zielknotens mit den übermittelten Daten.

Mit diesen beiden Methoden und den oben genannten Eigenschaften läßt sich ein realer Knoten bereits im Rechner zum Zwecke der Visualisierung und Konfiguration beschreiben. Bei der Bildschirmausgabe oder Verarbeitung der Knotendaten muß deshalb nicht jedesmal auf die Hardware zugegriffen werden, sondern die benötigten Daten können dem Knotenobjekt entnommen werden (sofern sie einmal eingelesen wurden und somit vorliegen).

5.1.2 Kommunikation mit dem Bussystem

Zur Kommunikation mit dem Bus wird ein RS232-Knoten eingesetzt, der die Anweisungen und Pakete des steuernden PCs in CAN-Bus Nachrichtentelegramme umsetzt. Bis ein so vom PC abgeschicktes Telegramm den Zielknoten am Bus erreicht, vergeht eine gewisse Zeit, in der andere Telegramme die an den PC adressiert sind, den PC erreichen können. Deshalb kann nicht sichergestellt werden, daß ein Telegramm, das unmittelbar auf den Versand eines Telegrammes durch den PC an diesem eintrifft, auch die Antwort auf das soeben verschickte Telegramm ist. Es ist durchaus möglich, daß dieses eintreffende Telegramm die Antwort einer früheren Anfrage zurückgibt. Die Hardware unterstützt den Transport von eindeutigen Kennungen zum Zwecke einer Frage/Antwort-Identifizierung nicht. Deshalb muß anhand der Antwort auf die gestellte Frage geschlossen werden. Dies ist möglich, da die Hardware die gestellte Frage in der Antwort nocheinmal zurückschickt. Trifft also z.B. ein Telegramm mit dem Inhalt einer EEProm-Adresse ein, so kann davon ausgegangen werden, daß vorher eine EEProm-Anfrage an den Zielknoten gestellt wurde.

Die so eingehenden Antwortbytes werden im MSComm1_OnComm-Ereignis zu Paketen zusammengesetzt, die dann in der Auswerteroutine paketauswerten analysiert und deren Inhalte den entsprechenden Eigenschaften im betrachteten Knotenobjekt zugewiesen werden. Diese stehen damit sofort für die weitere Verarbeitung im Knotenobjekt zur Verfügung.

Zu versendende Pakete werden in der Feldvariable paket(0 to 12) Byte für Byte vorbereitet und dann durch Aufruf von abschicken(paket) per MSComm1.Output an den RS232-Knoten gesendet. Dabei muß dem angesprochenen RS232-Knoten eine kurze Pause eingeräumt werden, damit dessen Empfangsregister nicht überschrieben wird, bevor der alte Inhalt noch nicht verarbeitet ist. Durch die DoEvents-Anweisung in der Routine abschicken wird Windows mitgeteilt, daß andere Ereignisse bearbeitet werden dürfen. Andernfalls würde die abschicken-Routine den Rechner für die gesamte Abarbeitungsdauer blockieren.


5.1.3 Verwendung der OLE-Drag&Drop-Operation

Wie bereits beschrieben wird die grafische Darstellung der Taster/Relaiszuordnung mit Hilfe von 2 Strukturansichten (tvwKnotenTaster, oben & tvwKnotenRelais, unten) und einem Bildfeld (picMülleimer) erzeugt.

Die Node-Objekte der obersten Ebene (root-Ebene) der Strukturansicht (TextBezeichnung: Knoten<nn>) sind unter folgenden Schlüssel eindeutig im Baum identifizierbar und ansprechbar:

bKnoten.key = "Knoten" & Format(i, "00"),

gleichzeitig bildet dieser Ausdruck auch die Eigenschaft bKnoten.Text (bKnoten.Text = bKnoten.key). Die (Lauf)variable i nummeriert die Knoten von 0 bis 99 durch.

Für die untergeordneten Node-Objekte (child-Objekte) gilt folgender Schlüssel:

bKnoten.key = "Knoten" & Format(i, "00") & "\Relais" & j

Die (Lauf)variable j nimmt Werte zwischen 1 und 4 an. Hier gilt dieser Ausdruck auch für die bKnoten.Text-Eigenschaft.

Wird ein Node-Objekt der unteren Strukturansicht in die obere gezogen, so wird vom Programm zuerst das angeklickte Node-Objekt zum Selektierten erklärt (MouseDown-Ereignis: Set tempKnoten = tvwKnotenTaster.HitTest(x, y)), und mit dem SetData-Ereignis (Data.SetData tempKnoten.Key, vbCFText) von der Quelle (unten) ans Ziel (oben) übergeben. Würde dieser Vorgang nicht durchgeführt, dann würde nicht das angeklickte Node-Objekt aufgenommen, sondern das vor dem Anklicken aktive/selektierte Objekt.

Bild 5.2: Taster-Relais-Zuordnung

Im OLEDragOver-Ereignis des Ziels wird der Knoten optisch hervorgehoben, der momentan unter der Maus steht. Dies macht die Zuordnung für den Anwender einfacher. Das OLEDragDrop-Ereignis, das am logischen Ende der Ereigniskette steht, übernimmt den Schlüssel und erstellt in der eigenen Strukturansicht an der Ablegestelle ein Node-Objekt mit eben diesem Schlüssel.

Wird ausgehend von der Strukturansicht tvwKnotenTaster ein Node-Objekt über dem Bildfeld picMülleimer abgelegt, spielt sich im Prinzip der gleiche Vorgang ab. Das OLEDragDrop-Ereignis löscht allerdings hier den per Data.GetData-Methode übermittelten Knoten aus der Strukturansicht tvwKnotenTaster.

Die Eingaben des Benutzers werden auf Plausibilität überprüft, und bei Scheitern durch ein aussagekräftiges Hinweisfenster abgewiesen. So macht es zum Beispiel keinen Sinn, ein und dasselbe Relais mehrfach dem gleichen Taster zuzuordnen. Ebensowenig können Knoten selbst auf die Taster gezogen oder gar gelöscht werden. So werden grobe Fehlbedienungen ausgeschlossen. Auch Hardwarebeschränkungen werden geprüft, so können pro Taster - durch die vorgegebene Hardware - maximal 12 Telegramme versendet bzw. Relais geschaltet werden.

5.1.4 Graph2EEProm-, EEProm2Graph-Umwandlung

Die graphisch programmierten Zuordnungen müssen vor dem eigentlichen Programmieren des Knotens, in eine für den Knoten verwertbare Form gebracht werden. Dies geschieht durch die Funktion Graph2EEProm. Umgekehrt müssen die ausgelesenen EEPromInhalte in die graphische Strukturansicht umgewandelt werden. Hierfür ist EEProm2Graph zuständig.

Die ersten vier Node-Objekte (tvwKnotenTaster.Nodes.Item(1 bis 4)) in der Strukturansicht tvwKnotenTaster repräsentieren die vier Taster, so daß diese bei der Umwandlung in die EEProm-Tabelle nicht berücksichtigt werden müssen. Alle anderen Node-Objekte dagegen sind an diese vier Objekte angehängt (child-Objekte). Eine For-Next-Schleife bildet den Rahmen, der die einzelnen Unterknoten jedes Tasters der Reihe nach abarbeitet und in die EEProm-Tabelle einträgt. Dazu wird die .Text-Eigenschaft der Node-Objekte zur Auswertung herangezogen, da hier das gewünschte Schaltziel und dessen Schaltfunktion verzeichnet sind. Das Schaltziel wird mit Hilfe von Stringbearbeitungsfunktionen extrahiert und durch Umrechnungsfunktionen in das geforderte Format für das EEProm gebracht. Die dafür erstellte Bibliothek modFunktionen bietet hierfür umfangreiche Umrechnungsfunktionen an (Tabelle 5.3). Aus den Befehlen/Zeichenketten <um>, <ein> und <aus> wird an der zugeordneten Speicherstelle im EEProm das korrespondierende Befehlsbyte gesetzt. Am Ende jeder Telegrammtabelle eines Tasters im EEProm wird ein „LeerTelegramm“ angefügt.

Funktion

Bedeutung

knr2idb0(knr As Integer)

Ermittelt aus der Knotennummer das zugehörige ID-Byte0 (DLC=8; RTR=0)

knr2idb1(knr As Integer)

Ermittelt aus der Knotennummer das zugehörige ID-Byte1 (DLC=8; RTR=0)

id_dlc_rtr2idb0(id As Integer)

Ermittelt aus der ID das zugehörige ID-Byte0

id_dlc_rtr2idb1(id As Integer, dlc As Integer, rtr As Integer)

Ermittelt aus ID, DLC und RTR das zugehörige ID-Byte1

idb0_idb1_2id(idb0 As Integer, idb1 As Integer)

Ermittelt aus ID-Byte0 und ID-Byte1 die zugehörige ID

knr_mo2id(knr As Integer, MO As Integer)

Ermittelt aus der Knotennummer und der MO die zugehörige ID

knr2ba(knr As Integer)

Ermittelt aus der Knotennummer die Basisadresse

ba2knr(BA As Integer)

Ermittelt aus der Basisadresse die Knotennummer

id2knr(id As Integer)

Ermittelt aus der ID die Knotennummer (vorausgesetzt, ID liegt im definierten Bereich zwischen 200 und 1799)

id2mo(id As Integer)

Ermittelt aus der ID die MO (vorausgesetzt, ID liegt im definierten Bereich zwischen 200 und 1799)

Tabelle 5.3: Umrechnungsfunktionen aus der Bibliothek modFunktionen

Für den umgekehrten Fall, also die Umwandlung der EEProm Inhalte in die Strukturansicht, ist das Vorgehen ähnlich. Auch hier wird eine Schleife über jede Telegrammtabelle gebildet, die dann wieder mit Hilfe der Umrechnungsfunktionen aus modFunktionen die geforderten Knoten und daraus dann die Ansicht erstellt. Die Schleife wird abgebrochen und es wird bei der nächsten Telegrammtabelle fortgefahren, sobald ein „Leertelegramm“ erkannt wird.

 

5.2 Beschreibung der Borland C++ Software und deren Realisierung

(noch im Aufbau)

Vorab ein paar Screenshots, die den Umfang/Möglichkeiten/Komfort/Stand der PC-Software dokumentieren sollen: