Hallo, da ich die S0-Impulse von ca. 20 Zählern auswerten möchte, bin ich an der absoluten Minimalbeschaltung interessiert, die zulässig ist bzw. zuverlässig funktioniert und sich im Rahmen der Spezifikation bewegt. Letztendlich sollen die Daten bei einem Raspberry Pi landen, der sie dann kumuliert in eine Datenbank (Influx) schreibt und schöne Graphen darstellt (Grafana, volkszähler.org). Leider hat der Raspi nicht genug GPIO-Pins, um alles direkt anzuschließen, sodass ich wohl oder übel Umwege gehen muss. Aktuell denke ich an ein AVR, der die Impulse entprellt und zählt und sie via UART, SPI oder I2C an den Raspberry übergibt. Software-technisch ist es prinzipiell kein Problem, allerdings habe ich hardware-seitig noch einige Fragen: Die Zähler selbst implementieren laut Datenblatt DIN EN 62053-31, Klasse A und sind durch einen Optokoppler potenzialfrei. Sie vertragen bis zu 27 V und 20 mA [0]. Nach ein wenig Recherche scheint es nicht unüblich zu sein die S0-Ausgänge direkt an VCC bzw. einen GPIO-Pin zu hängen (Raspberry Pi und/oder AVR) (siehe z.B. [1]): Hierbei sehe ich aber mehrere Probleme: - Spannung: Zumindest der Raspberry Pi arbeitet intern mit 3.3 Volt, die S0-Schnittstelle benötigt aber wohl mindestens 5 Volt (habe ich irgendwo gelesen, im Datenblatt steht hierzu leider nichts). Die stehen auf der GPIO-Leiste zwar auch zur Verfügung, letztendlich liegen dann am Eingangs-Pin aber 5V an. Man verlässt sich also auf die internen Schutzdioden, die im Falle vom Raspberry leider nur dürftig dokumentiert sind. Einen AVR hingegen kann man direkt mit 5 Volt betreiben bzw. sich auf die internen Schutzdioden verlassen (siehe AVR182, da liegt Netzspannung an). - Strom: Ohne Vorwiderstand wird mit jedem Impuls doch der max. Strom überschritten. Funktionieren tut es wohl in den meisten Fällen trotzdem (laut diverser Blog- und Foren-Beiträgen, etc.). Verlässt man sich hierbei darauf, dass der Impuls kurz genug ist (ca. 30ms)? Wie sieht es bei vielen Impulsen pro Sekunde aus. Wird das dann auch noch zuverlässig funktionieren, oder geht hier irgendwann etwas kaputt? Zumindest ein Vorwiderstand in der Größenordnung 1kOhm erscheint mir sinnvoll? Vielleicht ist dieser aber bereits intern verbaut und ich verstehe das Datenblatt falsch. Dort heißt es nämlich: > Impulsausgang S0 nach DIN EN 62053-31 - Kl. A > potenzialfrei durch einen Optokoppler, > max. 27V DC / 2OmA Heißt das, dass bei 27V 20mA fließen, also ein interner Widerstand von ~ 1350 kOhm dazwischen geschaltet ist, oder muss ich mit einem externen Widerstand sicherstellen, dass höchstens 20 mA fließen können? Wieder andere Schaltungen arbeiten auch auf der Controller-Seite mit Optokopplern [2]. So auch der Wiki-Beitrag von mikrocontroller.net (siehe [2]). Das wiederum erscheint mir sehr viel Overhead zu sein, immerhin ist ja der Zähler selbst schon potenzialfrei durch den internen Optokoppler. Wird der zweite Optokoppler (auf Seiten des Mikrocontrollers) nur dafür benötigt, um die anliegenden 24 Volt "umzuwandeln", oder soll das ein zusätzlicher Schutzmechanismus sein? Vielen Dank! [0]: http://bg-etech.de/download/manual/DRS155DCV3.pdf [1]: https://blog.webernetz.net/2014/10/13/stromzahler-mit-s0-schnittstelle-vom-raspberry-pi-auswerten/ [2]: https://www.mikrocontroller.net/articles/S0-Schnittstelle
:
Bearbeitet durch User
Karol B. schrieb: > Letztendlich sollen die Daten bei einem Raspberry Pi landen, der sie > dann kumuliert in eine Datenbank (Influx) schreibt und schöne Graphen > darstellt (Grafana, volkszähler.org). Leider hat der Raspi nicht genug > GPIO-Pins, um alles direkt anzuschließen, sodass ich wohl oder übel > Umwege gehen muss. Wie wäre es, die Eingänge des Rechenboliden mit einem simplen Schieberegister zu erweitern? > Aktuell denke ich an ein AVR, der die Impulse entprellt und zählt und > sie via UART, SPI oder I2C an den Raspberry übergibt. Ein Multicontrollersystem. Sowas würde ich aus Sicht der langfristigen Softwarepflege solange als irgend möglich verhindern... > Heißt das, dass bei 27V 20mA fließen, also ein interner Widerstand von ~ > 1350 kOhm dazwischen geschaltet ist Das sind die Daten, die der Ausgang MAXIMAL verträgt. > oder muss ich mit einem externen > Widerstand sicherstellen, dass höchstens 20 mA fließen können? Ja. Und im Idealfall bleibst du weit weg von den MAXIMALWERTEN!
:
Bearbeitet durch Moderator
Lothar M. schrieb: >> Heißt das, dass bei 27V 20mA fließen, also ein interner Widerstand von ~ >> 1350 kOhm dazwischen geschaltet ist > Das sind die Daten, die der Ausgang MAXIMAL verträgt. Nicht ganz. Das ist im Prinzip eine auf zwei digitale Werte reduzierte 0-20mA Stromschleife. Zum Auswerten braucht man einfach einen Bürdewiderstand. MfG Klaus
Hallo, Lothar M. schrieb: > Wie wäre es, die Eingänge des Rechenboliden mit einem simplen > Schieberegister zu erweitern? Ja, das ist natürlich auch denkbar. Wobei es dann mit dem Entprellen (sofern überhaupt notwendig) schwieriger wird, da zeitkritisches Programmieren mit dem Raspberry ja eher schwierig ist. Müsste man mal gucken, wie gut sich das über SPI lösen lässt. > Das sind die Daten, die der Ausgang MAXIMAL verträgt. > Ja. Und im Idealfall bleibst du weit weg von den MAXIMALWERTEN! Das wollte ich hören ;). Das heißt ja, dass ich mich mit 5 Volt im sicheren Bereich bewege und es zumindest zu keinen Beschädigungen kommen kann und ich auf die externen Widerstände verzichten kann. Schade, dass ein AVR keine Pull-Down Widerstände eingebaut hat :'(. Mit freundlichen Grüßen, Karol Babioch
:
Bearbeitet durch User
Lothar M. schrieb: > Wie wäre es, die Eingänge des Rechenboliden mit einem simplen > Schieberegister zu erweitern? > >> Aktuell denke ich an ein AVR, der die Impulse entprellt und zählt und >> sie via UART, SPI oder I2C an den Raspberry übergibt. > Ein Multicontrollersystem. Sowas würde ich aus Sicht der langfristigen > Softwarepflege solange als irgend möglich verhindern... So unterschiedlich können die Meinungen sein. Für diese Aufgabe würde ich nie etwas anderes in Erwägung ziehen. Hier geht es darum Impulse zu zählen und zwar alle. Die Zählerstände müssen auch gesichert werden wenn der Strom ausfällt. Ob interes EEPROM oder Fram über i2c, irgendetwas in der Art wird wohl nötig sein um das sicher zu stellen. Für einen µC eine überschaubare Aufgabe die nach kurzer Zeit fertig entwickelt ist. Anders als beim Raspi, der alle Tage neue Updates braucht oder mal 10ms oder mehr irgendwo hängt und dadurch die Impulse verschläft. Ganz schlaue kämem jetzt auf die Idee ein Kernel-Modul dafür zu bauen... Als Verbindung kämen bei mir nur Ethernet, RS485 oder CAN in Frage. Vorzugsweise CAN, da kann der µC seine Messwerte alle Nase lang auf den Bus senden und fertig. Ob da dann ein Raspi die Messwerte verarbeitet oder ein anderer Rechner(Task auf einem sowieso laufenden NAS) spielt dann überhaupt keine Rolle mehr. Als CAN-Interface für den Raspie und jeden anderen Windows-, Linux- oder OSX-Rechner würde ich das USBtin http://www.fischl.de/usbtin/ verwenden. Das spart die Bastelei am Raspi.
Karol B. schrieb: > Das wollte ich hören ;). Das heißt ja, dass ich mich mit 5 Volt im > sicheren Bereich bewege und es zumindest zu keinen Beschädigungen kommen > kann und ich auf die externen Widerstände verzichten kann. Schade, dass > ein AVR keine Pull-Down Widerstände eingebaut hat :'(. Was soll den der Quark bedeuten? Die S0-Ausgänge sind potentialfreie Optokoppler-Ausgänge. Die kannst du zwischen GND und AVR-Eingang schalten und den Pull-Up an. Damit ist kein weiterer Widerstand nötig. Jedenfalls vom Prinzip her. Ob lange Leitungen zu den Zählern ungeschützt am Port ausreichend sind hängt von deinen Gegebenheiten ab. Ich würd's nicht machen.
temp schrieb: > Was soll den der Quark bedeuten? Die S0-Ausgänge sind potentialfreie > Optokoppler-Ausgänge. Ganz so einfach ist es nicht.
Hallo, temp schrieb: > Die kannst du zwischen GND und AVR-Eingang > schalten und den Pull-Up an. Damit ist kein weiterer Widerstand nötig. Stimmt, ich wollte das anders herum machen, aber so herum macht das mit den internen Pull-Ups natürlich viel mehr Sinn ;). H.Joachim S. schrieb: > Ganz so einfach ist es nicht. Warum nicht :-)? Was für Bedenken hast du?
Die S0-Impulse von ca. 20 Zählern auswerten ist kein Hardwareproblem. S0 Schnittstellen bezieht sich auf ein Standart und somit indirekt auf den Impulsausgang der Zähler. Kannst nichts falsch machen wenn Du von deiner Hardware GND -> S0 abfragst. Ja mit ATMega 644p und 8 x I2C Expander PCF8574 schon getestet (64 Zähler). Weiterleitung mit UART. Da die Eingangspin mit Impuls vom Zähler auf GND gezogen werden, muss VCC nicht TTL sein. Die Eingänge müssen ein Pullup habe. Mehr ist nicht nötig. Gruß
Karol B. schrieb: > Warum nicht :-)? Was für Bedenken hast du? Kann funktionieren, muss aber nicht (oder nicht immer) Manche S0-Geber verwenden ein life-zero-Signal, um Kabelbruch erkennen zu können. Einige haben auch mit nur 5V Versorgung und etwas längeren Leitungen ihre Probleme. Die Norm sagt: <2mA bzw >10mA sind korrekte Zustände. Man kann vieles anders machen als vorgesehen, man kann es aber auch richtig machen.
H.Joachim S. schrieb: > Die Norm sagt: <2mA bzw >10mA sind korrekte Zustände. Soweit klar. > Man kann vieles anders machen als vorgesehen, man kann es aber auch > richtig machen. Ok, was schlägst du dann vor? Höhere Spannungen? Externe Widerstände? Welche Werte (ca.)? Mit freundlichen Grüßen, Karol Babioch
Das Live-Zero-Blabla würde ich mal schlicht vergessen! Ist so ein modernes Märchen, wie die "Spinne in der Yucca- Palme (R)", die mit der S0-Schnittstellendefinition eben mal NICHT definiert ist. Wichtig ist: ON-Time >= 30 ms und OFF-Time >= 30 ms. Damit ist die Entprellung gut definiert: Abstände von gleichsinnigen Flanken < 50 ms sind Störpulse. Wenn du dem Standard PullUp deines Lieblings-µC den passenden Kondensator gen Masse für tau ~= 10 ms spendierst, sollte die hoffentlich vorhanden Schmitt-Trigger- Funktion deines Lieblings-µCs für saubere Pulse sorgen. So ein Zähler hat seine Ober- und Untergrenze, was er erfassen kann - und der Konstrukteur sorgt dafür, dass bei konstruktiv erlaubten Werten die Pulszeiten passen. Die Relation Pulse / Messeinheit ist beim Zähler fest vorgegeben und kann ermittelt, oder nachgelesen werden. Die Spannung 15 V / 27 V ist der Wert, ab dem der S0-Ausgang zerstört werden kann. Mit 3,3 V, oder 5 V geht da nix kaputt.
Lothar M. schrieb: > Das sind die Daten, die der Ausgang MAXIMAL verträgt. Nein, das sind die Werte die die DIN EN verlangt. Die Optokoppler-Ausgänge der S0-Quellen vertragen weit mehr. > Die Spannung 15 V / 27 V ist der Wert, ab dem der S0-Ausgang > zerstört werden kann. Mit 3,3 V, oder 5 V geht da nix kaputt. Typisch. Einer plappert was falsches vor und alle springen drauf an. Lest die DIN EN 62053-31 bevor ihr hier Quatsch verbreitet. Das gilt auch für Moderatoren. Mit 3,3V arbeitet überhaupt kein Zähler-Ausgang und mit 5V sehr wenige. Abgesehen von dem beschissenen Störabstand, der schon durch Störimpulse beim Einschalten von Licht überschritten wird und zu Fehlzählungen führt.
Ich habe 3 S0 Zaehler in Einsatz an meine Raspberry 2, einfach direct auf den GPIO mit Pullup (3.3 V). Functioniert einwandfrei. Es geht um diese Zaehler : http://bg-etech.de/os/product_info.php?products_id=173 Auch eine C ist nicht verbaut. Die Zaehler wirden in ein Python sketch gepollt.
... schrieb: > Mit 3,3V arbeitet überhaupt kein Zähler-Ausgang und mit 5V sehr wenige. Erzähl doch mal, was das mit einem potentialfreien Ausgang zu tun hat. Du bist nach eigenen Angaben ja sehr belesen und kannst das daher sicherlich anschaulich darlegen.
RP6conrad schrieb: > ch habe 3 S0 Zaehler in Einsatz an meine Raspberry 2, einfach direct > auf den GPIO mit Pullup (3.3 V). Functioniert einwandfrei. Es geht um > diese Zaehler : http://bg-etech.de/os/product_info.php?products_id=173 > Auch eine C ist nicht verbaut. Die Zaehler wirden in ein Python sketch > gepollt. Auch der BG-Zähler arbeitet nicht mit 3,3V. Drei Zähler am Raspberry durch pollen der Eingänge abfragen? Sorry, aber du erzählst Mist.
Lutz schrieb: > ... schrieb: >> Mit 3,3V arbeitet überhaupt kein Zähler-Ausgang und mit 5V sehr wenige. > > Erzähl doch mal, was das mit einem potentialfreien Ausgang zu tun hat. Zum Erfassen der Impulse musst du ja wieder einen Bezugspunkt herstellen. Meine Aussage, die du zitierst bezieht sich auf Ausgänge von Zählern. Die haben i.d.R. einen Optokoppler als S0-Ausgang verbaut. Bei einem Reed-Kontakt, der häufig bei Gas-Zähler und Wasserzähler verbaut ist, funktioniert es natürlich mit 3,3V oder 5V, wobei aber auch immer noch der Störabstand sehr schlecht ist.
... schrieb: > Nein, das sind die Werte die die DIN EN verlangt. Die > Optokoppler-Ausgänge der S0-Quellen vertragen weit mehr. > >> Die Spannung 15 V / 27 V ist der Wert, ab dem der S0-Ausgang >> zerstört werden kann. Mit 3,3 V, oder 5 V geht da nix kaputt. > > Typisch. Einer plappert was falsches vor und alle springen drauf an. > > Lest die DIN EN 62053-31 bevor ihr hier Quatsch verbreitet. Kann ich nur bestätigen. S0 ist ein Datenübertragungsstandard und wird auch so bei allen mir bekannte Stromzähler so bezeichnet die diese Schnittstelle haben. Somit erkennt man schon mal die Belastbarkeit. Sind aber immer potentialfreie Schalter(meist Optokoppler). Also ist die Spannung VccPin des „Empfänger“ Wurst wenn der Schalter diese auf GND zieht. Somit sind wohl auch die Störungen nicht das Hauptthema. Kenne keinen Funken oder was auch immer der/das Signal GND liefert. Hatte ich aber am 20.06.2017 schon grob beschrieben. Gruß
... schrieb: > Auch der BG-Zähler arbeitet nicht mit 3,3V. > Drei Zähler am Raspberry durch pollen der Eingänge abfragen? > Sorry, aber du erzählst Mist. Ich kann nur sagen das es functioniert, lauft seit 2 Jahren so. Den Pulslaenge ist minimal 30 ms, so mit pollen kann die Flanke problemlos erfasst werden. Wo ist dan den Mist ?
RP6conrad schrieb: > Ich habe 3 S0 Zaehler in Einsatz an meine Raspberry 2, einfach direct > auf den GPIO mit Pullup (3.3 V). Kleine correction, es ist ein PullDown verbaut !! Den Optocoupler schaltet naturlich die +3.3 V durch !!
RP6conrad schrieb: > so mit pollen kann die Flanke problemlos > erfasst werden. Du kennst den Unterschied zwischen: "auf eine Flanke pollen" und "eine Flanke per Interrupt erfassen"?
RP6conrad schrieb: > Den > Pulslaenge ist minimal 30 ms, so mit pollen kann die Flanke problemlos > erfasst werden. Wo ist dan den Mist ? Mit welcher Frequenz pollst du das Ganze denn? Ich habe diesbezüglich mal mit dem Support von bg-etech korrespondiert und folgende Antwort erhalten: > die funktion der S0 Schnittstelle wird auch mit 5V sichergestellt bei 3,3V können wir keine aussage treffen, > die Strombelastbarkeit wird durch den Optokopller festgelegt welcher mit maximal 24mA belastet werden darf. ... schrieb: > Du kennst den Unterschied zwischen: "auf eine Flanke pollen" und "eine > Flanke per Interrupt erfassen"? Worauf genau möchtest du hinaus? Die Problematik mit geprellten Signalen bei Interrupts? Mit freundlichen Grüßen, Karol Babioch
In mein Verstandniss ist pollen nicht anderes als in der Ablaufschleife die Eingangen abfragen. Wenn du eine Flanke sucht, speicheren sie die forherige Zustand und vergleichen sie das. Forauszetsung : die Pulsdauer muss langer sein dan die Schleife durchlaufzeit, oder du verpasst die Flanke. Ein Interrupt ist etwas anders : In hardware wird eine Aenderung erfasst, dan wird sofort in eine Interrupt Handler gesprungen. Hier macht den durchlaufzeit von die Hauptschleife nichts aus, oder die Puls gesehen werd ist nur noch abhangig von Hardware.
Karol B. schrieb: > Mit welcher Frequenz pollst du das Ganze denn? Diese Python Sktech hat nur 175 Linien, da braucht der PI einige ms (habe es nicht vermessen). Aber das Betriebssystem unterbricht den Python sketch regelmassig, kann bis zu 10 ms dauern das in Sketch nichts lauft ! Darum mussen diese Flanken minimal 10 ms Laenge haben ! Der Python sketch finden sie in Anhang.
Karol B. schrieb: > Worauf genau möchtest du hinaus? Die Problematik mit geprellten Signalen > bei Interrupts? "geprellte Signale" hahaben nichts mit Polling oder Interruptabfrage zu tun. Wenn man auf eine Flanke pollt macht der Prozessor nichts anderes mehr und ist blockiert. Was wenn die Flanke erst nach einer halben Stunde kommt?
RP6conrad schrieb: > In mein Verstandniss ist pollen nicht anderes als in der Ablaufschleife > die Eingangen abfragen. Wenn du eine Flanke sucht, speicheren sie die > forherige Zustand und vergleichen sie das. Forauszetsung : die Pulsdauer > muss langer sein dan die Schleife durchlaufzeit, oder du verpasst die > Flanke. Ja, und wenn die Flanke erst nach einer halben Stunde kommt macht der Prozessor nichts mehr anderes.
... schrieb: > Ja, und wenn die Flanke erst nach einer halben Stunde kommt macht der > Prozessor nichts mehr anderes. Nein !!! So geht das nicht. Ein kleines Beispiel : If ((GPIOx=HIGH) AND (Last_State=LOW)) Flank_Detection=HIGH; Last_State=GPIOx; Sobald eine steigende Flanke forliegt von GPIOx wird Flank_Detection "HIGH", aber nur für einen Durchlauf ! Da wird nichts gewartet, den Ablauf lauft einfach weiter. Aber diese Stelle muss naturlich innerhalb die Pulsdauer zweimal durchlaufen werden !! Sag ihre Hauptablauf dauert 20 ms, muss die Pulslaenge minimal 20 ms sein, oder du verpasst die Flanke.
weiss garnicht was ihr da für ein aufwand macht, hier mal mein python bastelei, klappt seit einigen jahren sehr gut. import RPi.GPIO as GPIO import time # SoC als Pinreferenz waehlen GPIO.setmode(GPIO.BCM) # Pin 3 vom PI Input deklarieren und Pull-Down Widerstand aktivieren fuer Gas Sensor GPIO.setup(2, GPIO.IN) #InterruptGas def InterruptGas(channel): global CounterGas global CounterHeuteGas CounterGas = CounterGas + 1 CounterHeuteGas=CounterHeuteGas+1 x=CounterGas*0.6 # Interrupt Event hinzufuegen. Pin 3 ( GPIO2 ), auf steigende Flanke reagieren und ISR "Interrupt" deklarieren GPIO.add_event_detect(2, GPIO.RISING, callback = InterruptGas, bouncetime = 200) while True: time.sleep(1) print "\033[14;44H"+str(CounterGas)+ " "
@ Loran (Gast) Sowas ähnliches hab ich vor einigen Monaten zu einer ähnlichen Frage auch schon mal geschrieben. Aber Legenden sind schnell in die Welt gesetzt. Sind die erst mal in der Welt, ist die "kollektive Einfalt" stärker, als die "kollektive Intelligenz" je sein wird...
Ich habe mal diese S0-pulsen vermessen mit ein Oscilloscoop. Beschalting war gans einfach : +3.3V an S0-schnittstelle, ausgang S0 mit 6 k pull down an Eingangs pin von Raspberry. Ich habe zwei verschiedene S0 von BG-Etech, ein mit 1000 imp/kWh, eine andere mit 2000 imp/kWh. Den erste hat eine Pulslaenge von 70 ms, der andere von 30 ms. Spannungsabfall in optocoupler ist ca 600 mV, bleibt noch 2.7 V ubrig an Eingangspin. Das ist genug um der Puls sicher zu erkennen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.