Hauptmenü

[FHZ] Modbus

Begonnen von Guest, 15 Februar 2010, 14:11:31

Vorheriges Thema - Nächstes Thema

Guest

Originally posted by: <email address deleted>

Hi Leute,

falls sich einer von Euch mit Modbus auskennt: Gibt's bereits eine
Möglichkeit eine Modbus-Device in fhem zu integrieren? Und/oder: Kann ich
mit einem Modbus-Client überhaupt via Perl kommunizieren?

Danke

andy


--
You received this message because you are subscribed to the Google Groups "FHEM users" group.
To post to this group, send email to fhem-users@googlegroups.com.
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en.

Guest

Originally posted by: <email address deleted>

Also es gibt zumindestens ein perl modul um modbus zu senden und zu
empfangen.

http://search.cpan.org/~cosimo/Protocol-Modbus-0.05/lib/Protocol/Modbus.pm

ob und wie gut das funktioniert weiss ich allerdings nicht.

Gruß,
Thorsten

On 15 Feb., 14:11, Andy Fuchs wrote:
> Hi Leute,
>
> falls sich einer von Euch mit Modbus auskennt: Gibt's bereits eine
> Möglichkeit eine Modbus-Device in fhem zu integrieren? Und/oder: Kann ich
> mit einem Modbus-Client überhaupt via Perl kommunizieren?
>
> Danke
>
> andy

--
You received this message because you are subscribed to the Google Groups "FHEM users" group.
To post to this group, send email to fhem-users@googlegroups.com.
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en.

Guest

Originally posted by: <email address deleted>

Hallo Thorsten,

vielen Dank - das hatte ich zwischenzeitlich schon gefunden - allerdings hat
mich die 0.0.5 abgeschreckt (sowas hört sich für mich immer irgendwie nach
Experimentalversion an ;-))... Und der Kommentar 'Further development will
see the light when there's need and time... I wouldn't be surprised if it
doesn't work for you out-of-the-box.' hört sich auch nicht so richtig
Vertrauens erweckend an.  :-)

Sobald ich Zeit habe, werde ich mal probieren, wie weit ich damit komme...

Falls noch jemand Tipps hat: Nur her damit...

Grüße

andy




On 16.02.10 07:36, "thoweiss" wrote:

> Also es gibt zumindestens ein perl modul um modbus zu senden und zu
> empfangen.
>
> http://search.cpan.org/~cosimo/Protocol-Modbus-0.05/lib/Protocol/Modbus.pm
>
> ob und wie gut das funktioniert weiss ich allerdings nicht.
>
> Gruß,
> Thorsten
>
> On 15 Feb., 14:11, Andy Fuchs wrote:
>> Hi Leute,
>>
>> falls sich einer von Euch mit Modbus auskennt: Gibt's bereits eine
>> Möglichkeit eine Modbus-Device in fhem zu integrieren? Und/oder: Kann ich
>> mit einem Modbus-Client überhaupt via Perl kommunizieren?
>>
>> Danke
>>
>> andy


--
You received this message because you are subscribed to the Google Groups "FHEM users" group.
To post to this group, send email to fhem-users@googlegroups.com.
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en.

Guest

Originally posted by: <email address deleted>

Hallo Andy,

Andy Fuchs schrieb:
> falls sich einer von Euch mit Modbus auskennt: Gibt's bereits eine
> Möglichkeit eine Modbus-Device in fhem zu integrieren? Und/oder: Kann ich
> mit einem Modbus-Client überhaupt via Perl kommunizieren?
>  
Ich habe hier ein Perl-Programm, das per Modbus/TCP mit meiner SPS
spricht. Das ganze benutze ich aktuell noch, um die abgerufenen Daten in
eine DB zu stecken. Ein Interface für FHEM *wollte* ich mal schreiben,
bin aber noch nicht dazu gekommen nach einer art
Grundgerüst/Modul-Template zu suchen.
Soweit ich das sehe benutzt das Perl-Programm nicht die Perl-Modbus-Lib,
sondern was eigenes. Das funktioniert allerdings bei mir schon seit
einem Monat stabil (im Testbetrieb). Nichts hält länger als ein Provisorium.

Eine noch nicht von mir modifizierte Version hänge ich dir hier mal an,
als Ideengeber. Die habe ich irgendwo im Internet gefunden.
Bei mir klappt folgender Aufruf:
modbus_perl_test2.pl -u 1 -r 2 -c 1 -g -s 172.16.2.221 -p 502
wobei:
-u 1 (Unit 1, scheint bei Modbus/TCP uninteressant zu sein)
-r 2 (Register, welcher Wert soll gelesen werden, bei mir ergibt -r2 den
dritten Analog-IN-Wert, -r0 den ersten.)
-c 1 (Count, wie viele Werte sollen in einem Rutsch gelesen werden)
-g  (GET, also nur Werte auslesen)
-s 172.16.2.221 (meine SPS hat diese IP-Adresse)
-p 502 (der genormte TCP-Port für Modbus/TCP ist 502)

Wie du hiermit an die Digitaleingänge und die Ausgänge kommst, hab ich
noch nicht raus gefunden. Aber wie gesagt, ich bin gerade erst am Anfang
der "Problematik" Modbus.

Viele Grüße, Viel Glück
Stefan


#!/usr/bin/perl -w
# Perl Modbus Client

use Socket;
use Getopt::Std;

use vars qw($opt_u $opt_r $opt_c $opt_g $opt_t $opt_h $opt_s $opt_p);

my ($remote, $port, $iaddr, $paddr, $proto, $line, $ans);
my ($ta_id, $prot_id, $unit_id, $mb_fc, $ref, $count, @data);

# Der Client wird flexibel durch Optionen, die es erlauben,
# ihn wie ein klassisches Unix-Tool mit vielen Parametern
# aufzurufen
$unit_id = $opt_u = 1;         # SPS-Station
$ref =     $opt_r = 0;         # Register darauf
$count =   $opt_c = 16;        # Anzahl

Guest

Originally posted by: <email address deleted>

> Andy Fuchs schrieb:
>> falls sich einer von Euch mit Modbus auskennt: Gibt's bereits eine
>> Möglichkeit eine Modbus-Device in fhem zu integrieren? Und/oder: Kann ich
>> mit einem Modbus-Client überhaupt via Perl kommunizieren?
>>  
> Ich habe hier ein Perl-Programm, das per Modbus/TCP mit meiner SPS
> spricht. Das ganze benutze ich aktuell noch, um die abgerufenen Daten in
> eine DB zu stecken. Ein Interface für FHEM *wollte* ich mal schreiben,
> bin aber noch nicht dazu gekommen nach einer art
> Grundgerüst/Modul-Template zu suchen.

Hallo Stefan,

ah schön - ein Mitleid(en)s-Genosse :-)
Was ist eine SPS? (Sorry, aber ich komme aus einer gaaanz anderen Ecke).

> Soweit ich das sehe benutzt das Perl-Programm nicht die Perl-Modbus-Lib,

Die hatte ich noch gar nicht gefunden, oder meintest Du diese:
Protocol::Modbus 0.05?

> sondern was eigenes. Das funktioniert allerdings bei mir schon seit
> einem Monat stabil (im Testbetrieb). Nichts hält länger als ein Provisorium.

Jaja - die Nomenklatur in diesem Bereich lässt schwer zu wünschen übrig,
deshalb ist man wohl erst mal gezwungen zu experimentieren. Ich hab'
mittlerweile einige Implementationen gefunden, wovon die meisten aber schon
seit Jahren nicht mehr gepflegt werden. Das vielversprechendste auf
Perl-Ebene ist wohl Protocol::Modbus 0.05.

Allerdings ist Dein Beispiel auch keine dumme Idee - da muss ich erst
nochmal drüber nachdenken... Die Frage ist, ob es schlau ist, etwas
komplexere Module per CLI anzulegen....

> Eine noch nicht von mir modifizierte Version hänge ich dir hier mal an,
> als Ideengeber. Die habe ich irgendwo im Internet gefunden.
> Bei mir klappt folgender Aufruf:
> modbus_perl_test2.pl -u 1 -r 2 -c 1 -g -s 172.16.2.221 -p 502
> wobei:
> -u 1 (Unit 1, scheint bei Modbus/TCP uninteressant zu sein)
> -r 2 (Register, welcher Wert soll gelesen werden, bei mir ergibt -r2 den
> dritten Analog-IN-Wert, -r0 den ersten.)
> -c 1 (Count, wie viele Werte sollen in einem Rutsch gelesen werden)
> -g  (GET, also nur Werte auslesen)
> -s 172.16.2.221 (meine SPS hat diese IP-Adresse)
> -p 502 (der genormte TCP-Port für Modbus/TCP ist 502)
>
> Wie du hiermit an die Digitaleingänge und die Ausgänge kommst, hab ich
> noch nicht raus gefunden. Aber wie gesagt, ich bin gerade erst am Anfang
> der "Problematik" Modbus.

Nunja... ich hab' das komplette Protokoll für das/mein Device, deshalb
sollte das bei mir zunächst mal nicht das Problem sein. Allerdings wollte
ich versuchen weitestgehendst Standard-Module verwenden. Außerdem ist's
natürlich einfacher einen Daemon laufen zu lassen, als ein CLI via Cron
(oder so) aufzurufen - vor allem, wenn das ganze bi-direktional sein soll.

Ich werde nochmal etwas googeln - vielen Dank aber schon mal für den Tipp;
vielleicht findet sich ja sonst noch was (oder das Protocol::Modubus
funktioniert gut).

Zur Not kann man immer noch auf C ausweichen, aber das wollte ich möglichst
(vor allem aus Zeitgründen) vermeiden.

Grüße

andy


>
> Viele Grüße, Viel Glück
> Stefan
>
> #!/usr/bin/perl -w
> # Perl Modbus Client
>
> use Socket;
> use Getopt::Std;
>
> use vars qw($opt_u $opt_r $opt_c $opt_g $opt_t $opt_h $opt_s $opt_p);
>
> my ($remote, $port, $iaddr, $paddr, $proto, $line, $ans);
> my ($ta_id, $prot_id, $unit_id, $mb_fc, $ref, $count, @data);
>
> # Der Client wird flexibel durch Optionen, die es erlauben,
> # ihn wie ein klassisches Unix-Tool mit vielen Parametern
> # aufzurufen
> $unit_id = $opt_u = 1;         # SPS-Station
> $ref =     $opt_r = 0;         # Register darauf
> $count =   $opt_c = 16;        # Anzahl übertragener Register
>            $opt_g = 0;         # Anforderung zum Lesen
>            $opt_t = 0;         # Anforderung zum Schreiben
>            $opt_h = 0;         # Anforderung der Hilfe
> $remote =  $opt_s = 'server';  # IP-Name des Servers
> $port =    $opt_p = 502;       # Port-Nummer
>
> getopts('u:r:c:gths:p:'); # Abfrage der Parameter
>
> if ($opt_h)  {
> # Netterweise eine Gebrauchsanweisung
>   print "\n usage: $0 [-u unit(1)] [-r register(0)] [-c count(16)]\n",
>           "         [(-g et)|-t ransmit] [-h elp]\n",
>           "         [-s server(yak)] [-p port(502)]\n\n";
>   exit;
> }
>
> # Welche Optionen sind eingegeben worden?
> $unit_id = $opt_u;
> $ref =     $opt_r;
> $count =   $opt_c;
> $remote =  $opt_s;
> $port =    $opt_p;
>
> $mb_fc = 3;
> if ($opt_t) {
>   unless ($opt_g) {
> #   wenn nicht lesen, dann schreiben
>     $mb_fc = 16;
>     @data = @ARGV;
>     $count = $#data + 1;
>   }
> }
>
> $ta_id = 4;   # beliebig
> $prot_id = 0;  #    " - aber in Anlehung an die Portnummer
>
> # Verbindungsdaten festlegen
> if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
> die "No Port" unless $port;
> $iaddr = inet_aton($remote) or die "No Host: $remote";
> $paddr = sockaddr_in($port, $iaddr);
> $proto = getprotobyname('tcp');
>
> #while ( 1 ) {
> # dieser Client hält eine dauernde Verbindung zum Server
> # dies erlaubt die kontinuierliche Beobachtung der Simulation
>   socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
>   connect(SOCK, $paddr) or die "connect: $!";
>  
> # Netzwerkverbindung und Terminalausgabe ungepuffert.
>   select SOCK;
>   $| = 1;
>   select STDOUT;
>   $| = 1;
>  
> # Request formulieren (binär!)
>   $line = pack "nnnCCnn", $ta_id, $prot_id, 6, $unit_id, $mb_fc, $ref, $count;
>  
>   if ( $mb_fc == 0x10 ) {
> #   binär kodieren - Big Endian
>     $line .= pack 'Cn*', 2*$count, @data;
>   }
>  
> # und absenden
>   send SOCK, $line, 0;
>  
> # ein wenig Geduld zeigen - hier 100 msec
>   select(undef, undef, undef, 0.2);
> # und auf Antwort warten
>   next unless defined(recv SOCK, $ans, 6+3+2*$count, 0);
> # Wenn der Server die Verbindung nicht schließt, dann tun wir das
>   close (SOCK);
> # und bereiten die Ausgabe vor
>   my $header = substr($ans, 0, 6);
>   my ($tid, $prid, $hilen, $lolen) = unpack 'nnCC', $header;
>   my ($unit, $fc, $bc) = unpack 'C*', substr($ans, 6, 3);
> # binär dekodieren
>   @data = unpack 'n*', substr($ans, 9);
>   my $len = 0x100 * $hilen + $lolen;
>   #####print "Unit $unit(Ref $ref): ";
>   foreach (@data) {
>     if ( $_ >= 3000 ) {
>      $temp = $_ - 65536;  # letzter Bit verdrehen
>     } else {
>      $temp = $_;
>     }
>     $temp = $temp/10;
>     printf "%5.2f", ($temp);
>     #printf "%5d", $_;
>   }
>   print "\n";
>   if ( $mb_fc == 0x10 ) {
> #   wenn wir nur geschrieben haben, Schluß
>     exit;
>   }
> #}
> exit;
> # That's it
>
>
>
>  
>
>
>


--
You received this message because you are subscribed to the Google Groups "FHEM users" group.
To post to this group, send email to fhem-users@googlegroups.com.
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en.

Guest

Originally posted by: <email address deleted>

Servus Andy,

Andy Fuchs schrieb:
> ah schön - ein Mitleid(en)s-Genosse :-)
>  
Ich denke schon, ja :-)

> Was ist eine SPS? (Sorry, aber ich komme aus einer gaaanz anderen Ecke).
>  

Kein Problem. Eine SPS (Speicher-Programmierbare-Steuerung) ist eine in
Fachkreisen als SPS bekannte Mobular aufgebaute Steuerung. Die besteht
eigentlich immer aus einem Rechner, der zumeist per Buslösung irgendwo
angebunden ist (aber auch alleinstehend gut funktioniert), und modular
hinzugefügte Baugruppen enthält. Da gibt es Baugruppen mit 2-16
Digitalausgängen (meistens 24V=, die dann direkt ein Relais schalten
kann), es gibt Baugruppen mit 2-16 Digital-Eingängen, Analogaus- und
eingang, und ein paar Spezialklemmen für diverse Aufgabenstellungen. Die
bei mir aufgebaute SPS ist bestückt mit einem 4DO
(Digital-Ausgang)-Modul, das schaltet Wasser-Pumpen im Heizungs- und
Solarkreis der Heizung, eine 4DI (Digital-Eingang) für die Überwachung
von ein paar Tastern, und drei mal Temperaturmessbaugruppe, die per
PT1000 die Temperatur von zwei Wasserspeichern, Solarplatten, und
Aussentemperatur überwacht.
Als mögliche Schnittstelle dieser meiner SPS existieren ein paar
Varianten mit Modbus als Anschluss, diesen gibt es in drei Ausführungen
(und ich glaub 1000 Variationen). Die Haupt-Ausführungen sind Seriell
auf RS232-Basis (1:1-Verbindung), auf RS485-Basis (1:n-Verbindung), und
auf Basis von Netzwerk (Ethernet, 10/100 MBit, auch 1:n, das heißt dann
Modbus/TCP).
Und die sechs möglichen Temperaturwerte wollte ich auch mal per FHEM
auslesen. Nur da ich kein Modul-Template gefunden habe, und nicht die
Zeit hatte, ein anderes Modul zu zerlegen, hab ich das erstmal als
laufenden Task innerhalb eines Screens laufen, der beim Systemstart
wieder anläuft. Klar, das ist nicht schön, aber klappt wie gesagt seit
einem Monat ohne mängel.

> seit Jahren nicht mehr gepflegt werden. Das vielversprechendste auf
> Perl-Ebene ist wohl Protocol::Modbus 0.05.
>  
Klar wäre ein in Perl gepflegtes Protokoll besser als meine
Socket-Lösung. Da ich in Perl aber noch nicht sehr fitt bin, muss ich
mich erstmal mit dem begnügen, was ich finde und soweit für mich
Anpassen kann. Und das war meine Socket-Lösung, die ich im vorigen Post
angehängt hatte.

> Nunja... ich hab' das komplette Protokoll für das/mein Device, deshalb
> sollte das bei mir zunächst mal nicht das Problem sein. Allerdings wollte
> ich versuchen weitestgehendst Standard-Module verwenden. Außerdem ist's
> natürlich einfacher einen Daemon laufen zu lassen, als ein CLI via Cron
> (oder so) aufzurufen - vor allem, wenn das ganze bi-direktional sein soll.
>  
Das bedeutet, du möchtest per Modbus auch Befehle in dein Device
stecken, das das dann auszuführen hat?
Das kann meine SPS auch, ich hab das aber noch nie Probiert. Da dort ja
ein Programm läuft, und die Digital-Ausgänge von sich aus Steuert,
wollte ich ihm da auch nicht dazwischenfunken.
Theoretisch sollte meine Lösung mit deinem Device auch klappen, da
Modbus ein sehr einfaches Protokoll ist, das aber genormt und daher bei
allen Geräten gleich sein sollte. Ob es das wirklich ist, müsste
getestet werden :-)

Viele Grüße
Stefan

--
You received this message because you are subscribed to the Google Groups "FHEM users" group.
To post to this group, send email to fhem-users@googlegroups.com.
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en.

Guest

Originally posted by: <email address deleted>

On 16.02.10 22:14, "Stefan" wrote:

> Klar wäre ein in Perl gepflegtes Protokoll besser als meine
> Socket-Lösung. Da ich in Perl aber noch nicht sehr fitt bin, muss ich
> mich erstmal mit dem begnügen, was ich finde und soweit für mich
> Anpassen kann. Und das war meine Socket-Lösung, die ich im vorigen Post
> angehängt hatte.

Hi Stefan,

die Socket-Lösung ist sicher zum Testen auch nicht schlecht... Mal sehen.

Vielen Dank für die umfangreiche SPS-Erklärung - man lernt nie aus.
 
>> Nunja... ich hab' das komplette Protokoll für das/mein Device, deshalb
>> sollte das bei mir zunächst mal nicht das Problem sein. Allerdings wollte
>> ich versuchen weitestgehendst Standard-Module verwenden. Außerdem ist's
>> natürlich einfacher einen Daemon laufen zu lassen, als ein CLI via Cron
>> (oder so) aufzurufen - vor allem, wenn das ganze bi-direktional sein soll.
>>  
> Das bedeutet, du möchtest per Modbus auch Befehle in dein Device
> stecken, das das dann auszuführen hat?

Ja.

> Das kann meine SPS auch, ich hab das aber noch nie Probiert. Da dort ja
> ein Programm läuft, und die Digital-Ausgänge von sich aus Steuert,
> wollte ich ihm da auch nicht dazwischenfunken.
> Theoretisch sollte meine Lösung mit deinem Device auch klappen, da
> Modbus ein sehr einfaches Protokoll ist, das aber genormt und daher bei
> allen Geräten gleich sein sollte. Ob es das wirklich ist, müsste
> getestet werden :-)

Ich hab' weniger Sorgen wegen der Komplexität, sondern wegen meiner Ahnung
von der Materie :-)... Ich bin bislang noch nie mit Modbus in Berührung
gekommen und was man so findet hört sich alles ziemlich verwirrend an.
Mittlerweile hab' ich allerdings schon ein paar Sachen - zumindest gesehen -
und das größte Problem bei der Sache scheint die
Little/BigEndian-Problematik zu sein, und das alles in die richtigen
Register kommt. Achja... für den Moment interessiere ich mich nur für
Modbus/TCP - und da vor allem auf MacOS X und Linux (aber das dürfte unter
dem Strich dann sowieso keinen großen Unterschied machen).

Was ich vorhin noch gesehen hab' war übrigens Modbus for Java - eine
angeblich 'reine' JAVA Implementation für Modbus
(<http://jamod.sourceforge.net/index.html>). Vielleicht ist das für dich ja
interessant - ich stehe mit JAVA etwas auf dem Kriegsfuss.

Ich hoffe, ich komme am Wochenende mal dazu ein bisschen
rumzuexperimentieren...

andy





--
You received this message because you are subscribed to the Google Groups "FHEM users" group.
To post to this group, send email to fhem-users@googlegroups.com.
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en.

Guest

Originally posted by: <email address deleted>

Moin zusammen,
>
>
gibt es von irgendjemanden schon Neuigkeiten bzgl. Modbus? Ich wollte evtl.
auch meine Hausautomatisierung auf ein Kabelgebundenes System mit Beckhoff
und EIB umstellen.
Derzeit läuft alles auf FS20 und das funktioniert in meinem Haus nur
bedingt gut.

Wie sind Eure Erfahrungen?

Kevin

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com