Inhaltsverzeichnis

S0-Impuls Zähler direkt über RS232 auswerten

Diese simple Methode erlaubt es, ohne zusätzliche Hardware, einen S0-Impuls Zähler über einen RS232-Port auszuwerten. Viele Computer und embedded Systeme besitzen einen RS232-Port. Alternativ kann auch ein RS232-zu-USB Adapter benutzt werden.

Der Großteil des Inhalts dieser Seite stammt aus einer Mail von Harald König an die vz-dev Mailingliste.

Grundidee

Ziel ist es den Abstand aufeinanderfolgender Impulse zu messen, die bis max. 1 mal pro Sekunde kommen und ca. ~100 ms lang sind. Das erinnert an das DCF77 Funkuhr-Signal (1 Impuls pro Sekunde, 100 oder 200 ms lang == 0 bzw. 1).

Und seit 2 Jahrzehnten ist es gängig, dieses DCF77-Signal einfach über eine serielle Schnittstelle mit 50 Baud auszuwerten (Link). Der Start des Impulses ist die Startflanke des „Startbit“ bei der asynchronen seriellen Übertragung, und je nach dem ob kurzer oder langer Impuls sind mehr oder weniger Bits gesetzt und man es ist sogar dabei möglich die Pulslänge zu messen.

Die Länge des S0-Impulses sind hier nicht von Interesse. So muss man nur die S0-Ausgänge an eine serielle Schnittstelle zwischen Rx und z.b. RTS hängen. (Irgend eine Steuerleitung, die man dann auf 0 (aktiv) ziehen muss). Dann muss man nur noch warten bis der S0-Impuls als „Startbit“ ein Zeichen auslöst. Und dieses dann einlesen und den Timestamp merken/ausgeben – Fertig!

Umsetzung

Bei der Verkabelung ist auf die Polarität des S0-Anschlusses zu achten. Viele S0-Zähler realisieren diesen über einen Optokoppler und nicht über einen Schaltkontakt!

Also muss

verbunden werden. Die restliche Verkabelung auf 'Primärseite' des Zählers bleibt wie gehabt.

Mac Gyver Variante der Schaltung. Für den produktiven Einsatz nicht empfohlen ;)

s0-an-rs232_macgyverjpg.jpg

Alternativ kann man auch die Reste einer seriellen Maus endlich zu was Vernünftigem verwenden und damit die Verkabelung an den Zähler realisieren:

mauskabel.jpg

Raspberry PI

vzlogger loggt jetzt auch GPIOs..
ACHTUNG: es handelt sich dort um einen UART-Port mit 3,3V-Pegeln, nicht um eine RS232 Schnittstelle.
Die 3,3V entsprechen auch nicht der S0-Norm EN 62053-31, https://de.wikipedia.org/wiki/S0-Schnittstelle

Beim Raspberry Pi ist ein interne UART als /dev/ttyAMA0 vorhanden, der hierfuer verwendet werden koennte.
Die Pinbelegung ist GPIO 15 für RXD (P1-10).
Achtung! Das funktioniert nicht in Verbindung mit Udos RPi-Erweiterungen, da dort diese Pins schon belegt sind.

Da es sich um 3,3V-Pegel handelt, wird die RTS-Leitung nicht benoetigt, GND und/oder Vcc reichen aus.
(RTS GPIO 17 für RTS (P1-11), siehe http://elinux.org/RPi_Low-level_peripherals. Allerdings ist die RTS Funktion standardmäßig deaktiviert. Zum aktivieren muss der Pin erst in Alternate Function 3 versetzt werden. Das kann z.B. mit diesem Tool erfolgen: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=39138&p=322253 gpio_alt -p 17 -f 3.)

Software

Die Auswertung der seriellen Schnittstelle wird dabei von vzlogger übernommen. Dafür wird das vzlogger-Protokoll s0 benutzt. Ein Beispiel ist in der Standardkonfiguration im Wiki zu sehen.

Alternative

Harald König hat bei der Entwicklung dieser Methode Standardtools von Linux verwendet. Seine Skripte sind im git verfügbar: bash, lua.

Serielle Schnittstelle richtig konfigurieren (50 Baud, jedes Zeichen sofort ausgeben, …):

stty time 1 min 1 -icanon < /dev/ttyUSB0

Zeichen einlesen und Timestamp erzeugen:

strace -ttt -e read cat  < /dev/ttyUSB0 > /dev/null 

Etwas mehr Test-Code um das ganze besser beurteilen zu können:

( strace -ttt -e read cat  < /dev/ttyUSB0 > /dev/null ) 2>&1 | awk 'NR==1{t0=$1;next}{t=$1; print 3600e3 /(t-t1)/2000 ,  t-t0,t-t1,$0;t1=t}'

Spalte 1 liefert dann die Leistung in Watt, 2 die laufende Zeit in Sekunden, 3 die zeit seit dem letzten Impuls, und dann noch den gesamten strace-output mit original Timestamp.