Treiber selbst erstellen

Dieses Kapitel behandelt den Aufbau der älteren *.ptd-Treiber von Wings Platinum. Wenn Sie einen neuen Treiber erstellen möchten, sollten Sie das neuere Avio-Treibermodell verwenden, siehe Avio-Treiber selbst erstellen.

Treiberstruktur

Wenn Sie einen bestehenden *.ptd-Treiber mit einem Texteditor öffnen, können Sie seinen Aufbau erkennen. Verfügbare Treiber finden Sie, indem Sie im Hauptmenü auf Extras - Ordner öffnen Treiber klicken. Der Treiber enthält am Anfang eine Beschreibung und dann folgen die Befehle in der Reihenfolge, wie sie im Auswahlmenü erscheinen sollen. Jede Zeile kann einen beliebigen Kommentar enthalten, der durch zwei Schrägstriche getrennt sein muss, Beispiel:  //Dieser Kommentar dient nur zu Ihrer Information und wird nicht ausgewertet.

[Driver]

Diese Kennung ist in der ersten Zeile zwingend erforderlich.

Name=XXX

Name des Treibers bzw. des zu steuernden Gerätes

Date=XXX

Datum der Erstellung

Author=XXX

Name des Treiberautors

Comment=XXX

Kommentar zum Treiber

Alle obenstehenden Informationen sind in Wings Vioso RX im Eigenschaften-Dialog Serielle Schnittstelle sichtbar, wenn der Treiber ausgewählt wurde.

ID used last=XXX

Gibt an, welches die letzte benutzte ID ist. Dadurch weiß der Autor beim Ergänzen weiterer Befehle, welche IDs schon belegt sind. Diese Angabe sollte immer aktuell gehalten werden, sie dient ausschließlich zur Information des Autors.

Es folgen Parameter für die Schnittstellenkonfiguration. Wenn die für ein Gerät erforderlichen Parameter bekannt sind, ist es sinnvoll diese hier vorzugeben.

Network=X

Bei X=1 ist LAN-Schnittstelle vorgegeben; bei X=0 oder wenn der Parameter weggelassen wird, ist die Schnittstelle RS232.

NetworkIP=XXX.XXX.XXX.XXX

Die angegebene IP-Adresse erscheint als Standardvorgabe im Dialog.

NetworkPort=XXXXX

Der angegebene Port erscheint als Standardvorgabe im Dialog.

NetworkUDP=X

Bei X=1 wird das UPD-Protokoll verwendet, bei X=0 das TCP-Protokoll

DefaultPollInterval=X

Bestimmt das Standard-Interval, mit dem Parameter abgefragt werden sollen; X wird in Sekunden angegeben. Wenn dieser Parameter fehlt, ist das Standard-Intervall 20 Sekunden.

In der Treiberdatei sieht ein kompletter Informationsblock dann beispielsweise so aus:

[Driver]

Name=AV Stumpfl EventPlayer

Version=1.00

Date=26.04.2004

Author=Christoph Hilger

Comment=Basic control of EventPlayer software

ID used last=10

Network=1

NetworkIP=10.10.68.11

NetworkPort=18000

NetworkUDP=0

DefaultPollInterval=20

Getrennt durch eine Leerzeile folgt ein obligatorischer Befehlsblock zum Senden von beliebigen Zeichenfolgen, die später im Treiberdialog eingegeben werden können:

[SendData]

Info=Sends raw data

ID=1

SubID=0

Par1=Data, Data to be sent to Device

Send=#Data(Par1)

 

Danach können weitere Befehlsblöcke folgen, die jeweils durch eine Leerzeile getrennt sind.

 

Datenformat

Zeichenfolgen für serielle Befehle können Sie in verschiedener Form eingeben, auch gemischte Schreibweise ist möglich:

 

Aufbau eines Befehlsblocks

Wir erläutern Ihnen zunächst den prinzipiellen Aufbau von Befehlen im Treiber. Am Ende folgen einige Beispiele, die nicht alle Optionen nutzen und auch zeigen, wie einfache Befehle aufgebaut sind. Bitte denken Sie daran, alle Informationen und Kommentare möglichst in Englisch zu verfassen, damit der Treiber international einsetzbar ist.

[Befehlsbezeichnung:Unterbezeichnung]

Bezeichnung des Befehls, die im Kontextmenü zur Auswahl erscheint. Durch Doppelpunkt getrennt kann eine optionale Unterbezeichnung folgen, die als Untermenü erscheint.

ShortName=XXXX

Ermöglicht optional die Angabe eines kurzen Namens, der in Markern und in Kontrollfeldern angezeigt wird (möglichst nur 10 Zeichen). Dies ist besonders bei langen Befehlsbezeichnungen und Untermenüs sinnvoll. Wenn bei einem Befehl Parameter verwendet werden, erscheinen diese im Anschluss an den Kurznamen, also z. B. wie beim Treiber des SC Master 16 bei Card - Volume to Value, wo zwei Parameter (für Card-Player und Value) angegeben werden müssen: Vol crd 3, 25

Info=XXXX

Information, die als Kommentar bei Anwahl dieses Befehls im Treiberdialog angezeigt wird.

Icon=X

Angabe eines Icons; dabei steht X für den Index eines der hier aufgeführten Icons. Wenn kein Icon definiert worden ist, wird automatisch Icon=0 benutzt, dass zum dem Standard-Icon führt.

ID=1

Jeder Befehl muss eine eindeutige ID-Nummer zwischen 1 und 255 besitzen, sie darf also im Treiber von keinem anderen Befehl verwendet werden. Wichtig: Wenn Sie einen Treiber modifizieren, dürfen Sie IDs von bereits vorhandenen Befehlen nicht ändern, weil er sonst zu früheren Treiber-Versionen inkompatibel wird!!

SubID=1

Verwandte Befehle können mit einer Sub-ID zwischen 1 und 255 in einer zweiten Ebene strukturiert werden, wodurch sie auch im Kontextmenü im Untermenü erscheinen. Die Sub-ID muss innerhalb einer ID-Nummer eindeutig sein; SubID=0 bedeutet kein Sub-Menü. Wichtig: Wenn Sie einen Treiber modifizieren, dürfen Sie Sub-IDs von bereits vorhandenen Befehlen nicht ändern, weil er sonst zu früheren Treiber-Versionen inkompatibel wird!!

Par1=Format (VX, Y, Z), Bezeichnung des Eingabefeldes

Ermöglicht die Eingabe von Parametern im Treiberdialog. Mit "Format" wird die Art der erwarteten Information festgelegt; VX ist die Adresse für den Wert (z. B. V3); der mögliche Wertebereich wird mit Y (Minimum) und Z (Maximum) definiert. Folgende Parameter sind möglich:

Data ... max. 255 Zeichen gemäß definiertem Datenformat, gemischte Schreibweise ASCII, Hex etc. möglich

Number (Y, Z), im Treiberdialog erscheint ein Eingabefeld für Nummern, die Angabe des Wertebereichs ist erforderlich, z. B. Number(1,255)

Value (VX, Y, Z) verwendet den Wert von Adresse X bezogen auf den Wertebereich von Y und Z., wobei Y=0% und Z=100% eines Datenobjekts entsprechen, z. B. Value (V3, 1, 3456). Dadurch legen Sie also den Ausgabebereich der Datenobjekte bzw. Kontrollfelder fest, siehe auch Variable Datenausgabe per Treiber.

Auf diese Weise können bis zu acht verschiedene Parameter benutzt werden (Par1 bis Par8). Wenn Sie Value-Parameter verwenden, müssen Sie zusätzlich einen DriverLoop-Befehl zur zeitlichen Steuerung definieren. Auch in einer Parameter-Zeile folgt, getrennt durch ein Komma, die Bezeichnung des Eingabefeldes im Treiberdialog.

Wenn Sie mehr als drei Parameter verwenden und diesen Treiber in alten Projekten einsetzen möchten (...erstellt mit Wings Vioso RX 2.40 oder früher), sollten Sie die Funktionen unbedingt ausführlich testen, da es unter Umständen zu Kompatibilitätsproblemen kommen kann.

Send=Zeichenfolge

Als Zeichenfolge können bis zu 255 Zeichen gesendet werden, die Eingabe erfolgt in gemischter Schreibweise gemäß definiertem Datenformat. Durch Einfügen des Befehls

#Pause(X)

in eine Zeichenfolge entsteht beim Senden an dieser Stelle eine Pause mit der Dauer X (Eingabe in Millisekunden), die zwischen 1 und 255 Millisekunden betragen kann.

Variable Parameter (Par1 bis Par8) können auf folgende Weise einbezogen werden:

#Data(Par1)

Die Zeichenfolge von Parameter 1 wird als gemischte Schreibweise ausgewertet und hexadezimal gesendet.

#Byte(Par1)

Wie zuvor, jedoch wird nur das erste Byte von Parameter 1 gesendet.

#WordBE(Par1) oder #Word(Par1)

Wie zuvor, jedoch werden die ersten zwei Bytes von Parameter 1 in der vorgegeben Reihenfolge gesendet (Big-Endian).

#WordLE(Par1)

Wie zuvor, jedoch werden die Bytes in umgekehrter Reihenfolge gesendet (Little-Endian). Diese Variante ist für das Senden von Befehlen an Wings Vioso RX zu verwenden.

#LongBE(Par1) oder  #Long(Par1)

Wie #WordBE, jedoch werden die ersten vier Bytes von Parameter 1 in der vorgegeben Reihenfolge gesendet (Big-Endian).

#LongLE(Par1)

Wie #LongBE, jedoch werden die ersten vier Bytes in umgekehrter Reihenfolge gesendet (Little-Endian). Diese Variante ist für das Senden von Befehlen an Wings Vioso RX zu verwenden.

#Decimal(Par1)

Die Zeichenfolge von Parameter 1 wird als ASCII-Zeichen ausgegeben.

#Decimal:Dezimalstelle(Par1)

Wie zuvor, jedoch wird hier die Dezimalstelle angegeben, die gesendet werden soll. Es sind Stellenangaben von 1 bis 100000 möglich. Diese Option ist nützlich, wenn Geräte quasi den Tastendruck einer Fernbedienung als einzelne Bytes haben wollen.

 

Auswertung von Rückmeldungen

Wenn das Gerät Rückmeldungen nach dem Empfang bzw. nach dem Ausführen von Befehlen sendet, kann dieses sogenannte Acknowledge ausgewertet werden. Sie sollten in der Treiberbeschreibung vermerken, ob Sie dies programmiert haben, damit der Anwender weiß, dass Aktivieren von Acknowledge im Treiberdialog Sinn macht.

ReceiveAck=XXX

Hier geben Sie die Zeichenfolge ein, die das Gerät nach dem Empfang eines Befehls zurücksendet.

ReceiveTimeout=XXX

Hier wird die Zeit (Angabe in Millisekunden) festgelegt, wie lange Wings Vioso RX auf die Rückmeldung warten soll. Nach Verstreichen dieser Zeit wird ein Eintrag in die Log-Datei geschrieben und der Befehl wird ggf. erneut gesendet (Retries=?). Diese Zeit sollte so gewählt werden, dass das empfangende Gerät genügend Zeit hat, den Befehl zu erkennen und die Rückmeldung zu senden.

ExecuteAck=XXX

Hier geben Sie die Zeichenfolge ein, die das Gerät nach der Ausführung eines Befehls zurücksendet.

ExecuteTimeout=XXX

Wie ReceiveTimeout, jedoch auf die Ausführung eines Befehls bezogen.

Retries=X

Mit diesem Eintrag bestimmen Sie, wie oft der Befehl wiederholt werden soll, wenn in der vorgegebenen Zeit keine Rückmeldung erfolgt. Bei Retries=2 wird der Befehl also maximal dreimal gesendet.

PollInterval=X

Wenn bei einem Abfragebefehl das Standard-Intervall nicht zur Anwendung kommen soll, können Sie das Intervall für diesen Befehl individuell in Sekunden vorgeben. Die Abfrage wird nicht ausgeführt, wenn X=0 ist.

 

Senden variabler Werte aus Datenobjekten oder Kontrollfeldern

Wenn Sie den Parameter Value benutzen, können Sie mit dem Befehl DriverLoop bestimmen, in welchen Fällen die Daten gesendet werden sollen. Dieser Befehl ist also eine interne Anweisung zu anderen Befehlen.

[DriverLoopX]

Interner Befehl, X (1...255) ist dabei ein Index zur Unterscheidung unterschiedlicher Befehlsblöcke.

ID=X

SubID=X

Mit ID und SubID wird der Befehl definiert, auf den dieser DriverLoop-Befehl wirken soll.

Interval=XXXX

Mit diese Angabe legen Sie fest, wie häufig Werte gesendet werden sollen; die Eingabe erfolgt in Millisekunden.

SendAlways=X

Hier können Sie bestimmen, ob Werte immer gesendet werden sollen (X=1) oder nur, wenn sie sich geändert haben (X=0).

Beispiel für einen kompletten Befehl mit DriverLoop

 

Serielle Schnittstellen von SC Net-Komponenten sind für DriverLoop-Befehle nicht geeignet. Verwenden Sie dafür serielle Schnittstellen von PC-Hardware.

Beispiele

Hier zeigen wir Ihnen einige Beispiele aus dem Treiber für unsere Software EventPlayer. Der untenstehende Befehlsblock dient zum Senden eines einfachen Befehls, hier der Play-Befehl für den aktuellen Ordner der Software EventPlayer. Er lautet in Hex: FF 01 04 FE

[Play]

Info=Starts playback of current folder

Icon=1

ID=5

SubID=0

Send=0xFF 0x01 0x04 0xFE

 

Soll sich der Play-Befehl bei der Software EventPlayer auf einen bestimmten Ordner beziehen, muss der Remote-Index des Ordners im Befehl enthalten sein. Dies lösen wir mit der Angabe von Parameter 1. Außerdem soll im Kontextmenü Play das Untermenü Folder erscheinen, was wir durch die Angabe einer Unterbezeichnung erreichen. Der angegebene Kurzname sorgt dafür, dass im Kontrollfeld die gesamte Information inklusive Ordner-Index sichtbar ist, also z. B. Play fold 14. Da es sich ebenfalls um einen Play-Befehl handelt, wurde die gleiche ID jedoch mit anderer Sub-ID verwendet. Für die Angabe von Parameter 1 wurde das Nummernformat und ein Wertebereich von 1 bis 255 gewählt. In den Befehl wurde #Byte(Par1) zur Angabe des Remote-Index eingefügt. Diese Angabe bewirkt, dass nur das erste Byte der Information im Eingabefeld des Treiberdialogs ausgewertet wird.

[Play:Folder]  //Dieser Kommentar erscheint nicht im Treiberdialog.

Info=Starts specified media folder

ShortName=Play fold

Icon=1

ID=5

SubID=1

Par1=Number(1,255), Remote index of media folder

Send=0xFF 0x02 0x04 #Byte(Par1) 0xFE

 

Mit diesem Befehlsblock wird auch eine Rückmeldung bei korrektem Empfang des Befehls ausgewertet. Dafür sind die letzten drei Zeilen erforderlich. Bei ReceiveAck wird einfach die vom Gerät zurückgemeldete Zeichenfolge eingetragen. ReceiveTimeout sollte nicht zu knapp gewählt werden (hier 500 ms), weil sonst unter Umständen Befehle durch Retries mehrfach gesendet werden. Wenn in der vorgegebenen Zeit die erwartete Rückmeldung nicht eintrifft, schreibt Wings Vioso RX einen Eintrag in die Log-Datei.

[Load Project]

Info=Loads predefined project

ShortName=Load P

Icon=19

ID=10

SubID=0

Par1=Number(1,255), Number of predefined project

Send=0xFF 0x02 0x0A #Byte(Par1) 0xFE

ReceiveAck="OK" 0x0D 0x0A

ReceiveTimeout=500

Retries=2

 

Tipps für die erste Treibererstellung

Den ersten Treiber sollten Sie für ein Gerät schreiben, dessen Protokoll Sie genau kennen. Falls die Steuerung nicht auf Anhieb funktioniert, erleichtert das die Fehlersuche, weil Sie sich auf den Treiber und dessen Syntax konzentrieren können.

Wenn Sie Änderungen an einem Treiber vorgenommen haben, der in einem geöffnetem Projekt verwendet wird, können müssen Sie das Projekt neu laden, damit auch der Treiber neu geladen wird und die Änderungen wirksam werden. Dies entfällt, wenn den Treiber auf folgende Weise öffnen:

    1. Klicken Sie im Media-Pool auf das Pluszeichen vor der Kategorie Geräte und wählen Sie darunter den gewünschten Seriell/LAN-Port.

    2. Klicken Sie im rechten Teil des Media-Pools mit der rechten Maustaste auf die serielle Schnittstelle und wählen Sie Eigenschaften.

    3. Klicken Sie auf Treiber editieren, nehmen Sie die Bearbeitung vor und speichern Sie den Treiber.

    4. Klicken Sie im Dialog von Wings Vioso RX auf OK. Danach können Sie den Treiber und seine Funktionen verwenden.

    siehe auch

    Icons für Treiber-Befehle auswählen

    Treiber für serielle Steuerung verwenden

    Variable Datenausgabe per Treiber