Der dispatch Mechanismus


 

Die Datenpunktabbildungen zwischen den Treibern werden in der Datei dispatch.txt definiert. Damit ein Datenpunkt in der dispach.txt verwenden werden kann, muss der Datenpunkt zuvor in den treiberspezifischen *.txt-Dateien deklariert sein.

Die einfachste Möglichkeit Datenpunkte miteinander zu verknüpfen ist die 1:1 Abbildung.
Ein solcher dispatch-Eintrag ist wie folgt aufgebaut.

[<Routingadresse des Quelltreibers> <Quelltreibername> <Datenpunktadresse>]
target = <Routingadresse des Zieltreibers> <Zieltreibername> <Datenpunktadresse>

Beispiel Modbus→BACnet:

[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001

Jeder dispatch-Eintrag kann optional mit den folgenden zwei Einträgen ergänzt werden, um spezielle Datenpunktabbildungen vorzunehmen.

threshold =
value =

Die Angabe von threshold hat je nach Datenpunkttyp verschiedene Bedeutungen.

Im Fall von ganzzahligen Datenpunkten bedeutet threshold = 1, dass das dispatch nur bei einem Übergang auf „1“ ausgeführt wird. Für Analogwerte bedeutet threshold = 1 eine Wertberuhigung. In diesem Fall werden nur Wertänderungen übertragen, die um mehr als 1 von dem aktuellen Zielwert abweichen, die Änderung also größer 1 ist.

Mit value kann dem Zieldatenpunkt ein bestimmter Wert zugewiesen werden, wobei dieser Wert ein Festwert ist oder durch Berechnung aus dem Quelldatenpunkt und/oder beliebigen anderen Datenpunkten hervorgeht.

Dazu einige Beispiele:

# Quellwert = 1 (Ganzzahl (M)) -> Zielwert 15
[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001
threshold=1
value=15

# Quellwert = 2 -> Zielwert 27
[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001
threshold=2
value=27

# alle anderen Quellwerte -> Zielwert 99
[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001
threshold=default
value=99

 

# Quellwert (Fließkommazahl (X)) -> Zielwert (nur bei Änderung um mindestens 0,5)
[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001
threshold=0.5

 

# Quellwert + 1 -> Zielwert
[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001
value=increment

# Quellwert - 1 -> Zielwert
[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001
value=decrement

Für den Treiber BACnet gibt es eine Besonderheit. Hier kann von einer Quelle eine Priorität für ein Objekt mit einem Prio-Array übergeben werden.

# Übergabe des Werte von Modbus nach BACnet mit einer Prio von 8 auf das BV Objekt
[80 mod 1 coil 0]
target = 940 bac local.BV 1
prio = 8

Über den Dispatch Mechanismus können auch STRING Interpretationen stattfinden. Diese können entweder wieder in STRINGS gewandelt werden oder in eine Zahl. Das Schema findet über die value = map() Funktion statt.

[940 bac local.CSV 1]
target = 940 bac local.BI 3
value = map("TRUE":1,"FALSE":0,)

[940 bac local.CSV 1]
target = 940 bac local.CSV 2
value = map("TRUE":"NeuerWertWahr","FALSE":"NeuerWertFalsch",)

Der ankommende Quellwert wird als erster „Key“ angegeben (dieser ist zwingend als STRING anzugeben. Der „Value“ folgt durch ein „:“ getrennt. Zeichenketten werden mit „angegeben, Zahlenwerte ohne. Jedes Paar endet auf ein “,„.

Bei Verwendung von Formeln zur Berechnung der Datenpunkte gilt folgende Definition für die Adressierung der Datenpunkte.

„X“ innerhalb der Sektion formula() steht für den Wert des Quelldatenpunktes
„$(<Routingadresse> <Treibername> <Datenpunktadresse>)“ steht für den Wert des adressierten Datenpunktes

# Quellwert / 2.55 -> Zielwert
[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001
value = formula(X/2.55)

 

# Quellwert + Wert eines anderen Datenpunktes -> Zielwert
# Die Formel wird nur bei Änderung des Quellwerts (holding 2386) berechnet.
[80 mod 1 holding 2386]
target = 940 bac 96099.AI 32001
value = formula(X+$(80 mod 1 holding 1000))

# Die Formel wird bei Änderung von holding 1000 berechnet.
[80 mod 1 holding 1000]
target = 940 bac 96099.AI 32001
value = formula($(80 mod 1 holding 2386)+X)

Über den Dispatch Mechanismus können auch die einzelnen Zustands-Flags der Datenpunkte abgefragt und einem Datenpunkt zugewiesen werden. Im Beispiel werden das Flag „valid“ und das Flag „fault“ eines LON Datenpunktes auf einen Binären BACnet Datenpunkt abgebildet.

[10 lon object 2]
value = formula(if($(10 lon object 2).valid;1;0))
target = 940 bac local.BI 2

[10 lon object 2]
value = formula(if($(X).fault;1;0))
target = 940 bac local.BI 3

Innerhalb der Sektion formula() können folgende Operatoren verwendet werden:

OperatorBeschreibungBeispiel
Einstellige Operatoren
#ERROR!Vorzeichen bleibt#ERROR!
-Vorzeichenwechsel-X (-1 → +1)
~Invertieren~X (~21 → 10 / ~10101 → 01010)
!Not!X (!1 → 0)
Zweistellige Operatoren
^Bit Xor
|Bit Or
&Bit And
||Or
&&And
#ERROR!Vergleich auf Gleichheit
!=Vergleich auf Ungleichheit
>größer
>=größer oder gleich
<kleiner
kleiner oder gleich
#ERROR!AddierenX+5 (9+5 → 14)
-SubtrahierenX-5 (9-5 → 4)
MultiplizierenX5 (95 → 45)
/DividierenX/5 (9/2 → 4)
%ModuloX%5 (9%2 → 1)
Nullstellige Funktionen
systimeGetSysTime
timeGetTime
dateGetDate
hourGetHour
minuteGetMinute
secondGetSecond
yearGetYear
monthGetMonth
dayGetDayOfMonth
ydayGetDayOfYear
mdayGetDayOfMonth
wdayGetDayOfWeek
curtimeGetSysTime
Einstellige Funktionen
sinSinussin(X) Winkel X in Bogenmass (sin((45°PI)/180) → 0.707107)
cosCosinuscos(X) Winkel X in Bogenmass (cos((45°PI)/180) → 0.707107)
tanTangenstan(X) Winkel X in Bogenmass (tan((45°PI)/180) → 1)
asinArcus Sinusasin(X) Winkel X in Bogenmass
acosArc Cosinusacos(X) Winkel X in Bogenmass
atanArcus Tangensatan(X)
expExpexp(X) (eX)
fabsFabsfabs(X) (Betrag von X)
floorFloorfloor(X) (Runden auf nächstkleinere natürliche Zahl)
ceilCeilceil(X) (Runden auf nächstgrößere natürliche Zahl)
logLoglog(X) (ln(X),nat. Logarithmus)
log10Log10log10(X) (log10(X),Logarithmus zur Basis 10)
sqrtWurzelsqrt(X) (sqrt(9) → 3)
Zweistellige Funktionen
atan2ArcusTangens
fmodmoduloRest der ganzzahligen Division (fmod(10,3) → 1)
powPotenzpow(3; 2) → 9
maxMaximummax(1; 2) → 2
minMinimummin(1; 2) → 1
roundRundenRunden auf bestimmte Anzahl Kommastellen (round(3.774; 2) → 3.77)
Dreistellige Funktionen
ifif(a;b;c) entspricht if a then b else cif ( $(1 ugwc freemem)<1000; 1; 0 )
max3Maximummax3(5;6;7) → 7
min3Minimummin3(5;6;7) → 5