SESAM Schreiber-System

Technische Beschreibung

© SESAM GmbH 2011


Das SESAM-Schreiber-System dient der Messwertaufnahme (Analog- und Digitalwerte), Langzeit-Archivierung und Darstellung in der Form von Messwert-Schreibern bzw. Zähler-Modulen.

Das System ist in einzelne Komponenten gegliedert, die untereinander per TCP/UDP-Protokoll bzw. per Pipe Daten austauschen. Dadurch ist das System einfach erweiterbar und kann an den Stellen, bei denen eine Netzwerkverbindung besteht, auf mehrere Rechner-Systeme verteilt werden.

Die Messwert-Aufnahme kann über unterschiedlichste Module geschehen. Hier eine Auswahl:

  • Siemens S5-SPS Ankopplung (über H1-Bus mittels Koppel-Einheit)
  • Siemens S7-SPS Ankopplung (über TCP/UDP-Netzwerk)
  • Phoenix-Interbus Ankopplung
  • Serielle Ankopplung (RS 485) von verschiedensten Reglern:
    • Eurotherm-Regler
    • Digitric-Regler
    • Stange-Regler
  • Diverse Rechner-Systeme, die TCP/UDP-Protokolle an das Mess-System versenden können.

Die SPS-Systeme vor Ort senden ihre Daten per TCP- oder vorzugsweise UDP-Protokoll an einen SPS-Server [spsserv], der diese Daten in einem Shared-Memory-Bereich ablegt, ohne deren Inhalt zu kennen. Ein SPS-Client [spsclnt] liest diese Daten dann asynchron aus und übergibt ausgewählte Messwerte (in sogenannten Messwert-Kanälen) gruppiert an einen Messwert-Sender [mwsend], der sie an den Messwert-Aufnahme-Dämon [pickupd] sendet.

Bei der Phoenix-Interbus Ankopplung holt Interbus-Dämon [ibsserv] die Messwerte über ein Interbus-TCP-Modul ab und übergibt diese (in Messwert-Kanälen) gruppiert an den Messwert-Sender [mwsend], der sie wiederum an den Messwert-Aufnahme-Dämon [pickupd] sendet.

Bei der seriellen Ankopplung von Reglern liest ein entsprechender (Eurotherm, Digitric, etc.) Regler-Dämon [eurotherm, digitric] zyklisch die Messwerte aus den Reglern über ein Netzwerk-RS485 Modul aus und übergibt diese (in Messwert-Kanälen) gruppiert an den Messwert-Sender [mwsend], der sie ebenfalls an den Messwert-Aufnahme-Dämon sendet.

Bei den sonstigen Rechner-Anbindungen muss das sendende System die Daten in ASCII-Telegrammen zusammengestellt an den Messwert-Aufnahme-Dämon [pickupd] per TCP- oder UDP-Protokoll senden.

Der Messwert-Aufnahme-Dämon [pickupd] nimmt über Netzwerk von den einzelnen messwert-sendenden Stationen die in Messwert-Kanälen gruppierten Daten entgegen und speichert diese mittels eines Plugins [mwsave] im lokalen Dateisystem ab. Die Speicherung erfolgt in TAB-separierten ASCII-Dateien, die in datumsorientierten Ordnerstrukturen abgelegt werden. Eine Langzeit-Archivierung auf z.B. ein NAS-System kann 1:1 erfolgen. Damit kann dann auf die entsprechend archivierten Ordner per NFS-Symlink trotzdem vom Messwert-System aus zugegriffen werden.

Die Darstellung der Messwerte erfolgt über eine Schreiber-Applikation [schreiber], die den altbekannten Papierschreibern nachempfunden wurde, um die Akzeptanz bei den Bedienern zu erhöhen. Das Auslesen der Messwerte aus dem Archiv erledigt dabei ein Hilfsprogramm [mwtail], welches die gewünschten Messwerte (Alt-Werte und aktuell einfließende Werte) dem Messwert-Server [mwserv] liefert, um diese dann per TCP-Protokoll an den Schreiber zu senden, wo sie, wie gewünscht, als Kurven dargestellt werden. Die Ausgabe als Zähler-Modul [zaehler] ist nur eine weitere Darstellungsform der Messwerte (als Zahlenwerte mit Differenzwerten zur Verbrauchsanzeige).


S7-SPS Ankopplung:

Die im Werk verteilten SPSen senden per TCP- oder vorzugsweise UDP-Protokoll zyklisch Datenbausteine (DBs) an das Mess-System. Diese DBs enthalten neben einem Header von 5 Worten (zu je 16 Bits, also insgesamt 10 Bytes) die analogen und digitalen Messwerte. Dabei werden die einzelnen Messwert-Typen der Übersichtlichkeit halber in unterschiedlichen Telegrammen gesendet. Die Daten-Kennung im Header gibt Aufschluss über den Verwendungszweck. Hier der Telegramm-Aufbau an Hand eines Beispieles:

Byte-Adresse Wort-Index Beispielwert Bedeutung Wert
0x0000 0 13 Optionale Sender-Kennung/Anlagen-Nr. (normalerweise 0)  
0x0002 1 3 Kennung: 3 = S7  
0x0004 2 0 für zukünftige Erweiterungen  
0x0006 3 20 Anzahl Bytes im folgenden Datenpaket  
0x0008 4 1 Daten-Kennung (s.u.) = DB-Index im Shared-Memory  
0x000A 5 12345 1. Wert -32768..32767 => 12345 = 0x3039
0x000C 6 4711 2. Wert -32768..32767 => 4711 = 0x1267
0x000E 7 0 3. Wert -32768..32767 => 0 = 0x0000
0x0010 8 1 4. Wert -32768..32767 => 1 = 0x0001
0x0012 9 -1 5. Wert -32768..32767 => -1 = 0xffff
0x0014 10 -27648 6. Wert -32768..32767 => -27648 = 0x9400
0x0016 11 50.0 7. Wert 32bit Float => = 0x4248
0x0018 12 = 0x0000
0x001A 13 3.141592 8. Wert 32bit Float => = 0x4049
0x001C 14 = 0x0fd8


Der SPS-Server [spsserv] nimmt diese Telegramme entgegen und speichert deren Inhalt binär in einem Shared-Memory-Array des Rechners. Pro SPS-Server können damit 32 SPSen mit jeweils 8 DBs à 256 Worten adressiert werden. Das Daten-Array zeigt sich als C-Struktur wie folgt:

#define MAX_SPS   32
#define MAX_DBS   8
#define MAX_WORD  256

unsigned short  data[MAX_SPS][MAX_DBS][MAX_WORD];

Wichtig:  Die Bedeutung der einzelnen Worte wird erst beim Auslesen des Shared-Memories durch den SPS-Client [spsclnt] interpretiert. Sie wird in der jeweiligen SPS-Client-Einstelldatei [spsclnt.ini] festgelegt. Die Datenkennung, ist (unverbindlich) wie folgt festgelegt:

1 = SPS -> Host Analog-Messwerte (16 Bit Integer + 32 Bit Float)
2 = SPS -> Host Digitalwerte (16 Bits)
3 = SPS -> Host Zählerwerte (32 Bits, also immer 2 aufeinanderfolgende Worte)
4 = Host -> SPS Steuerungsbits
5 = Host -> SPS Vorgabewerte
6... zur freien Verfügung


Die Datentypen sind S7-spezifisch, d.h.:

  • 16-Bit Digital-Werte : 16 Einzelbits (0=off 1=on)
  • 16-Bit Integer-Werte : Wertebereich -27648..27648 (+-18% Überlauf/Untersteuerung)
    Negative Werte werden als 2er-Komplement dargestellt. Sollen Fixkomma-Werte übertragen werden, so muss SPS-seitig der Messwert umskaliert werden (z.B. * 100), um auf der Host-Seite dann über die SPS-Konfiguration wieder zurückskaliert zu werden (/ 100).
  • 32-Bit Zähler-Werte : Wertebereich 0..4294967295 (ganzzahlig)
  • 32-Bit Fließkomma-Werte : 32-Bit Real-Zahl

Die SPS-Client-Einstelldatei [s7xxx.ini] (das xxx im Namen wird durch den Namen der SPS ersetzt) definiert die Zuordnung der einzelnen Datenworte bzw. deren Bits zu den Messwert-Namen, die im weiteren Schreiber-System Verwendung finden. Hier ein Beispiel:

# Analogwerte:
smssps-sh1  1  0*    : "SH1-Lebenszeichen"

smssps-sh1  1  1     : "SH1_25kV_Einspeisung_Spannung"         21.25 .. 28.75 kV
smssps-sh1  1  2     : "SH1_25kV_Einspeisung_Wirkleistung"     40 MW
smssps-sh1  1  3     : "SH1_25kV_Einspeisung_Blindleistung"    -10 .. 35 MVA
smssps-sh1  1  4     : "SH1_25kV_Einspeisung_Leistungsfaktor"  -1 .. 1 c
smssps-sh1  1  5     : "SH1_25kV_Einspeisung_Frequenz"         48 .. 52 Hz
 

# Digitalwerte:
smssps-sh1  2  17,00 : "SH1-E32.0"
smssps-sh1  2  17,01 : "SH1-E32.1"
smssps-sh1  2  17,02 : "SH1-E32.2"
smssps-sh1  2  17,03 : "SH1-E32.3"
smssps-sh1  2  17,04 : "SH1-E32.4"
smssps-sh1  2  17,05 : "SH1-E32.5"
smssps-sh1  2  17,06 : "SH1-E32.6"
smssps-sh1  2  17,07 : "SH1-E32.7"
smssps-sh1  2  17,08 : "SH1-E33.0"
smssps-sh1  2  17,09 : "SH1-E33.1"
smssps-sh1  2  17,10 : "SH1-E33.2"
smssps-sh1  2  17,11 : "SH1-E33.3"
smssps-sh1  2  17,12 : "SH1-E33.4"
smssps-sh1  2  17,13 : "SH1-E33.5"
smssps-sh1  2  17,14 : "SH1-E33.6"
smssps-sh1  2  17,15 : "SH1-E33.7"
smssps-sh1  2  18,00 : "SH1-E34.0"
smssps-sh1  2  18,01 : "SH1-E34.1"
smssps-sh1  2  18,02 : "SH1-E34.2"
smssps-sh1  2  18,03 : "SH1-E34.3"

# Zählerwerte:
smssps-sh1  3  0+    : "SH1_Stromverbauch"

Leer- und Kommentarzeilen (mit "#" als erstes Zeichen) werden ignoriert. Die erste Spalte trägt zur Unterscheidung den Netzwerknamen der SPS, da ja mehrere SPSen ihre Datenbausteine an einen SPS-Server senden können. Die zweite Spalte ist die Daten-Kennung (Datentyp) und gleichzeitig auch der Index im Shared-Memory-Bereich. In der dritten Spalte wird der Datentyp festgelegt.

Hier die Daten-Typen:

Typ Kennzeichnung Beispiel Erläuterung Min-Wert Max-Wert
ROH NUMBER 7 Wort 7 als S7-Rohwert *1 -27648 27648
BYTE NUMBER "." INDEX 7.0 Byte 0 im Wort 7 *2 0 255
SHORT NUMBER "*" 7 Wort 7 als Short -32767 32768
BIT NUMBER "," INDEX 7,5 Bit 5 im Wort 7 *3 0 1
LONG NUMBER "+" 7+ Wort 7+8 als Long 0 4294967296
REAL NUMBER "^" 7^ Wort 7+8 als Real 1·10-45 3.403·1038

    *1 Bit 15 = Vorzeichenbit, 100 % entsprechen 27648, Werte über 27648 kennzeichnen einen Überlauf
    *2 Index 0 oder 1 für unteres bzw. oberes Byte
    *3 Index 0 bis 15 für unterstes bis oberstes Bit

Danach folgt ein Doppelpunkt und dann der Messwertname. Messwertnamen müssen im gesamten Mess-System eindeutig sein! D.h. man sollte die Anlage im Namen unterbringen. Als letztes folgt eine optionale Skalierung mit einer Einheit, die aber hier nur der Information des Betrachters dient und keine Auswirkungen hat. Die Skalierung kann entweder als Einzelwert oder als Bereich mit einem trennenden " .. " dazwischen angegeben werden. Sie bezieht sich immer auf den Maximalwert. Um den Messwert zu bilden, wird also durch den Maximalwert dividiert und dann mit dem Bereich multipliziert:

Messwert = (S7Wert / MaxWert) * (BereichObergrenze - BereichUntergrenze) + BereichUntergrenze


Der SPS-Client überwacht den entsprechenden Shared-Memory Bereich und gibt, um Ressourcen zu sparen, nur die Werte aus, die sich ändern. Zum Programmstart und alle 5 Minuten wird jedoch ein Refresh ausgelöst, der alle Werte übermittelt. Das Ausgabeformat entspricht natürlich dem Eingangsformat des Messwert-Senders (s.u.).

Der SPS-Server hat die folgenden Aufruf-Parameter:

spsserv [<Optionen>] <host1> [<host2> ...]
Optionen:
  -h       Ausgabe dieses Hilfe-Textes
  -k<key>  Angabe des Shared-Memory-Keys
  -t<type> Der SPS-Typ ('S5' oder 'S7')
  -d       Meldungen auf stderr ausgeben, statt sie an Syslog zu leiten
  -f       Im Vordergrund arbeiten, nicht forken
  -p       Den S7-Kommunikationsport setzen (Vorgabe = 2000)
  -v       Zusätzliche Meldungen auf stdout ausgeben
  -a       Die eigene Absende-IP-Adresse angeben (für Alias-Interfaces)
  -m<cnt>  Die Anzahl der SPSen im Shared Memory angeben (Vorgabe = 32)


Der SPS-Client hat die folgenden Aufruf-Parameter:

spsclnt <Optionen>
  Optionen:
  -d             Debug einschalten
  -h             Ausgabe dieses Hilfe-Textes
  -n             Rechnernamen nicht konvertieren
  -k <shm-key>   Shared-Memory-Schlüssel (0x00535053)
  -f <filename>  Initialisierungsdatei öffnen
  -s <time>      Schlafintervall in Sekunden
  -t <type>      Arbeitstyp setzen (schreiber / gipsy)
  -w <text>      Den Text <text> an den SPS-Server senden und beenden
  -T <datatype>  Datentyp setzen (S5 / S7)
  -r <time>      Refreshzeit in Sekunden

 


Messwert-Sender:

Der Messwert-Sender [mwsend] nimmt die Messwerte auf seinem Eingang entgegen, bündelt diese zu sog. Messwertkanälen zusammen und sendet die so gruppierten Messwerte dann zyklisch an den Messwert-Aufnahme-Dämon [pickupd]. Die Konfigurationsdatei [mwsend.cf] bestimmt, welche Messwerte in welchem Messwert-Kanal (Channel) landen und wie oft der Messwert-Kanal geschrieben wird (Zykluszeit). Hier eine Beispielkonfiguration [mwsend.cf], in der zwei Messwert-Kanäle (SH1 mit 6 Messwerten und SH2 mit einem Messwert) mit 0,5 bzw 1 Sekunde Zykluszeit definiert werden:

Channels.List  = SH1, SH2
Channels.Delim = \t

Channel.SH1 = 500 : %C, %T, SH1_Lebenszeichen, SH1_25kV_Einspeisung_Spannung, \
  
SH1_25kV_Einspeisung_Wirkleistung, SH1_25kV_Einspeisung_Blindleistung, \
  
SH1_25kV_Einspeisung_Leistungsfaktor, SH1_25kV_Einspeisung_Frequenz

Channel.SH2 = 1000 : %C, %T, SH2_Lebenszeichen

Leerzeilen und Kommentarzeilen (beginnend mit "#") werden ignoriert. Lange Zeilen können mit einem Backslash umgebrochen werden (siehe Beispiel). Leerzeichen dürfen beliebig eingesetzt werden.
Die Zeilen bestehen aus Zuweisungen (Name = Werte). Folgende Namen stehen hier zur Verfügung:

Name Werte
Channels.List Liste der verwendeten Kanal-Namen (NAME) *1
Channels.Delim Feld-Trennzeichen (hier ein Tabulator)
Channel.NAME Kanal-Zykluszeit in Millisekunden
Doppelpunkt ":"
Liste der Messwert-Namen *1 (%C = eigener Kanalname, %T = Clock *2)

*1 Als Listen-Trennzeichen dient das Komma ",".
*2 Der Clock-Wert ergibt sich aus den Sekunden seit dem 1.1.1970, evtl. mit Millisekunden-Nachkommastellen, wenn die Zykluszeit unter einer Sekunde liegt.

Hinweis: Bei der Erweiterung einer bestehenden Konfigurationsdatei sollten neue Messwerte immer nur hinten angehängt werden, da sonst die alten, bereits gespeicherten Messwerte nicht korrekt interpretiert werden können.

Das Eingangsformat des Messwert-Senders ist ASCII-Text mit einem Messwert pro Zeile. Bei jeder Messwertänderung wird der neue Messwert an den Messwert-Sender weitergegeben. Hier ein Beispiel:

AI:SH1_Lebenszeichen=19880
AI:
SH1_25kV_Einspeisung_Spannung=25.465 kV
DI:
SH1-E32.3=0
AI:
SH1_Lebenszeichen=19875
DI:SH1-E33.7=1
DI:SH1-E34.2=0
AI:SH1_Lebenszeichen=19870
AI:SH1_25kV_Einspeisung_Wirkleistung=5.9707 MW


Vorangestellt ist die Kennung "AI:" für Analog-Input oder "DI:" für Digital-Input. Dann folgt der Messwert-Name mit einem Gleichheitszeichen "=" und dem eigentlichen Messwert. Die optionale Einheit wird dann mit einem Leerzeichen vom Messwert getrennt.

Die Ausgabe des Kanals SH1 aus dem obigen Beispiel könnte dann so aussehen (in der ersten Zeile sind die Tabulatoren ausgewiesen):

.......|.......|.......|.......|.......|.......|.......|.......|.......|.......|.......|
SH1     1324568854.002  19880   25.645  5.9707  -10.0798        -0.136068       49.9731
SH1     1324568854.502  19875   25.644  5.9982  -10.0749        -0.132523       49.9738
SH1     1324568855.002  19870   25.633  5.9620  -10.0765        -0.133464       49.9731
SH1     1324568855.502  19865   25.631  6.0474  -10.0781        -0.133825       49.9738
SH1     1324568856.002  19860   25.633  6.0445  -10.0749        -0.130281       49.9735
SH1     1324568856.502  19855   25.628  6.0344  -10.0716        -0.126374       49.9741
SH1     1324568857.002  19850   25.629  6.0937  -10.0895        -0.124566       49.9728
SH1     1324568857.502  19845   25.632  6.1241  -10.0798        -0.125145       49.9745
SH1     1324568858.002  19840   25.636  6.1284  -10.0814        -0.123264       49.9728
SH1     1324568858.502  19835   25.639  6.0836  -10.0781        -0.130136       49.9725


Man erkennt den Kanalnamen, die Uhrzeit, das Lebenszeichen und die 5 weiteren Messwerte, allesamt mit Tabulator getrennt.

Dieser Datenstrom wird per TCP- oder UDP-Protokoll (einstellbar) an den Messwert-Aufnahme-Dämon [pickupd] auf Port 2888 gesendet.

Der Messwert-Sender hat folgende Aufruf-Parameter:

mwsend [<Optionen>]
  
Optionen:
  -h         Diesen Hilfe-Text ausgeben
  -f <file>  Konfigurationsdatei (Vorgabe = mwsend.cf)
  -a <host>  Eigene Absende-IP-Adresse
  -b         Option, um Broadcasts (statt Unicasts) versenden
  -d         Debug-Ausgaben einschalten
  -p <port>  Angabe der Portnummer zum Senden an den pickupd (Vorgabe = 2888)
  -t         TCP-Pakete versenden (statt UDP-Paketen)

Messwert-Aufnahme-Dämon:

Der Messwert-Aufnahme-Dämon [pickupd] nimmt die vom Messwert-Sender [mwsend] oder sonstigen Programmen gesendeten Messwert-Kanäle entgegen und speichert diese im Dateisystem als ASCII-Dateien. Welcher Messwert-Kanal in welcher Datei landet, ist über die Messwert-Aufnahme Einstelldatei [pickupd.cf] konfigurierbar. Hier ein Beispiel:

Command "./mwsave"

TableFile messwerte/SMS/%Y/%m/%d/SH1 d
TableName SH1
TableKey  ASC SH1
TableHint hints/SH1

TableFile messwerte/SMS/%Y/%m/%d/SH2 d
TableName SH2
TableKey  ASC SH2
TableHint hints/SH2


Die Konfiguration enthält folgende Elemente:

Schlüsselwort Bedeutung Beispiel
Command Ein Shell-Kommando, das der eigentlichen Verarbeitung (Speicherung) dient ./mwsave
TableFile Dateiname zur Speicherung der Messwerte (Ersetzung von Datums-Token %Y, %m, etc.)
und Kennzeichnung zur Gültigkeitsdauer (d = Day, h = Hour, etc.)
messwerte/SMS/%Y/%m/%d/SH1 d
TableName Name des Messwert-Kanals (siehe [mwsend.cf]) SH1
TableKey Text-Kennung in den Daten (ASC=ASCII-Kennung) ASC SH1
TableHint Spezifikation der Hinweisdatei (Ortsangabe des letzten Messwertes) hints/SH1


Der Command-Eintrag kann mehrfach vorkommen, so dass man z.B. die Messwerte zusätzlich zur Speicherung mit einem weiteren Skript an einen anderen Rechner senden kann.


Auslesen der Messwerte:

Um die gespeicherten Messwerte zur Darstellung, Weiterverarbeitung, Export etc. wieder auszulesen, wird ein Hilfsprogramm [mwtail] verwendet. Unter Zuhilfenahme der entsprechenden Konfigurationsdateien [pickupd.cf] (definiert, wo die Messwert-Kanäle gespeichert werden), [mwsend.cf] (definiert, welche Messwerte in den einzelnen Kanälen zu finden sind) und einer eigenen Konfiguration [mw.cf], die die Eigenschaften der Messwerte spezifiziert, ist dieses Tool in der Lage sowohl alte Messwerte, als auch die stetig hinzukommenden Werte dem System zu entnehmen.

Die Messwert-Eigenschaften (Formatierung, Einheit, Bereich und eine eventuelle Umrechnung) werden in der Messwert-Konfigurationsdatei [mw.cf] definiert. Hier ein Beispiel:

#
# SH1
#
MM.SH1_Lebenszeichen                   = %.0, Eh., 0, 27648
MM.SH1_Einspeisung_Spannung_25_kV      = %.3, kV,  0, 25
MM.SH1_Einspeisung_Wirkleistung_25_kV  = %.3, MW,  0, 50
MM.SH1_Einspeisung_Blindleistung_25_kV = %.3, MVA, 0, 50
MM.SH1_Einspeisung_Spannung_6_kV       = %.3, kV,  0, 25
MA.
SH1_Einspeisung_Strom_25_kV         = %.1, kA,  0, 1000, &SH1_Einspeisung_Wirkleistung_25_kV;SH1_Einspeisung_Spannung_25_kV;/;1000;*
MA.SH1_Einspeisung_Widerstand_25_kV    = %.6, Ohm, 0, 1,    &SH1_Einspeisung_Spannung_25_kV;SH1_Einspeisung_Strom_25_kV;/

#
# SH2
#
MM.SH2_Lebenszeichen = %.0, Eh., 0, 27648


Leer- und Kommentarzeilen (mit "#" als erstes Zeichen) werden ignoriert. Jede Zeile spezifiziert einen Messwert. Lange Zeilen können mit einem Backslash "\" umgebrochen werden. Eine Zeile beginnt mit "MM." für Merkmal, also einem originären Messwert oder mit "MA." für Merkmal-Alias was einen Pseudo-Messwert definiert, der aus mindestens einem anderen Messwert berechnet wird. Danach folgt der Name des Messwertes. Eine mit Komma getrennte Liste hinter dem dann folgenden Gleichheitszeichen "="spezifiziert die Formatierung (s. printf-Format, aber ohne abschließenden Format-Kennzeichen), die Einheit, den Minimal- und den Maximalwert. Abschließend kann eine mit einem kaufmännischen Und "&" eingeleitete Berechnung in UPN-Schreibweise folgen. Hierbei werden die einzelnen Parameter jeweils mit Semikolon ";" von einander getrennt.

Detail-Beschreibung der einzelnen Elemente einer Messwert-Eigenschaft:

Element Beschreibung Beispiel  
MM. / MA. Merkmal- oder Alias-Spezifikation MA. Alias
Messwertname Name des Messwertes aus [mwsend.cf] oder ein neuer Name bei Aliasen SH1_Einspeisung_Widerstand_25_kV  
= fix =  
Format printf-Format, aber ohne abschließendes Format-Kennzeichen %.6 6 Nachkommastellen
, fix ,  
Einheit Einheitstext des Messwertes Ohm Einheit "Ohm"
, fix ,  
Min-Wert Bei der Ausgabe wird der Messwert auf diesen Minimalwert begrenzt 0 >= 0
, fix ,  
Max-Wert Bei der Ausgabe wird der Messwert auf diesen Maximalwert begrenzt 1 <= 1
, fix , (nur bei Alias)
Formel Berechnungsformel in UPN-Schreibweise, mit ";" getrennten Parametern &SH1_Einspeisung_Spannung_25_kV;
SH1_Einspeisung_Strom_25_kV;/


Der Messwert-Leser hat folgende Aufruf-Parameter:

mwtail [<Optionen>] mwname [...]
  Optionen:
    -f <Datei>       Hinweis-Datei (TableHint aus pickupd.cf)
    -F <Name>        Hinweis-Name (TableName aus pickupd.cf)
    -H <Name>        Kanal-Name (TableName aus pickupd.cf)
    -s <Messzeit>    Zeit zwischen zwei Messwerten in Sek.
    -t <Startsek.>   Beginne ab jetzt minus n Sekunden
    -T <Startzeit>   Beginne ab dem angegebenen Zeitpunkt
    -E <Endezeit>    Ende an dem angegebenen Zeitpunkt
    -D <Dauer>       Ende = Startzeit + Dauer in Sek. (statt Endezeit)
    -z <Zeitraum>    Der Zeitraum einer Anzeigeseite in Sek.
    -m <Markerzeit>  Alle n Sekunden einen Marker setzen
    -d <Anzeigezeit> Alle n Sekunden einen neuen Bildschirmaufbau
    -p <Pausenzeit>  Verzögerung in Sek., die vor der Ausgabe liegt
    -c <Dateiname>   Angabe der 'mw.cf' Datei
    -C <Dateiname>   Angabe der 'mwsend.cf' Datei
    -P <Dateiname>   Angabe der 'pickupd.cf' Datei
    -r <Pfad>        Angabe des Rootverzeichnisses fuer Messwertdateien
    -e               Export der Daten im 'Excel-Format'
    -b               Export der Daten im 'BLT/TCL-Format'
    -B               Export der Daten im 'BLT/TCL-Format' (1:1)
    -Z <Zeit>        Offset-Zeit in Sek. für Messwerte
    -R               Messwerte für Zähler lesen (read for counter)
    -Q               Erkennung von Messwerten in der Zukunft abschalten
    -x               Debugging einschalten


Für die Parameter gelten folgende Vorgaben:

Messzeit      =    60 (1 Minute)
Startsekunden =     0 (jetzt)
Startzeit     = jetzt (da Startsekunden auf 0)
Endezeit      =     - (Ende offen)
Zeitraum      =  3600 (1 Stunde)
Markerzeit    =   600 (10 Minuten)


Alle Zeiträume werden in Sekunden, Minuten (m), Stunden (h) oder Tagen (d) angegeben. (1d = 24h = 1440m = 86400)

Start- und Endezeit haben das Text-Format 'TT.MM.JJ hh:mm:ss' oder das Zahlenformat YYYYMMDDhhmmss.

Die Optionen -f, -F und -H schließen sich gegenseitig aus. Soll ein dynamischer Schreiber für ständig aktualisierte Messwerte generiert werden, so ist die Hinweisdatei (-f) oder der Hinweisname (-F) anzugeben. Soll der Schreiber nur statische Messwerte anzeigen, so ist der Kanalname (-H) anzugeben.

Die Option -R liest die Messwerte einer Zeile aus, auch wenn der Zeitpunkt größer als der Aktuelle ist.

Einfaches Beispiel:

mwtail -s 0.5 -t 1h -z 10m -m 1m -d 2 SH1_Lebenszeichen SH2_Lebenszeichen

Es werden die beiden Lebenszeichen von SH1 und SH2 beginnend vor 1 Stunde in einem Zeitraster von 0.5 Sekunden für einen Messwert-Schreiber ausgegeben. Die Anzeige zeigt dabei 10 Minuten auf der ersten Seite mit einer Markierung je Minute. Alle 2 Sekunden findet dabei ein Refresh statt.

Beispiel für den Excel-Export von Alt-Daten:

mwtail -e -s 1 -T 20111210140000 -E 20111210160000 SH1_25kV_Einspeisung_Spannung SH1_25kV_Einspeisung_Wirkleistung SH1_25kV_Einspeisung_Blindleistung


Ausgabe:

Datum / Uhrzeit SH1 25kV Einspeisung Spannung [21..29 kV]       SH1 25kV Einspeisung Wirkleistung [0..40 MW]    SH1 25kV Einspeisung Blindleistung [0..35 Mvar.]
10.12.2011 14:00:00     0,000000        0,000000        0,000000
10.12.2011 14:00:01     25,972000       7,309030        -10,030900
10.12.2011 14:00:02     25,969500       7,445020        -10,024400
10.12.2011 14:00:03     25,980400       7,392940        -10,052100
10.12.2011 14:00:04     25,990400       7,390050        -10,047200
10.12.2011 14:00:05     25,977100       7,591150        -10,032600
10.12.2011 14:00:06     25,970100       7,906540        -10,048800
10.12.2011 14:00:07     25,958900       8,025170        -10,029300
10.12.2011 14:00:08     25,967300       7,866030        -10,052100
...
10.12.2011 15:59:52     25,869700       5,940390        -10,040700
10.12.2011 15:59:53     25,882200       5,951970        -10,022800
10.12.2011 15:59:54     25,851800       6,076390        -10,032600
10.12.2011 15:59:55     25,875900       5,979460        -10,014600
10.12.2011 15:59:56     25,866200       5,963540        -10,024400
10.12.2011 15:59:57     25,870200       6,001160        -10,032600
10.12.2011 15:59:58     25,849300       6,064810        -10,058600
10.12.2011 15:59:59     25,848500       6,054690        -10,040700


Die Messwerte werden TAB-separiert ausgegeben, so dass sie mit Excel einfach eingelesen werden können. Dabei werden die Zahlen mit Kommata "," als Dezimalpunkt ausgegeben.


Messwert-Server:

Über den Messwert-Server können gespeicherte Messwerte des Messwert-Systems per Netzwerk (TCP) abgerufen werden. Er fungiert als Schnittstelle zwischen Messwert-Anzeige [schreiber] und Messwert-Leser [mwtail]. Damit wird es möglich, von externen Arbeitsplätzen auf die Messwerte zuzugreifen, um z.B. Messwert-Schreiber oder Zählermodule an beliebigen Orten im Netz anzuzeigen. Der Messwert-Server lauscht auf dem TCP-Port 55555 auf eingehende Anfragen und interpretiert diverse Kommandos, um an die Messwerte zu kommen.

Kommando-Liste:

Kommando Funktion
Hosts Die in der Schreiber-Konfiguration [schreiber.cf] hinterlegte Host-Liste
Proxy <host> Verbindet sich mit einem weiten Messwert-Server, um alle Kommandos an diesen weiterzuleiten
List Ausgabe von
a) einer Liste aller verfügbaren Messwerte aus der Messwert-Leser-Konfiguration [mw.cf]
b) einem Array aller fertig konfigurierten Schreiber-Skripten [scripts/*.sh] mit Angabe aller Infos aus den Skripten
Zaehler Ausgabe aller verfügbaren Zähler
Set <name> <wert> Setzt eine datenstrom-spezifische Variable mit dem angegebenen Namen auf den spezifizierten Wert
Folgende Variablen müssen *1 bzw. können *2 gesetzt werden:
Fenstertitel   = Titeltext des Schreiber-Fensters *1
Messwertzeit   = Zeitraum zwischen zwei Messwerten (mwtail-Option -s) *1
Seitenzeitraum = Zeitraum einer Anzeigeseite (mwtail-Option -z) *1
Rueckblendzeit = Start jetzt minus n Sekunden (mwtail-Option -t) *2
Startzeit      = Startzeitpunkt (mwtail-Option -T) *2
Endezeit       = Endzeitpunkt (mwtail-Option -E) *2
Markerzeit     = Marker-Zeitraum (mwtail-Option -m) *1
Messwert_1     = 1. Messwertname *1
Messwert_2     = 2. Messwertname *2
...
Messwert_64    = 64. Messwertname *2 (letztmöglicher Messwert)

Anhand der Rückblendzeit wird entschieden, ob ein fester Zeitraum oder aktuelle Messwerte übertragen werden sollen

Start Startet einen Messwert-Leser [mwtail] und liefert alle Messwert-Daten an den Aufrufer zurück.
Alle notwendigen Parameter müssen zuvor mit Set gesetzt werden.
Excel <start> <ende>
 <zeit> <liste>
Startet einen Messwert-Leser [mwtail] mit Excel-Formatierung und liefert alle Daten an den Aufrufer zurück.
Die Parameter sind:
start = Start-Zeitpunkt (mwtail-Option -T)
ende  = End-Zeitpunkt (mwtail-Option -E)
zeit  = Messwert-Zeit (mwtail-Option -s)
liste = Messwert-Liste


Der mit den Kommandos Start oder Excel aufgerufene Messwert-Leser [mwtail] wird vom Messwert-Server entkoppelt (fork+exec), damit dieser wieder frei ist und nicht durch hängende TCP-Verbindungen blockiert wird.

Die Konfigurationsdatei [schreiber.cf] spezifiziert sowohl die Proxy-Einträge (Weiterleitung auf ein anderes Schreiber-System), als auch die Zugriffsrechte (welcher Client darf welchen Betrieb sehen). Hier eine (fiktive) Beispiel-Konfiguration für 3 Server:

# Liste der verfügbaren Schreiber-Systeme (Titel, Hostname):
set d_info(host) {
  "Server 1"  smssrv1.sesam-intern.pdn
  "Server 2"  smssrv2.sesam-intern.pdn
  "Server 3"  smssrv2.sesam-intern.pdn
}

# Zugriffsrechte (Hostname, Betriebe (* = alle)):
set d_info(allow) {
    pc1.sesam-intern.pdn    {"Server 1" "Server 3"}
  pc2.sesam-intern.pdn    *
  pc3.sesam-intern.pdn    {"Server 2" "Server 3"}
  sesam.sesam-intern.pdn  {"Server 1"}
}

Alle nicht aufgeführten PCs werden abgewiesen.

Der Messwert-Server hat folgende Aufruf-Parameter:

mwserv [<Optionen>]
  
Optionen:
  -a <addr>    Angabe der eigenen IP-Adresse
  -p <port>    TCP-Port-Nummer (Vorgabe = 55555)
  -m <file>    Angabe der Messwert-Konfigurationsdatei (Vorgabe = mw.cf)

Messwert-Anzeige:

Für die Messwert-Darstellung existieren zwei Anzeige-Module:

  1. Schreiber-Modul zur grafischen Darstellung von Messwert-Kurven
  2. Zähler-Modul für die Interpretation der Messwerte als Zählerwerte mit Anzeige von Differenzwerten aktueller Zeiträume

Schreiber-Modul:

Das Schreiber-Modul existiert in zwei Varianten. Die erste (ältere) Variante ist nur auf X-Servern lauffähig, aber sehr Resourcen-schonend und damit auch auf älteren oder schwachbrüstig ausgelegten Systemen lauffähig. Hier ein Bildschirm-Foto der ersten Variante:


Schreiber-alt.png

Die zweite (neuere) Variante ist auf UNIX-, Windows- und MacOS-X-Systemen lauffähig und bietet mehr Einstellmöglichkeiten:

Schreiber-neu.png

Z.B. kann man nun die Darstellungsform von Papier-Schreiber auf X/Y-Schreiber (Taste XY) umstellen:

Schreiber-neu-xy.png

Die Bedienung des Schreibers gestaltet sich wie folgt:

Tastatur-Bedienung:

  • Taste "P" zum Anzeigen einzelner Messpunkte (kleines Rautensymbol)
  • Taste "L" wechselt für den angegebenen Messwert auf eine logarithmische Anzeige (und auch wieder zurück)
  • Taste "0".."9" aktiviert die entsprechende Kurve 1..9 bzw. wechselt mit 0 zur Prozentanzeige
    Alternativ kann auch mit der Maus die Taste des entsprechenden Messwertes angeklickt werden
  • Taste/Button "+" stellt mehr Messwerte dar (Erweiterung des Zeitstrahles)
  • Taste/Button "-" stellt weniger Messwerte dar (Verkürzung des Zeitstrahles)
  • Taste "X" / Button XYwechselt in den X-Schreiber Modus (Zeitachse von links nach rechts)
  • Taste "Y" / Button XYwechselt in den Y-Schreiber Modus (Zeitachse von unten nach oben)
  • Taste "D" / Button Drucker startet den Ausdruck der aktuellen Messwerte
  • Taste "S" / Button Diskette ruft den Dialog zum Speichern der Messwerte als Excel-Datei auf
  • Taste "H" / Button Diagramm schaltet zwischen Histogramm und Linienanzeige um
  • Leertaste / Button Männchen wechselt zwischen Online und Offlinemodus

Maus-Bedienung:

  • Aktivierung der Kurven über die einzelnen Buttons der Messwert-Titel
  • Bewegung der Maus über dem X/Y-Graphen zur Anzeige der aktuellen Position (Zeit und Messwert-Skalierung)
  • Im Offline-Modus:
    • Scrollen des Anzeigebereiches und Auswahl eines Bereiches mit der Maus (Zoom-Rect)
    • Doppelklick setzt die Zeitmarke (Strichellinie) auf den angewählten Zeitpunkt und zeigt die Messwerte dieses Zeitpunktes an

Das neue Schreiber-Modul hat folgende Aufruf-Parameter:

wish schreiber.tcl [-geometry WxH+X+Y] -- <Optionen>
  Optionen:
  -h               Anzeige dieses Hilfe-Textes
  -title <titel>   Vorgabe des Fenster-Titels
  -connect <host>  Hostname/IP des Messwert-Servers [mwserv]
  -proxy <host>    
Hostname/IP des Messwert-Proxies [mwserv]
  -printer <name>  Vorgabe des Druckers (statt Auswahl-Menü)

Zähler-Modul:

Das Zähler-Modul zeigt die Messwerte nicht in graphischer Form an, sondern stellt die Zählerwerte und deren Differenz-Werte zum aktuellen Tag/Monat bzw. Vor-Tag/Monat in Dialog-Form dar. Ein eventueller Zählerumlauf wird dabei mit berücksichtigt und entsprechend korrekt angezeigt.

Hier ein Bildschirm-Foto eines Zähler-Modules:

Zaehler.png

Das Zähler-Modul wird über eine Zähler-Beschreibungsdatei [zaehler.bes] gesteuert. Hier stehen die Zähler-Namen und -Nummern, die dazugehörigen Messwerte, sowie die Grenzwerte (Tag + Monat), bei deren Überschreitung eine Einfärbung (gelber Hintergrund) stattfindet. Hier eine Beispiel-Konfiguration:

Neue Gruppe
  Uhr

Neue Gruppe
  Text    "Gasmengen:"
  Zähler  "Haube 1"         12.???  Zaehler_GM_Haube1  100000 1000000
  Zähler  "Haube 4"         12.???  H4_Gas_Zähler      100000 10000000
  Neue Zeile
  Text    ""
  Zähler  "Steckofen 1"     12.006  Zaehler_GM_STO1    100000 1000000
  Zähler  "Glühofen 3"      12.009  Zaehler_GM_GLO3    100000 1000000
  Neue Zeile
  Text    ""
  Zähler  "Drehherdofen 1"  12.015  DHO1_Gas_total     10000 150000


Hier sind 5 Zähler-Module eingetragen (Haube 1 + 4, Steckofen 1, Glühofen 3 und Drehherdofen 1). Ein Zähler-Modul "Zähler" hat 5 Parameter:

  1. Überschrift (z.B. "Steckofen 1")
  2. Zähler-Nummer (z.B. 12.006)
  3. Der Messwert-Name (z.B. Zaehler_GM_STO1)
  4. Der Tages-Maximalwert
  5. Der Monats-Maximalwert

Die Elemente "Neue Gruppe", "Uhr", "Text" und "Neue Zeile" sind identisch zu den Elementen im Anlagenbild und dort näher beschrieben.

Das Zähler-Modul hat folgende Aufruf-Parameter:

wish zaehler.tcl [-geometry WxH+X+Y] -- [<Optionen>] <Titel> <Beschreibungsdatei>
  Optionen:
  -host <host>     Hostname/IP des Messwert-Server [mwserv]
  -proxy <host>    Hostname/IP des Messwert-Proxies [mwserv]
  -printer <name>  Vorgabe des Druckers (statt Auswahl-Menü)

Anlagen-Bild:

Das Anlagenbild ist ein frei konfigurierbares Menüsystem auf Button-Basis. In erster Linie sollen Schreiber-Skripts damit aufgerufen werden können. Da über die Skripts [scripts/*.sh] natürlich beliebige Funktionen realisiert werden können, sind auch administrative Vorgänge, wie das Neu-Starten von Prozessen realisierbar.

Hier ein Bildschirmfoto eines Anlagenbildes:

Anlagenbild.png

Die Konfigurationsdateien der Anlagenbilder liegen im Unterverzeichnis "anl_bes" (Anlagen-Beschreibungen) und enden auf ".bes".

Folgende Steuer-Elemente sind in dem Anlagen-Bild darstellbar:

Element Beschreibung Beispiel
Zeichensatz <Schrift> <Größe> <Stil> Angabe des Zeichensatzes für Text- und Button-Elemente Zeichensatz Helvetica 12 bold
Neue Gruppe Eine neue Gruppe (Frame) horizontaler Ordnung Neue Gruppe
Neue Zeile Erzeugt einen Zeilenumbruch und fängt mit der Plazierung wieder links an Neue Zeile
Füller Füll-Element, das Platz verbraucht Füller
Uhr Anzeige einer Digital-Uhr im Format TT.MM.YYYY hh.mm.ss Uhr
Suche Eine Such-Eingabe, um Dialog-Elemente schneller zu finden Suche
Text <Text> Anzeige eines festen Textes Text "Anlage:"
Schreiber <Titel> Plaziert einen Button zum Aufruf eines konfigurierbaren Scheibers Schreiber "Schreiber F1"
Skript <Titel> <Datei> Plaziert einen Button zum Aufruf eines Skriptes aus dem Verzeichnis scripts Skript "T-Scheiber" ~TSchreiber
Meldungen <Zeilen> <Programm> <Filter> Plaziert eine Liste, deren Inhalt vom angegebenen Programm gefüllt wird.
Dabei ist Filter ein regulärer Ausdruck, mit dem die Meldugen gefiltert werden können.
Meldungen 10 [Tclsh alarmlog.tcl] ALARM
Editor <Titel> <Dateiname> Platziert einen Button zum Aufruf eines Editors für die angegebene Datei Editor "Kesselhaus" s7kh.ini
StartApp <Titel> <Dateiname> Platziert einen Button zum Anzeigen des angegebenen Dokumentes.
Dabei wird je nach Dateityp immer die (systemspez.) eingetragene Applikation gestartet.
 
Anlage <Titel> <Datei> Plaziert einen Button zum Aufruf eines neuen Anlagen-Bildes.
Beginnt der Titel mit "*", "+" oder ":", so erscheint zuvor eine Passwortabfrage.
Anlage "Bearbeitung" anl_bes/anlage-bearb.bes
Zurück <Titel> Plaziert einen Button zum Zurückspringen zum vorigen Fenster Zurück "Zurück zum Hauptfenster"


Das Anlagen-Bild hat folgende Aufruf-Parameter:

wish anlage.tcl [-geometry WxH+X+Y] -- [<Optionen>]
  Optionen:
  -h              Anzeige dieser Hilfe
  -bes <file>     Spezifikation der Beschreibungsdatei (Vorgabe = anlage.bes)
  -title <titel>  Angabe des Fenster-Titels
  -dir <dir>      Angabe des Basis-Verzeichnisses (setzt das aktuelle Arbeitsverzeichnis)


Das Anlagenbild sollte über ein Programm-Icon auf dem Schreibtisch (Desktop) des entsprechendern Users gestartet werden.


Start-Skripts:

Alle Server-Prozesse (Dämonen) werden über die System-Inittab (SYS-5 Init-Mechanismus) [/etc/inittab] gestartet. Hier ein Auszug:

se01:35:respawn:/bin/su - smsadmin -c /sms/schreiber/rc.d/rcpickupd
se02:35:respawn:/bin/su - smsadmin -c /sms/schreiber/rc.d/rcmwserv
se03:35:respawn:/bin/su - smsadmin -c /sms/schreiber/rc.d/rcmwsend
se05:35:respawn:/bin/su - smsadmin -c /sms/schreiber/rc.d/rcvisuserv
se16:35:respawn:/bin/su - smsadmin -c /sms/schreiber/rc.d/rc.sps-sh1
se17:35:respawn:/bin/su - smsadmin -c /sms/schreiber/rc.d/rc.sps-sh2


Alle Start-Skripte liegen im Schreiber-Unterverzeichnis [rc.d] und werden über den respawn-Eintrag unter dem User "smsadmin" neu gestartet, sobald sie terminieren. Die Skripte im Einzelnen:

Skript Funktion
rcpickupd Start des Messwert-Aufnahme-Dämons [pickupd]
rcmwserv Start des Messwert-Servers [mwserv]
rcmwsend Start der Messwert-Sender [mwsend] *1 (für alle SPSen)
rcvisuserv Start der Visualisierungs-Server (für alle SPSen) -> siehe gesonderte Dokumentation SMS-System
rc.sps-* Start der SPS-Server [spsserv] (Für jede Warte ein Server)

*1 Der Messwert-Sender stellt in sofern eine Besonderheit dar, als dass nicht nur einfach ein Programm gestartet werden muss, sonder von allen SPSen per jeweiligem SPS-Client die Daten gesammelt an zwei unterschiedliche Ziele (Messwert-Aufnahme-Dämon und Stör-Melde-System-Dämon) gesendet werden müssen. Hierzu gibt es zwei Utilities: [mpipe] zum Zusammenführen mehrerer Eingangsdaten und [xpipe] zum Verteilen von Eingangsdaten an mehrere Ziele. Somit lassen sich in Kombination die Daten mehrerer Eingangsquellen an mehrere Ziele verteilen. Der Übersichtlichkeit halber wurden dazu die einzelnen SPS-Client-Aufrufe in eigene Shell-Skripte verpackt.

Um das gesamte SESAM-Schreiber-System mit einem Aufruf stoppen und starten zu können, existiert das kleines Tool [rcsms], das diese Aufgabe übernimmt und alle Inittab-Eintäge gleichzeitig deaktiviert bzw. wieder aktiviert.


Übersichtsbild:

Schreiber-System.png