Hallo zusammen!
Ich habe für mich einen eBus Connector entwickelt und dachte, ich stelle den mal hier rein - vielleicht kann den ja auch wer anderer brauchen.
Der eBus Connector funktioniert ähnlich zum eBus Adapter von Brownson (siehe hier), ist aber als externes Programm und nicht als IPS-Modul realisiert. Als IPS-Modul wäre zwar architektonisch schöner, ich habe nur leider kein Delphi und es hat als Nebeneffekt auch den Vorteil, dass das Programm so einerseits nicht für jede neue IPS-Version neu kompiliert werden muss und andererseits bei Bedarf auch unabhängig von IPS verwendet werden kann.
Mit dem eBus Connector können eBus Nachrichten über einen (virtuellen) COM-Port gelesen und synchronisiert geschrieben werden. Der Datenaustausch zwischen IPS und dem eBus Connector erfolgt via UDP. Ich habe hardwareseitig den „eBus-Koppler Ethernet“ von E-Service Online in Verwendung, welcher diesen virtuellen COM-Port zur Verfügung stellt und mit dem physischen eBus verbindet.
Hier die Details zum eBus Connector:
Funktionen
Lesen
[ul]
[li] Der eBus Connector liest die Daten vom COM-Port und fügt sie selbstständig zu vollständigen Nachrichten (jeweils abgeschlossen mit „AA“) zusammen.[/li][li] Sobald eine komplette Nachricht empfangen wurde, sendet der eBus Connector diese als UDP-Paket (als Hex-String) and den eingestellten Empfänger (z.B. IPS) weiter, wo die Nachricht dann verarbeitet werden kann.[/li][li] Leere Nachrichten bzw. Auto-SYN-Zeichen werden gefiltert und nicht weitergeleitet.[/li][li] Die Nachrichten werden so weitergeleitet, wie sie empfangen wurden, d.h. kein CRC-Check, keine Dekodierung oder Interpretation der Inhalte usw. - das bleibt der „Applikationsschicht“ (z.B. einem IPS-Skript) überlassen.[/li][li] Nachrichten die kürzer sind, als die Minimallänge von 6 Bytes (und daher definitiv ungültig sind) werden ignoriert und nicht weitergeleitet.[/li][/ul]
Schreiben
[ul]
[li] Der eBus Connector lauscht am eingestellten UDP-Port auf eingehende Pakete (bestehend aus jeweils einem Hex-String).[/li][li] Sobald ein UDP-Paket (z.B. kommend von IPS) mit einer Nachricht empfangen wurde, wird diese in eine Warteschlange gestellt.[/li][li] Sobald am eBus ein SYN-Zeichen empfangen wurde, wird die nächste wartende ausgehende Nachricht über den COM-Port auf den eBus geschrieben.[/li][li] Dadurch ist ein synchronisiertes Schreiben möglich, das Kollisionen vermeidet.[/li][li] Wie beim Lesen werden die Nachrichten 1:1 so auf den eBus geschrieben, wie sie an den eBus Connector gesendet wurden, d.h. auch hier keine CRC-Berechnung usw. (das muss ebenfalls schon vorher in der Applikationsschicht geschehen).[/li][li] Der eBus Connector lauscht während des Schreibens auf den Bus auf die selbst gesendeten Bytes. Sollten die empfangen Bytes nicht mit den gesendeten Bytes übereinstimmen, wurde eine Kollision erkannt und das Senden wird abgebrochen. Dadurch werden weitere Kollisonen vermieden. In diesem Zusammenhang empfiehlt es sich, eigene Nachrichten mit der Absenderadresse FFh zu verschicken (niedrigste Priorität am Bus und daher minimierte Gefahr, die anderen Teilnehmer am Bus durch Kollisionen „zu stören“).[/li][li] Konnte eine Nachricht auf Grund einer Kollision nicht gesendet werden, wird sie bei der nächsten Gelegeneheit automatisch erneut verschickt. Dies stellt sicher, dass die an den eBus Connector übergegebenen Nachrichten auch tatsächlich erfolgreich versendet werden.[/li][li] NEU: Da manche Leute anscheinend Probleme damit haben, kann die zuvor genannte „listen while sending“ Funktion auch abgeschaltet werden (Nachrichten werden als Ganzes versendet, ohne auf Kollisionen zu achten). Dafür bei der Konsolen-Applikation einfach den entsprechenden Switch (-lws) weglassen bzw. das Registry-File für den Windows-Service entsprechend anpassen.[/li][li] NEU: Zu Testzwecken kann die Zeit, die zum Versenden von einzelnen Nachrichten benötigt wird, in der Konsole angezeigt werden. Dafür bei der Konsolen-Applikation einfach den entsprechenden Switch (-sw) hinzufügen.[/li][/ul]
Einsatzweise
[ul]
[li] Konsolen-Applikation: Der eBus Connector kann in der Konsole ausgeführt werden, wo auch alle empfangenen und gesendeten Daten mitprotokolliert und angezeigt werden. Die nötigen Parameter werden über die Kommandozeile übergeben.[/li][li] Windows-Service: Der eBus Connector kann im Hintergrund als Windows Service ausgeführt werden. Meldungen werden ins Event-Log (Anwendungs-Log) geschrieben, jedoch nur Status- und Fehlermeldungen und nicht alle empfangenen und gesendeten Daten. Die nötigen Parameter sind in der Registry gespeichert.[/li][/ul]
Konsolen-Applikation
Der Aufruf der Konsolen-Applikation erfolgt folgendermaßen:
eBusConnectorConsole <SerialPort> <LocalUDPPort> <Host> <RemoteUDPPort> <-lws> <-sw>
Die Parameter sind:
[ul]
[li] SerialPort: Der COM-Port über den mit dem eBus kommuniziert wird.[/li][li] LocalUDPPort: Der UDP-Port an dem der eBus Connector nach zu sendenden eBus Nachrichten lauscht.[/li][li] Host: Der Host bzw. die IP-Adresse an den der eBus Connector empfangene eBus Nachrichten weiterleitet.[/li][li] RemoteUDPPort: Der zugehörige UDP-Port für das Weiterleiten von empfangenen eBus Nachrichten.[/li][li] -lws: Aktiviert die „listen while sending“ Funktion (optional).[/li][li] -sw: Aktiviert die Stopwatch-Funktion (optional).[/li][/ul]
Ein Aufruf könnte beispielsweise so aussehen:
eBusConnectorConsole COM10 8812 192.168.0.1 8813 -lws
Die Applikation läuft dann so lange, bis der Benutzer RETURN drückt.
Windows Service
Konfiguration
Als Erstes muss die Datei eBusConnector.reg bearbeitet werden, um dort die Einstellungen (unten fett markiert) gemäß der eigenen Wünsche anzupassen.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\eBusConnector]
; The name of the serial port used to communicate with the eBus
"SerialPort"="[b]COM10[/b]"
; The local UDP port to listen on for commands
"LocalUDPPort"="[b]8812[/b]"
; The remote host to send the results to
"RemoteHost"="[b]192.168.0.1[/b]"
; The remote UDP port to send the results to
"RemoteUDPPort"="[b]8813[/b]"
; Enable (1) or disable (0) the listen while sending function
"ListenWhileSending"=dword:[b]1[/b]
; Uncomment to enable delayed autostart to allow the virtual serial port service to start first
; "DelayedAutoStart"=dword:1
Installation
Danach muss der eigentliche Dienst installiert werden. Dies kann mit dem mitgelieferten Batch-Skript gemacht werden:
"Install Service.bat"
Die Installation muss mit Admin-Rechten ausgeführt werden!
Das Skript macht nichts anderes, als den Dienst mittels InstallUtil.exe aus dem .NET-Framework zu installieren
C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe eBusConnectorService.exe
danach die Einstellungen in die Registry zu schreiben
regedit /s eBusConnector.reg
danach den Dienst vom Virtual Serial Port Service abhängig zu machen (diese Zeile entfernen bzw. anpassen, sollte kein bzw. ein anderslautender Dienst dafür verwendet werden)
sc config eBusConnector depend=sec_service
und letztendlich den Dienst zu starten
net start eBusConnector
Der Dienst ist dann standardmäßig auf verzögerten automatischen Start eingestellt.
De-Installation
Der Dienst kann bei Bedarf wieder per Batch-Skript deinstalliert werden:
"Uninstall Service.bat"
Dieses Skript verwendet wiederum InstallUtil.exe zum Deinstallieren:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -U eBusConnectorService.exe
IPS-Konfiguration
Um den eBus Connector in IPS zu verwenden, müssen lediglich ein UDP Socket und eine zugehörige Register Variable angelegt und mit den entsprechenden Port-Nummern konfiguriert werden.
Die vom eBus gelesen Daten können dann im Ziel-Skript der Register Variable verarbeitet werden:
$eBusMessage = $_IPS['VALUE'];
Um Daten auf den eBus zu schreiben, müssen sie einfach über den UDP Socket gesendet werden:
USCK_SendText(36211, "10 08 B5 12 02 00 00 CA");
Anbei befinden sich sowohl das fertig kompilierte Tool, als auch dessen Source-Code (C# für .NET 2.0, geschrieben mit Visual Studio 2005).
Falls wer dieses Tool gebrauchen kann, freue ich mich über Feedback!
Viel Spaß damit und noch einen guten Rutsch!
eBus Connector v1.3 Source.zip (13 KB)
eBus Connector v1.3.zip (11.9 KB)