Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:controllers:s0-an-rs232

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hardware:controllers:s0-an-rs232 [2012/01/02 23:50] – typo fix r00thardware:controllers:s0-an-rs232 [2019/05/29 10:29] (aktuell) – Link ins Mailinglistenarchiv fixed zugschlus
Zeile 1: Zeile 1:
-==== direkter anschluss S0 an RS232 ====+====== 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.
  
-diese einfache methode erlaubt es, ohne nennenswerte zusaetzliche hardware(!), einen s0-zaehler per direktem anschluss an einen PC oder ein vergleichbares system auszuwerten(prinzipiell jedes system mit rs232-schnittstelle, das entsprechende software ausfuehren kann, zB dockstar oder iconnect mit usb-rs232 adapter, oder auch den internen uart, zB an einem openert router!)+<note> 
 +Der Großteil des Inhalts dieser Seite stammt aus einer [[http://demo.volkszaehler.org/pipermail/volkszaehler-dev/2010-May/000084.html|Mail]] von Harald König an die vz-dev Mailingliste. 
 +</note>
  
-die auswertung wird von [[/software/controller/vzlogger]] unterstuetzt!+===== 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).
  
-das skaliert auch ganz prima: fuer jeden weiteren kanal nur noch einen weiteren usb-rs232-adapter +Und seit 2 Jahrzehnten ist es gängigdieses DCF77-Signal einfach über eine serielle Schnittstelle mit 50 Baud auszuwerten ([[http://www.obbl-net.de/dcf77.html|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.
-und irgendwann vielleicht noch einen usb-hub...+
  
-<note> +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östUnd dieses dann einlesen und den Timestamp merken/ausgeben -- Fertig!
-Der grossteil des inhalts dieser seite stammt aus einer mail von Harald Koenig an die vz-dev liste: http://volkszaehler.org/pipermail/volkszaehler-dev/2010-May/000084.html +
-</note>+
  
-=== grundidee === +===== Umsetzung ===== 
-man will ja nur pulse zaehlen mit genauer "ankunfszeit", die pulse kommen  +Bei der Verkabelung ist auf die Polarität des S0-Anschlusses zu achtenViele S0-Zähler realisieren diesen über einen Optokoppler und nicht über einen Schaltkontakt!
-so max1 mal pro sekunde und sind so ~100 msec lang. +
-das alles erinnert *exterm* an das DCF77 funkuhr-signal (1 puls pro sekunde, +
-100 oder 200 msec lang == 0 oder 1)...+
  
-und seit so jahrzehnten ist es usus, dass man deses dcf77-signal einfach  +Also muss 
-an eine serielle schnittstelle haengt mit 50 baud der start des pulses +  * S0- (Swissnox Klemme 21) mit RS232-Rx (Pin auf DSUB-9) und 
-ist die startflanke des "startbit" bei der asynchronen seriellen uebertragung, +  * S0+ (Swissnox Klemme 20) mit RS232-RTS (Pin 7 auf DSUB-9) 
-und je nach dem ob kurzer oder langer puls sind mehr oder weniger bits gesetzt +verbunden werden
-und man kann sogar die pulslaengen damit erkennen.+Die restliche Verkabelung auf 'Primärseite' des Zählers bleibt wie gehabt.
  
-pulslaengen gibts hier beim stromzaehlen nicht, also noch einfacher;+{{:hardware:controllers:rs232-s0.png}}
-so muss man wirklich nur die S0-ausgaenge (zumindfuer SWISSNOX) +
-an eine serielle schnittstelle haengen zwischen Rx und z.b. RTS +
-(irgend eine handshake output leitung, die man dann auf 0 (== aktiv == space) +
-ziehen muss).   +
-dann muss man nur noch warten bis der S0-pulse als "startbit" ein zeichen ausloest +
-und dieses dann einlesen und den timestamp merken/ausgeben -- fertig!+
  
-=== umsetzung === +Mac Gyver Variante der SchaltungFür den produktiven Einsatz nicht empfohlen ;)
-das kann man dann direkt z.b. mit einem usb2serial adapter/kabel abgreifen, +
-oder auf eine echte serielle schnitstelle geben, so man noch hat;) +
  
-alsoSWISSNOX klemme 21 muss mit RS232 Rx (pin 2 auf DSUB-9) und klemme 20 mit RTS (pin 7 auf DSUB-9) +{{:hardware:controllers:s0-an-rs232_macgyverjpg.jpg?384}}
-verbunden werden, der rest (230V) wie gehabt.+
  
-man kann dazu direkt zwei aufgebogene bueroklammern verwenden und die +Alternativ kann man auch die Reste einer seriellen Maus endlich zu was Vernünftigem verwenden und damit die Verkabelung an den Zähler realisieren:
-mit hilfe eines "gender changer" (weiblich/weiblich) direkt in die RS232-verbindung stecken, +
-oder etwas bequemer (wenn man noch 2 weitere bueroklammern und 2 krokoklemmen kabel uebrig hat...).+
  
-alternativ kann man auch die reste einer original microsoft seriellen maus endlich zu was vernueftigem +{{:hardware:controllers:mauskabel.jpg?384}} 
-verwenden und damit den anschluss an den usb/seriell adapter machen (bei mirorange=Rxweiss=RTS).+ 
 +===== Raspberry PI ===== 
 +<note> 
 +vzlogger loggt jetzt auch GPIOs.. 
 +</note> 
 +<note warning> 
 +ACHTUNGes 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  
 +</note>
  
-=== software === +Beim Raspberry Pi ist ein interne UART als ''/dev/ttyAMA0'' vorhanden, der hierfuer verwendet werden koennte.\\ 
-das auswerten wird von [[/software/controller/vzlogger]] direkt unterstuetzt!\\ +Die Pinbelegung ist GPIO 15 für RXD (P1-10).\\ 
-alternativ, und/oder zum testenbietet sich folgendes an:+Achtung! Das funktioniert nicht in Verbindung mit Udos RPi-Erweiterungenda dort diese Pins schon belegt sind.
  
-software:  serielle schnittstelle richtig konfigurieren +Da es sich um 3,3V-Pegel handelt, wird die RTS-Leitung nicht benoetigt, GND und/oder Vcc reichen aus.\\ 
-(50 baud, jedes zeichen sofort ausgeben, ...)+(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''.)
  
-    stty time 1 min 1 -icanon < /dev/ttyUSB0+===== Software ===== 
 +Die Auswertung der seriellen Schnittstelle wird dabei von [[/software/controller/vzlogger]] übernommen. Dafür wird das vzlogger-Protokoll ''s0'' benutzt. Ein Beispiel ist in der Standardkonfiguration im Wiki zu sehen.
  
-und schon kann man die daten wie gewuenscht lesen.  doch wie an einen "guten" +==== Alternative ==== 
-time stamp kommen, wenn man kein C o.aeprogrammieren will ?   +Harald König hat bei der Entwicklung dieser Methode Standardtools von Linux verwendet
-z.bso: +Seine Skripte sind im git verfügbar: [[https://github.com/volkszaehler/volkszaehler.org/blob/master/misc/controller/misc/log_rawS0.sh|bash]][[https://github.com/volkszaehler/volkszaehler.org/blob/master/misc/controller/misc/log_rawS0.lua|lua]].
-<code> +
-     strace -ttt -e read cat  < /dev/ttyUSB0 > /dev/null  +
-</code> +
-und um das ganze besser beurteilen und verdauen zu koennen +
-noch ein bissl test code dazu: +
-<code> +
-     ( 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}' +
-</code> +
-spalte 1 liefert dann die leistung in watt, 2 die laufende zeit in sekunden, 3 die zeit seit dem letzten puls, und dann noch den gesamten strace-output mit original timestamp.+
  
 +Serielle Schnittstelle richtig konfigurieren (50 Baud, jedes Zeichen sofort ausgeben, ...):
 +<code>stty time 1 min 1 -icanon < /dev/ttyUSB0</code>
  
-es fallt dabei auf (zumind. bei meinem setup), dass immer mal wieder ein "falscher" zweiter puls kommen kann (ursache sollte man mal noch erforschen, evlt. mit oszi?!)+Zeichen einlesen und Timestamp erzeugen
-<code> +<code>strace -ttt -e read cat  < /dev/ttyUSB0 /dev/null </code>
- 1275071653.195588 read(0, "\0", 4096)   = 1 +
- 1275071681.731568 read(0, "\0", 4096)   = 1 +
- 1275071710.623568 read(0, "\0", 4096)   = 1 +
- 1275071739.471581 read(0, "\0", 4096)   = 1 +
- 1275071768.351691 read(0, "\0", 4096)   = 1 +
-==> 1275071797.199619 read(0, "\377", 4096) = 1 +
- 1275071797.271617 read(0, "\0", 4096)   = 1 +
- 1275071826.107561 read(0, "\0", 4096)   = 1 +
-</code> +
-aber die lassen sich ja leicht wegfiltern, z.b. mit +
-<code> +
-grep 'read(0, "\\0", 4096)' +
-</code>+
  
-wenn man die daten gleich in der datenbank haben will (mit dem PHP/mysql code von Florian Ziegler, daher die rundung der timestamps?!), dann  muss der einzeiler eben noch ein bissl wachsen;) +Etwas mehr Test-Code um das ganze besser beurteilen zu können: 
-<code> +<code>( 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}'</code>
-     ( strace -ttt -e read cat  < /dev/ttyUSB0 > /dev/null ) 2>&1 | awk '/read\(0, "\\0", 4096\)   = 1/{ t=int($1 + 0.5) system("wget -O-  \"http://harald/f10/volkszaehler.org/httplog.php?uuid=00000000-0000-0000-0000-000000000001&port=0000001&time=\"" " # >& /dev/null"); }' +
-</code> +
-und schon fuellt sich die datenbank!+
  
 +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.
hardware/controllers/s0-an-rs232.1325544658.txt.gz · Zuletzt geändert: 2012/01/02 23:50 von r00t