SERCOM
Konzept
SERCOM ist die generische serielle Kommunikation (ASCII oder binär) für Geräte mit eigenem Telegrammprotokoll, etwa Wetterstationen, RFID-Leser oder proprietäre Busse. Eine Funktion beschreibt ein Telegramm: was gesendet wird, wie die Antwort begrenzt ist und wie lang sie ist. PROTOCOL beginnt mit SERCOM (auch SERCOM(new)).
Parameter
| Key | Default | Beschreibung |
|---|---|---|
CONNECTION |
– | SERIALPORT, SERIALPORT+, IPADDRESS |
SERIALPORT, SERIALPORT_NODE, IPADDRESS_NODE |
– | Schnittstelle |
BAUDRATE, DATABITS, STOPBITS |
– | seriell |
PARITY |
– | nur das erste Zeichen zählt (N/O/E) |
FLOWCONTROL |
– | NO/SW/HW |
TIMEOUT |
5000 ms | Antwort-Timeout |
WAIT_AFTER_SEND |
– | ms Wartezeit nach dem Senden |
ACTION_AFTER_RECEIVE |
CLEARIN |
NONE, CLEARIN, CLEAROUT, CLEARINOUT (Puffer leeren) |
Spalten
| Spalte | Beschreibung |
|---|---|
ALIAS |
Name |
SEND |
zu sendender Inhalt (Text, Hexbytes \XX…, mit Argumenten) |
SEND_DELIMITER_START / SEND_DELIMITER_END |
Start-/Endzeichen des Sendetelegramms |
RECEIVE_LEN |
erwartete Antwortlänge in Byte (max. 1024) |
DATATYPE |
ASCII (intern ASCCI, =0) oder BYTE (=1) |
DELIMITER_START / DELIMITER_END |
Start-/Endkennung der Antwort |
POLLING |
ms |
CRC |
wird eingelesen. Die Verwendung ist zu klären. |
FORMULA |
Auswertung |
Delimiter-Notation: \ gefolgt von Hexbytes, z. B. \02 (STX), \03 (ETX), \0D0A (CR LF), \030D0A (ETX CR LF).
Wann wird gesendet?
Eine SERCOM-Funktion sendet nur in der PREPROCESS-Phase (*READ) oder wenn ihr Flag .F gesetzt ist.
Argumente
;*ARGS;METHOD;ALIAS;TYPE;NAME;VALUE;ITEM;FORMAT; (Spalte nach ARGS = Funktions-Alias). Bei SERCOM ist NAME ein printf-Format, in das der Wert eingesetzt wird. FORMAT kann DEZIMAL, FLOAT, STRING, DAY, ISO8601, ENUM:…, T_YYYYMMDDHHMM oder ein %-Format (s, g, f, X, x, c) sein.
Zugriff auf die Antwort
| Ausdruck | Bedeutung |
|---|---|
<A>.DATA |
gesamte Antwort |
<A>.<start>.<len>.STRING |
Teilstring ab Byte start (Länge len). Position 0 ist das erste Zeichen des Telegramms, laut Elsner-Beispiel der Start-Delimiter (W). |
<A>.<start>.<len>.INT |
als Ganzzahl interpretiert |
<A>.<start>.<len>.FLOAT |
als Gleitkomma interpretiert |
<A>.<start>.<len>.HEX |
als Hexwert interpretiert |
<A>.<start>.<len>.BYTESUM |
Summe der Bytes (z. B. für Prüfsummen) |
<A>.<pos>.<a,b,c> |
liefert den Index der Option, die an Position pos steht (z. B. N,S → 0/1) |
<A>.ARG.<name> |
Argument |
Realer Auszug: Elsner P04/3-RS485 basic
Datei Elsner.Weather station.SERCOM (DDF).P043-RS485 basic.1(0x0900004000010100).csv (vollständiger Funktionsteil). Die Station sendet zyklisch ein ASCII-Telegramm, das mit W beginnt und mit ETX (\03) endet.
*GENERAL;
;DEVICE;P04/3-RS485-basic;
;MANUFACTURER;Elsner;
;TYPE;Weather station;
;PROTOCOL;SERCOM(new);
;MODEL_NR;7;
;VERSION_NR;1;
;ID;0x0900004000010100;
;CONNECTION;SERIALPORT+;0:SERIALPORT,1:SERIALPORT+,2:IPADDRESS,3:DOMAIN;
;BAUDRATE;19200;
;DATABITS;8;
;STOPBITS;1;
;PARITY;NONE;NONE,ODD,EVEN;
;FLOWCONTROL;NO;NO,SW,HW;
;TIMEOUT;5000;ms;
;WAIT_AFTER_CONNECT;2;s;
;MIN_PAUSE;50;ms;
;ERROR_HANDLING;FLUSH_OR_RECONNECT_ON_ERROR;
;ACTION_AFTER_RECEIVE;CLEARINOUT;
*PREPROCESS;ALIAS;SEND;RECEIVE_LEN;DATATYPE;DELIMITER_START;DELIMITER_END;POLLING;FORMULA;
;READ;;26;ASCII;W;\03;500;"""
ITEM.QUALITY:= READ.T>($.SYS.TIME-20) && READ.Q;
ITEM.SUMDATA:=READ.0.21.BYTESUM;
ITEM.CHECKSUM:=READ.21.4.INT;
ITEM.DATALEN:=READ.L;
ITEM.ERRORCOUNT:=READ.EC;
IF ITEM.DEBUG==1 THEN
DEBUG(READ.T,READ.Q,READ.EC,READ.L,READ.0.21.BYTESUM,READ.21.4.INT);
ENDIF;
IF (ITEM.SUMDATA == ITEM.CHECKSUM) THEN
CHECK_OK:=1;
ELSE
CHECK_OK:=0;
ENDIF;
IF CHECK_OK && READ.Q THEN
ITEM.TEMPERATURE:=READ.1.5.FLOAT;
ITEM.BRIGHTNESS_SOUTH:=READ.6.2.INT;
ITEM.BRIGHTNESS_WEST:=READ.8.2.INT;
ITEM.BRIGHTNESS_EAST:=READ.10.2.INT;
ITEM.TWILIGHT_ON:=READ.12.N,J;
ITEM.TWILIGHT:=READ.13.3.INT;
ITEM.WIND:=READ.16.4.FLOAT;
ITEM.RAIN_ON:=READ.20.N,J;
ITEM.ERRORCOUNT:=0;
ELSE
ITEM.ERRORCOUNT:=1;
ENDIF;
""";
*ITEM;ALIAS;NAME;VISIBILITY;ID;UNIT;TYPE;DEFAULT;WFORMULA;RFORMULA;POLLING
;TEMPERATURE;Temperatur outside;;0;C;
;BRIGHTNESS_SOUTH;Sun south;;1;klx;
;TWILIGHT_ON;Twilight indication;;4;
;WIND;Wind;;6;m/s;
;RAIN_ON;Raining;;7;
;SUMDATA;Sumdata helper;;210;
;CHECKSUM;Checksum;;211;
;QUALITY;Quality;;201;
;INFO;Info;;204;;STRING;Elsner P04/3-RS485-basic;
Was der Auszug zeigt:
- Jede Anweisung endet mit
;. SENDist leer, weil die Station von sich aus sendet. Die Funktion empfängt 26 Byte zwischenWund ETX alle 500 ms.- Prüfsumme:
READ.0.21.BYTESUM(Summe der Bytes 0…20) wird mitREAD.21.4.INTverglichen (4 ASCII-Ziffern ab Position 21). READ.1.5.FLOATliest 5 Zeichen ab Position 1 (z. B.+12.3) als Zahl.READ.12.N,Jliefert den Index des Zeichens an Position 12 in der ListeN,J(N→ 0,J→ 1).- Qualität kombiniert Aktualität und Gültigkeit:
READ.T>($.SYS.TIME-20) && READ.Q. PROTOCOL;SERCOM(new)funktioniert, weil nur das PräfixSERCOMgeprüft wird.
Fallstricke
- Falsche Delimiter führen zu
.Q = 0, obwohl Daten ankommen. Prüfen Sie dann.Lund.DATA. - Positionen in
<A>.<start>.<len>zählen ab dem ersten Zeichen des Telegramms. Im Elsner-Beispiel ist Position 0 der Start-DelimiterW(abgeleitet). RECEIVE_LEN> 1024 ist nicht erlaubt.ACTION_AFTER_RECEIVE=NONElässt Restdaten im Puffer, die das nächste Telegramm verfälschen.
Checkliste
- [ ] serielle Parameter korrekt
- [ ] Delimiter in
\XX-Notation - [ ]
RECEIVE_LEN≤ 1024 - [ ]
DATATYPEASCIIoderBYTE - [ ] Formeln prüfen
.Q