Die Konfiguration des Daemons erfolgt mit XML-Dateien.
Programmspezifische Konfigurationen sind in der datei vcontrold.xml angelegt, kommandospezifische Konfigurationen finden sich in der Datei vito.xml.
vcontrold.xml inkludiert die Datei vito.xml mittels XInclude.

Die Datei gliedert sich in drei Hauptabschnitte:
<unix>: Maschinennahe Konfigurationen
<units>: Einheiten zur implizierten Umrechnung, hierauf wird in der vito.xml mit dem <unit> Tag des Kommandos verwiesen.
<protocols>: Protokoll-spezifische Definition der protocmd-Kommados (in vito.xml). Hier werden die verschiedenen Definitionen für die Kommandos getaddr (und später setaddr) definiert).

Abschnitt unix:

serial:
tty:Der Name des ttys zur Kommunikation mit der Anlage.
Hier kann auch eine IP-Adresse:Port statt eines Unix devices (z.B. /dev/ttyS0) angegeben werden.
Dieser Wert wird durch den Kommandozeilenschalter -h überschrieben.
Der Kommandozeilenschalter -h überschreibt diesen Wert
net:
port: Der zu öffnende TCP Port für Cli Anfragen.
Diese Konfiguration wird durch den Kommandozeilenschalter -p überschrieben
allow ip: Angabe der IP-Adresse und optionaler Size, für die Verbindungen erlaubt sind

logging:
file: Name der Log-Datei
Dieser Wert wird durch den Kommandozeilenschalter -l überschrieben
syslog: Nutzung syslog y=yes, n=no
Die Syslog Nutzung kann durch den Schalter -s unabhängig eingeschaltet werden
debug: Ausgabe von Debug Meldungen y=yes, n=no

device: Definition des Device Typs. Dies referenziert auf die vito.xml und legt das verwendete Protokoll und die
Zur Verfügung stehenden Befehle fest.

Beispiel:

<unix>
     <config>
        <serial>
                <tty>192.168.1.112:3000</tty>
        </serial>
        <net>
                <port>1234</port>
            <allow ip='127.0.0.1'/>
                <allow ip='192.168.1.0/24'/>
     </net>
        <logging>
                <file>/tmp/vcontrold.log</file>
                <syslog>y</syslog>
                <debug>y</debug>
        </logging>
        <device ID="2098"/>
     </config>
  </unix>
 

(Zu den folgenden Abschnitten siehe auch hier.)

Abschnitt units:

abbrev: Abkürzung der unit, auf dieses Abkürzung wird mit dem <unit> Tag in <comand> der vito.xml referenziert.
calc:
Hier können arithmetische Ausdrücke zur Umrechnung angegeben werden. Zur Zeit sind + - * / ( ) in beliebiger Schachtelung möglich. Als Variablen stehen zur Verfügung:
Attribute:
  • get : Wandlung bei Abfrage eines Wertes
  • set: Wandlung beim Setzen eines Wertes
  • B0...B9 -> zurückgelieferte Bytes der Abfrage
  • V -> Value unter Berücksichtigung des Types <type>
icalc:
Hier können Integer Arithmetik Ausdrücke inklusive Bitmanipulationen durchgeführt werden.
Zur Zeit steht nur das Attribut get zur Verfügung.
Zur Zeit sind folgende Opertationen definiert:
  • Int: + - * / () %
  • Bit: & | ^ ~ << >>
  • B0-..B9 -> zurückgelieferte Bytes der Abfrage
  • BP -> Bitposition, aus der <command> <bit>n</bit> Definition.
Die XML Sonderzeichen müssen entsprechend berücksichtigt werden:
& -> &amp;
  • -> &gt;
< -> &lt;
Zahlen können dezimal oder in 0x... Schreibweise hexadezimal angegeben werden.
Um ein bestimmtes Bit auf 0 oder 1 zu testen, kann folgende Unit verwendet werden:
        <unit name='Bitstatus'>
           <abbrev>BST</abbrev>
           <type>uchar</type>
           <icalc get="(B0 &amp; (0x01&lt;&lt;BP))&gt;&gt; BP"/>
           <enum bytes='00' text='0'/>
           <enum bytes='01' text='1'/>
           <enum text='UNKNOWN'/>
        </unit>
 
Die get Zeile ohne Sonderzeichen:
(B0 & (0x01 << BP) >> BP)
B0= empfangenes Byte
BP=Bit Postition (aus <bit> )
0x01<<BP baut eine Bitmaske mit dem Bit an der richtigen Stelle, dies wird logisch & mit dem empfangenen Wert genommen und das Ergebnis wieder BP Stellen nach rechts verschoben.
Das Ergebnis kann dann nur 0x00 oder 0x01 sein.
Der anschließende <enum> Block dient zur Ausgabe einer alternativen Meldung (hier 00->0 und 01->1)

type: Typ der zurückgelieferten Bytes. Zur zeit sind implementiert:
  • char -> 1 Byte, intern signed char
  • uchar -> 1 Byte, intern unsigned char
  • short -> 2 Bytes, intern signed short
  • ushort -> 2 Bytes, intern unsigned short
  • int -> 4 Bytes, intern signed int
  • uint -> 4 Bytes, intern unsigned int
  • cycletime -> 2 x n Bytes: An/Aus Schaltzeit
 <unit name='CycleTime'>
           <abbrev>CT</abbrev>
           <type>cycletime</type>
 </unit>
 
$ ./vclient -h 127.0.0.1:1234 -c 'detail getSchaltMon,getSchaltMon'
detail getSchaltMon:
getSchaltMon: SEND 04;WAIT 05;SEND 01 F7 20 00 08;RECV 08 CT
        Unit: CycleTime (CT)
          Type: cycletime
          Calc: (null)
          Einheit: (null)
getSchaltMon:
1:An:06:00  Aus:09:00
2:An:18:30  Aus:19:30
3:An:21:00  Aus:22:20
4:An:--     Aus:--
 
  • systime -> 8 Bytes Ausgabe: Wochentag, TT.MM.JJ HH:MM:SS
<unit name='SystemTime'>
     <abbrev>TI</abbrev>
     <type>systime</type>
</unit>
 

  • errstate -> 9 Bytes 1. Byte Fehlercode (enum Auswertung) 8 Byte systime

<unit name='ErrorState'>
     <abbrev>ES</abbrev>
     <enum bytes='00' text='kein Fehler'/>
     <enum bytes='01' text='Fehler 01'/>
     <enum bytes='02' text='Fehler 02'/>
     <enum text='UNKNOWN'/>
    <type>errstate</type>
</unit>
 


  • enum -> Aufzählungstypen (Übersetzung Bytes in Text), Es können beliebige Bytefolgen (in Hex, Leerzeichen getrennt) angegeben werden. Der Deafult Wert wird durch weglassen des Attributs bytes definiert.
<unit name='BetriebsArt'>
<abbrev>BA</abbrev>
<type>enum</type>
<enum bytes='00' text='AUS'/>
<enum bytes='01' text='WW'/>
<enum bytes='02' text='H+WW'/>
<enum bytes='03' text='RED'/>
<enum bytes='04' text='NORM'/>
<enum text='UNKNOWN'/>
</unit>
 

entity:
Zusatztext, der hinter dem Ergebnis ausgegeben wird
<units>
<unit name='Temperatur'>
<abbrev>UT</abbrev>
<calc get='V/10' set='V*10'/>
<type>short</type>
<entity>Grad Celsius</entity>
</unit>
</units>
 
Es können beliebige Units definiert werden.


Abschnitt protocols:


macro: Definition von zu sendenden Befehlen, die unter dem Makro Name in <send> des Kommandos in diesem Abschnitt angegeben werden können.
commands: Defintion von Protokoll-Kommandos, die zur direkten Kommunikation mit der Anlage genutzt werden
send: Zu sendende Byte-Kommandos. Hier können die Makro Defintionen des Protokolls genutzt werden.
Folgende Kommandos stehen zur Verfügung:
  • SEND <BYTES in Hex>
  • WAIT <BYTES in Hex>
  • RECV <Anzahl Bytes> <optional Unit aus <unit><abbrev>>
  • PAUSE <ms>
  • SEND BYTES <unit> -> Sende gewandelten Wert als Bytes an die Anlage. Wanldung nach angegebener <unit>
Als Variablen aus dem command Abschnitt der vito.xml stehen zur Verfügung:
  • $addr -> vito.xml-><command><addr>
  • $len ->vito.xml-><command><len>
  • $hexlen ->vito.xml-><comman><len> in Hex gewandelt
  • $unit >vito.xml-><command><unit>
retry: Tritt ein Fehler während der Verarbeitung auf (siehe recvTimeout oder vito.xml <error>) wird der Befehl bis zum definierten Wert wiederholt.
recvTimeout: Beim GWG Protokoll gibt es Probleme mit nicht erkannten Anfragen. In diesem Fall dauert die Antwort länger als die üblichen 30-40ms. Dieser Wert definiert die max. Empfangszeit beim RECV Kommando, in der die Antwort als gültig angesehen wird. 150ms haben sich als sinnvoll erwiesen.
<protocols>
<protocol name='KW2'>
<macros>
<macro name='SYNC'>
<command>SEND 04;WAIT 05</command>
</macro>
<macro name='GETADDR'>
<command>SEND 01 F7</command>
</macro>
<macro name='SETADDR'>
<command>SEND 01 F4</command>
</macro>
</macros>
<commands>
<command name="getaddr">
<send>SYNC;GETADDR $addr $hexlen;RECV $len $unit</send>
</command>
<command name="setaddr">
<send>SYNC;SETADDR $addr $hexlen;SEND BYTES $unit;RECV 1</send>
</command>
 
</commands>
</protocol>
</protocols>

Wandlung von Werten beim Setzen (SEND BYTES)

Wird das Kommando SEND BYTES genutzt, wird der übergebene Wert nach den Angaben der <unit> gewandelt und als Bytes in der Darstellung <type> an die Anlage gesendet.
Beispiel:
vctrld>detail settempWW
settempWW: SEND 04;WAIT 05;SEND 01 F4 08 04 02;SEND BYTES UT;RECV 1
Unit: Temperatur
Type: short
Calc: V*10
Einheit: Grad Celsius
vctrld>debug on
vctrld>settempWW 53.4
DEBUG:Sun Mar  2 14:42:55 2008 : Befehl: settempWW 53.4
DEBUG:Sun Mar  2 14:42:55 2008 : ClI Net: verbunden 192.168.1.112:3000 (FD:7)
DEBUG:Sun Mar  2 14:42:55 2008 : >SEND: 04
DEBUG:Sun Mar  2 14:42:55 2008 : Warte auf 05
DEBUG:Sun Mar  2 14:42:55 2008 : <RECV: 06
DEBUG:Sun Mar  2 14:42:58 2008 : <RECV: 05
DEBUG:Sun Mar  2 14:42:58 2008 : >SEND: 01
DEBUG:Sun Mar  2 14:42:58 2008 : >SEND: F4
DEBUG:Sun Mar  2 14:42:58 2008 : >SEND: 08
DEBUG:Sun Mar  2 14:42:58 2008 : >SEND: 04
DEBUG:Sun Mar  2 14:42:58 2008 : >SEND: 02
DEBUG:Sun Mar  2 14:42:58 2008 : Send Exp:V*10 [V=53.400002]
DEBUG:Sun Mar  2 14:42:58 2008 : Typ: short (Bytes: 16 02 )
DEBUG:Sun Mar  2 14:42:58 2008 : >SEND: 16
DEBUG:Sun Mar  2 14:42:58 2008 : >SEND: 02
 
Beispiel mit Interpretation des Rückgabewerte:
$ ./vclient -h 127.0.0.1:1234 -c 'detail setTempWWsoll,debug on,setTempWWsoll 54.3'
detail setTempWWsoll:
setTempWWsoll: SEND 04;WAIT 05;SEND 01 F4 63 00 02;SEND BYTES UT;RECV 1 RT
Unit: Temperatur (UT)
Type: short
Calc: V*10
Einheit: Grad Celsius
Unit: ReturnStatus (RT)
Type: enum
Calc: (null)
Einheit: (null)
Enum Bytes:00 Text:OK
Enum Bytes:05 Text:SYNC (NOT OK)
Enum Bytes:<default> Text:NOT OK
debug on:
 
setTempWWsoll 54.3:
DEBUG:Tue Mar 11 20:28:38 2008 : Befehl: setTempWWsoll 54.3
DEBUG:Tue Mar 11 20:28:38 2008 : ClI Net: verbunden 192.168.1.112:3000 (FD:6)
DEBUG:Tue Mar 11 20:28:38 2008 : Send Exp:V*10 [V=54.299999]
DEBUG:Tue Mar 11 20:28:38 2008 : Typ: short (Bytes: 1F 02 )
DEBUG:Tue Mar 11 20:28:38 2008 : >SEND: 04
DEBUG:Tue Mar 11 20:28:38 2008 : Warte auf 05
DEBUG:Tue Mar 11 20:28:38 2008 : <RECV: 06
DEBUG:Tue Mar 11 20:28:41 2008 : <RECV: 05
DEBUG:Tue Mar 11 20:28:41 2008 : >SEND: 01
DEBUG:Tue Mar 11 20:28:41 2008 : >SEND: F4
DEBUG:Tue Mar 11 20:28:41 2008 : >SEND: 63
DEBUG:Tue Mar 11 20:28:41 2008 : >SEND: 00
DEBUG:Tue Mar 11 20:28:41 2008 : >SEND: 02
DEBUG:Tue Mar 11 20:28:41 2008 : >SEND: 1F
DEBUG:Tue Mar 11 20:28:41 2008 : >SEND: 02
DEBUG:Tue Mar 11 20:28:41 2008 : <RECV: 00
DEBUG:Tue Mar 11 20:28:41 2008 : 00 -> OK
DEBUG:Tue Mar 11 20:28:41 2008 : OK
OK