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>[.<Datenpunkttyp>] <Quelltreibername> <Datenpunktadresse>] target = <Routingadresse des Zieltreibers>[.<Datenpunkttyp>] <Zieltreibername> <Datenpunktadresse>
Beispiel Modbus→BACnet:
[80.X mod 1 holding 2386] target = 940.Y bac 96099.AI 32001
Die Angabe des Datenpunkttyps ist bei den aktuellen Gateways mit Linux Betriebssystem im dispatch-Eintrag nicht erforderlich, kann jedoch optional immer noch mit angegeben werden. Die Angabe im dispatch-Eintrag muss dabei mit der Definition des Datenpunktes übereinstimmen.
Für den Datenpunkttyp gilt folgende Definition.
Typ: | Bedeutung |
---|---|
M | Ganzzahliger Wert (Binäre Datenpunkte,Zählwerte) der vom Gateway nur gelesen werden kann/soll. |
S | Ganzzahliger Wert der vom Gateway gelesen sowie geschrieben werden kann/soll. |
X | Analogwert (mit Nachkommastellen) der vom Gateway nur gelesen werden kann/soll. |
Y | Analogwert (mit Nachkommastellen) der vom Gateway gelesen sowie geschrieben werden kann/soll. |
A | String, findet z.B. Verwendung bei BACnet Trends und ESPA4.4.4 Datenpunkten |
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.M mod 1 holding 2386] target = 940.S bac 96099.AI 32001 threshold=1 value=15 # Quellwert = 2 -> Zielwert 27 [80.M mod 1 holding 2386] target = 940.S bac 96099.AI 32001 threshold=2 value=27 # alle anderen Quellwerte -> Zielwert 99 [80.M mod 1 holding 2386] target = 940.S bac 96099.AI 32001 threshold=default value=99
# Quellwert (Fließkommazahl (X)) -> Zielwert (nur bei Änderung um mindestens 0,5) [80.X mod 1 holding 2386] target = 940.Y bac 96099.AI 32001 threshold=0.5
# Quellwert + 1 -> Zielwert [80.X mod 1 holding 2386] target = 940.Y bac 96099.AI 32001 value=increment # Quellwert - 1 -> Zielwert [80.X mod 1 holding 2386] target = 940.Y bac 96099.AI 32001 value=decrement
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>[.<Datenpunkttyp>] <Treibername> <Datenpunktadresse>)“ steht für den Wert des adressierten Datenpunktes
# Quellwert / 2.55 -> Zielwert [80.X mod 1 holding 2386] target = 940.Y 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.X mod 1 holding 2386] target = 940.Y bac 96099.AI 32001 value = formula(X+$(80.X mod 1 holding 1000)) # Die Formel wird bei Änderung von holding 1000 berechnet. [80.X mod 1 holding 1000] target = 940.Y bac 96099.AI 32001 value = formula($(80.X 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:
Operator | Beschreibung | Beispiel |
---|---|---|
Einstellige Operatoren | ||
+ | Addieren | +X (+1 → 2) |
- | Subtrahieren | -X (-1 → 0) |
~ | Invertieren | ~X (~21 → 10 / ~10101 → 01010) |
! | Not | !X (!1 → 0) |
Zweistellige Operatoren | ||
^ | Bit Xor | |
| | Bit Or | |
& | Bit And | |
|| | Or | |
&& | And | |
== | Vergleich auf Gleichheit | |
!= | Vergleich auf Ungleichheit | |
> | größer | |
>= | größer oder gleich | |
< | kleiner | |
⇐ | kleiner oder gleich | |
+ | Addieren | X+5 (9+5 → 14) |
- | Subtrahieren | X-5 (9-5 → 4) |
* | Multiplizieren | X*5 (9*5 → 45) |
/ | Dividieren | X/5 (9/2 → 4) |
% | Modulo | X%5 (9%2 → 1) |
Nullstellige Funktionen | ||
systime | GetSysTime | |
time | GetTime | |
date | GetDate | |
hour | GetHour | |
minute | GetMinute | |
second | GetSecond | |
year | GetYear | |
month | GetMonth | |
day | GetDayOfMonth | |
yday | GetDayOfYear | |
mday | GetDayOfMonth | |
wday | GetDayOfWeek | |
curtime | GetSysTime | |
Einstellige Funktionen | ||
sin | Sinus | sin(X) Winkel X in Bogenmass (sin((45°*PI)/180) → 0.707107) |
cos | Cosinus | cos(X) Winkel X in Bogenmass (cos((45°*PI)/180) → 0.707107) |
tan | Tangens | tan(X) Winkel X in Bogenmass (tan((45°*PI)/180) → 1) |
asin | Arcus Sinus | asin(X) Winkel X in Bogenmass |
acos | Arc Cosinus | acos(X) Winkel X in Bogenmass |
atan | Arcus Tangens | atan(X) |
exp | Exp | exp(X) (eX) |
fabs | Fabs | fabs(X) (Betrag von X) |
floor | Floor | floor(X) (Runden auf nächstkleinere natürliche Zahl) |
ceil | Ceil | ceil(X) (Runden auf nächstgrößere natürliche Zahl) |
log | Log | log(X) (ln(X), nat. Logarithmus) |
log10 | Log10 | log10(X) (log10(X), Logarithmus zur Basis 10) |
sqrt | Wurzel | sqrt(X) (sqrt(9) → 3) |
Zweistellige Funktionen | ||
atan2 | ArcusTangens | |
fmod | modulo | Rest der ganzzahligen Division (fmod(10,3) → 1) |
pow | Potenz | pow(3; 2) → 9 |
max | Maximum | max(1; 2) → 2 |
min | Minimum | min(1; 2) → 1 |
round | Runden | Runden auf bestimmte Anzahl Kommastellen (round(3.774; 2) → 3.77) |
Dreistellige Funktionen | ||
if | if(a;b;c) entspricht if a then b else c | if ( $(1 ugwc freemem)<1000; 1; 0 ) |
max3 | Maximum | max3(5;6;7) → 7 |
min3 | Minimum | min3(5;6;7) → 5 |