Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:controllers:s0-an-rs232

Dies ist eine alte Version des Dokuments!


direkter anschluss S0 an RS232

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!)

die auswertung wird von vzlogger unterstuetzt!

das skaliert auch ganz prima: fuer jeden weiteren kanal nur noch einen weiteren usb-rs232-adapter, und irgendwann vielleicht noch einen usb-hub…

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

grundidee

man will ja nur pulse zaehlen mit genauer „ankunfszeit“, die pulse kommen so max. 1 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 2 jahrzehnten ist es usus, dass man deses dcf77-signal einfach an eine serielle schnittstelle haengt mit 50 baud. der start des pulses ist die startflanke des „startbit“ bei der asynchronen seriellen uebertragung, und je nach dem ob kurzer oder langer puls sind mehr oder weniger bits gesetzt und man kann sogar die pulslaengen damit erkennen.

pulslaengen gibts hier beim stromzaehlen nicht, also noch einfacher;) so muss man wirklich nur die S0-ausgaenge (zumind. fuer 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

das kann man dann direkt z.b. mit einem usb2serial adapter/kabel abgreifen, oder auf eine echte serielle schnitstelle geben, so man noch hat;)

also: SWISSNOX klemme 21 muss mit RS232 Rx (pin 2 auf DSUB-9) und klemme 20 mit RTS (pin 7 auf DSUB-9) verbunden werden, der rest (230V) wie gehabt.

man kann dazu direkt zwei aufgebogene bueroklammern verwenden und die mit hilfe eines „gender changer“ (weiblich/weiblich) direkt in die RS232-verbindung stecken, oder etwas bequemer (wenn man noch 2 weitere puero klammern und 2 krokoklemmen kabel uebrig hat…).

alternativ kann man auch die reste einer original microsoft seriellen maus endlich zu was vernueftigem verwenden und damit den anschluss an den usb/seriell adapter machen (bei mir: orange=Rx, weiss=RTS).

software

das auswerten wird von vzlogger direkt unterstuetzt!
alternativ, und/oder zum testen, bietet sich folgendes an:

software: serielle schnittstelle richtig konfigurieren (50 baud, jedes zeichen sofort ausgeben, …)

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

und schon kann man die daten wie gewuenscht lesen. doch wie an einen „guten“ time stamp kommen, wenn man kein C o.ae. programmieren will ? z.b. so:

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

und um das ganze besser beurteilen und verdauen zu koennen, noch ein bissl test code dazu:

     ( 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 puls, und dann noch den gesamten strace-output mit original timestamp.

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?!):

	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

aber die lassen sich ja leicht wegfiltern, z.b. mit

grep 'read(0, "\\0", 4096)'

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;)

     ( 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=\"" t " # >& /dev/null"); }'

und schon fuellt sich die datenbank!

hardware/controllers/s0-an-rs232.1325544464.txt.gz · Zuletzt geändert: 2012/01/02 23:47 von r00t