Jump to content

Gaszähler, Elektrizitätszähler, Wärmezähler und Wasserzähler (S0-Schnittstelle)


Recommended Posts

Die "S0"-Schnittstelle ist ein nach EN 62053-31 definierte Schnittstelle zum Austausch von Messwerten. Pro Verbrauchseinheit – die Verbrauchseinheit und die Größe der Verbrauchseinheit unterscheidet sich je nach Gerät – wird ein Impuls ausgelöst. Diese Impulse können mit Produkten von Tinkerforge ausgewertet werden.

Am besten eignet sich dafür das „IO16-Bricklet“. Der „S0+“-Anschluss wird mit einem Pin verbunden, der auf "input" mit "pull-up" eingestellt ist und der „S0-"-Anschluss wird mit GND oder mit dem äquivalenten "output only" Minuspol verbunden. Dabei sollte das "IO16"-Bricklet" auf 5 Volt gestellt werden. Wichtig ist, dass die Anschlüsse nicht vertauscht werden. Immer wenn ein Impuls ausgelöst wird, wechselt der Eingangspin von "high" auf "low" ("low" bleibt mindestens 30 ms erhalten) und wechselt dann wieder auf "high".

Natürlich lassen sich auch noch andere Bricklets benutzen ("Analog In Bricklet", "Industrial Digital IN 4", ...). Auf diese "Bricklets" werde ich jedoch nicht näher eingehen, wichtig ist nur, dass der Impuls erfasst wird.

Intern ist der Ausgang ein offener Kollektor (open collector) eines Transistors, der einem Optokoppler nachgeschaltet ist. Dies bedeutet, dass der zu messende Strom galvanisch vom "Bricklet" getrennt ist.

 

 

Ich habe mir einen Elektrizitätszähler gebaut. Dazu habe ich einen Wechselstromzähler mit S0-Schnittstelle gekauft (Eltako WSZ12DE-32A) und wie beschrieben angeschlossen. Immer wenn das angeschlossene Gerät eine halbe Wattstunde verbraucht hat, wird ein Impuls ausgegeben, der mein „IO16-Bricklet“ registriert (jeder Wechsel von "high" auf "low" symbolisiert eine verbrauchte halbe Wattstunde). Den Wechselstromzähler kann man direkt im Sicherungskasten unterbringen - Achtung im Sicherungskasten liegen mindestens 230 Volt, oftmals auch 400 Volt an, Lebensgefahr, also Wechselstromzähler nur von einem authorisierten Fachmann montieren lassen. Alternativ kann man auch eine Steckdose und ein Stecker an den Zähler montieren lassen und so den Stromverbrauch von Geräten mit Stecker messen.

 

Bei mir hat die Übertragung der Impulse über die Adern eines 55m langen Netzwerkkabel (Draka Datenleitung UC900 SS 23 4P S/FTP PE, Cat.7, schwarz) bei 0° C einwandrei geklappt.

 

Ein Beispielprogramm in Java, dass den durchschnittlichen Verbrauch der letzten 5 Minuten alle 5 Minuten ausgibt (ausgelegt für einen Impuls pro 0,5 W/h).

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;

import com.tinkerforge.BrickletIO16;
import com.tinkerforge.IPConnection;

public class Wattmeter {

private static final String host = "localhost";
private static final int port = 4223;
private static final String UID = "UID"; // Change to your UID

// Counter will be incremented for every 0.5 W/h consumption
// AtomicInteger instead of int to avoid errors - there are two threads
private static AtomicInteger counter = new AtomicInteger();


// Note: To make the example code cleaner we do not handle exceptions. Exceptions you
//       might normally want to catch are described in the commnents below
public static void main(String args[]) throws Exception {
	// Create connection to brickd
	IPConnection ipcon = new IPConnection(host, port);
	BrickletIO16 io16 = new BrickletIO16(UID); 		

	// Add device to IP connection
	ipcon.addDevice(io16); // Can throw IPConnection.TimeoutException
	// Don't use device before it is added to a connection

	// Set the debounce period of the InterruptListener listener to 30ms
	io16.setDebouncePeriod(30);		

	// Add and implement listener for interrupt (called if pin 0 of port a changes)
	io16.addListener(new BrickletIO16.InterruptListener() {
		public void interrupt(char port, short interruptMask, short valueMask) {
			// Increment counter, if pin 0 changes from high to low
			if ((valueMask & 1) == 0) {
				counter.incrementAndGet();					
			}
		}
	});		

	// Enable interrupt on pin 0 of port a
	io16.setPortInterrupt('a', (short) 1);


	// Print every 5 minutes the average consumption out
	new Timer().schedule(new TimerTask() {
		@Override
		public void run() {
			System.out.println(counter.getAndSet(0) / 2 * 12 + " W/h");			
		}
	}, 300_000, 300_000);


	// Ctrl-c terminated the console program
}
}

Link to post
Share on other sites

Hallo Stefan,

 

ich bin selbst kein Experte von SO und wenn ich Blödsinn schreibe möge man mich korregieren. Technisch scheint S0 nichts weiter zu sein wie ein Open-Collector Ausgang, d.h. eine Art Schalter der S0+ und S0- kurzschließt (hierbei unbedingt auf Polung achten). So wie du ihn beschalten hast ist das komplett korrekt.

 

Ein Punkt ist mir noch selber unklar, vielleicht kann er geklärt werden und dann in den Artikel eingebaut werden. "S0-" ist ja an einem negativen Anschluss (GND/Minuspol) angeschlossen und "S0+" ist an einem "input" angeschlossen, ist jetzt der "input" ein positiver Anschluss?

 

S0- ist das Potential gegen das geschalten wird.

S0+ ist offen oder mit SO- verbunden, d.h. du konfigurierst deinen Input als Input Pullup damit dein Eingang immer einen definierten High Pegel hat wenn der "Schalter" nicht geschalten hat. Wenn der Schalter schaltet, dann zieht er den Eingang gegen GND und du hast deinen Low Pegel.

 

Siehe auch hier:

http://de.wikipedia.org/wiki/Open-Collector-Ausgang

Link to post
Share on other sites

Ich habe jetzt, zum besseren Verständnis, hinzugefügt, wie die S0-Schnittstelle intern arbeitet. Außerdem habe ich jetzt eine Warnung hinzugefügt, die Polarität nicht zu tauschen.

 

Vielen Dank batti für das Beantworten der Frage. Ich habe die Frage ein wenig ungenau gestellt. Die S0-Schnittstelle will mindestens an einem 5 Volt Stromkreis angeschlossen werden, d.h. wenn der Eingang auf "low" schaltet, muss zwischen GND und Eingang 5 Volt fließen, ist dies so? Dies wird ja automatisch bedeuten, dass der Eingang, obwohl er "low" anzeigt, positiv "high" ist, oder?

Link to post
Share on other sites

Hallo Stefan,

 

wenn da mindestens 5V benötigt werden, dann wird das mit einem IO4 Bricklet nicht funktionieren (geht nur bis 3.3V). Die IO16 kannst du auf 5V stellen. Eventuell benötigst du dann aber eine Step-Down Powersupply um auf die 5V zu kommen (Ansonsten hast du über USB Versorgt weniger).

 

Alternativ würde ich dir ein Analog In Bricklet oder die Industrial Digital IN 4 empfehlen, weil du hier extern den Pullup gegen irgendetwas höheres schalten kannst.

 

d.h. wenn der Eingang auf "low" schaltet, muss zwischen GND und Eingang 5 Volt fließen, ist dies so?

Wenn der Eingang auf "low" schaltet, dann verbindet er den Eingang mit GND, d.h. die Leitung liegt auf GND (0V). D.h. das der wirklich low ist. Daher solltest du da auch 0V messen.

 

Für den Fall das er auf "high" schaltet, ist der Eingang über den Pullup Widerstand mit 5V verbunden und dein Eingang ist high.

 

 

Wie ist denn der Status deines Projekts? Habe es so verstanden als wenn das alles schon funktioniert.

Link to post
Share on other sites

Ich habe das "IO4-Bricklet" aus meiner Beschreibung herausgenommen. Ich wusste nicht, dass es keine 5 Volt schalten kann (ich habe nur das "IO16-Bricklet")

 

Natürlich lassen sich auch noch andere Bricklets benutzen (Analog In Bricklet, Industrial Digital IN 4, ...). Jedoch denke ich, dass das "IO16-Bricklet" die einfachste Möglichkeit ist.

 

Mein Projekt funktioniert einwandfrei. Ich habe es zwar noch nicht im produktiven Einsatz, da ich das zu messende Gerät erst noch bekomme, jedoch konnte ich andere Geräte, von denen ich den Stromverbrauch kenne, testen.

 

Dann liegt beim Impuls wirlich nur 0 Volt an, trotzdem funktionert es. Ich hatte die Frage nur gestellt, weil es mich interessiert, wie es intern funktioniert.

 

Link to post
Share on other sites
  • 6 months later...

Alternativ würde ich dir ein Analog In Bricklet oder die Industrial Digital IN 4 empfehlen, weil du hier extern den Pullup gegen irgendetwas höheres schalten kannst.

 

Bedeutet dies, dass ich den Eingang von einem Industrial Digital IN4 nicht einfach mit dem S0-Ausgang verbinden kann? Stehe etwas auf dem Schlauch und bin nicht so fit in dem Thema. Dumm gesagt schleife ich externe 5 Volt über den S0-Anschluss an den Eingang von dem Industrial Digital IN4. Richtig?

Link to post
Share on other sites

Ich habe den S0-Anschluss einfach nur an mein IO16-Bricklet angeschlossen (genaue Beschreibung im Anfangspost) und es hat funktioniert. Mit dem Industrial Digital IN4 dürfte dies genauso gehen. Das Industrial Digital IN4 ist galvanisch getrennt und wenn dein Zähler auch galvanisch getrennt ist (sind die meisten S0-Zähler), dürfte theoretisch beim Ausprobieren auch nichts kaputt gehen (ohne Gewähr, ich bitte mich zu korrigieren, wenn dies falsch ist).

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...