RS485 läuft nicht :-(

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo liebe Forumsgemeinde,

    habe mir grad folgenden RS485-USB-Adapter bestellt: http://www.ebay.de/itm/USB-RS485-…i-/181923686340

    Leider läuft das Ding nur unter Windows (mit Modbus Master getestet).

    Unter dem Raspberry Pi wird der Adapter zwar korrekt erkannt und unter /dev/ttyUSB1 angemeldet.

    Wenn ich allerdings mein Python Skript starte


    erhalte ich nur:

    Kennt jemand das Problem und kann mir weiterhelfen?

  • Hallo Dast,

    herzlich Willkommen in unserem Forum!

    Dein gestartetes Python-Skript enthält wohl noch ein paar Fehler. Zumindest werden entsprechende Fehlermeldungen ausgegeben. Mehr kann man ohne Kenntnis des Skriptes nicht zur Lösung beitragen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Andreas: du redest wirr. Der Fehler deutet nicht auf ein problematisches Python-Skript, sondern Einstellungs- oder Treiberprobleme.

    dast: ich weiss nicht was modbus-master ist - vermute mal eine Anwendung fuer Modbus-Geraete? Hast du daher die seriellen Port Einstellungen? Hast du das Python-Skript auch mal unter Windows laufen lassen?

  • Zuerst mal danke für die Antworten!

    Unter Windows 10 hab ichs mit dem QModMaster Programm (http://sourceforge.net/projects/qmodmaster/) probiert.
    Und ja, ich versuche am Raspberry Pi die Daten eines Energiemessgerätes auszulesen; läuft über Modbus.
    Ich hab das ganze unter Python mittels zwei verschiedener Libs probiert ... beides mal das selbe Problem:
    -> Bekomme einfach keine Antwort!
    Probiert hab ichs mit der pymodbus-lib (https://github.com/bashwork/pymodbus) und MinimalModbus (https://github.com/pyhys/minimalmodbus).

    Einmal editiert, zuletzt von dast (21. Dezember 2015 um 21:36)

  • Hast Du das Monitor-Programm, das wir verwendet haben, auch mal ausprobiert (steht irgendwo im Thread)?
    Das hat mir zumindest sehr geholfen ...

    //Edit wollte noch hinzufügen: hast Du mal mit der Bus-Terminierung herumexperimentiert. Ist auch wichtig ...

    cu,
    -ds-

  • Hallo,

    ich lese mit dem selben Adapter einen B+G Modbuszähler aus. Dies läuft ohne Probleme. Hier ein Auszug aus meinem Script.



    Gruß
    Oliver

    Einmal editiert, zuletzt von olli112 (21. Dezember 2015 um 21:58)

  • dreamshader: Nein, das von dir genannte Monitor-Programm hab ich noch nicht probiert. Muss ich erst mal zum Laufen bringen ...
    Und ja, hab auf beiden Seiten (Adapter und Modbus-Gerät) nen 120 Ohm Widerstand zwischen den Signalleitungen.

    olli112: Ich möchte eben auch den SDM630 Modbuszähler von B+G auslesen. Funktioniert aber leider nicht ... :(

    Einmal editiert, zuletzt von dast (22. Dezember 2015 um 20:52)

  • Hallo Dast,

    hast Du mal spaßeshalber die ganzen Sonderzeichen insbesondere Start- und Stop-Zeichen auf [font="Courier New"]undef[/font] gesetzt? Denn vorher kann es schwierig werden, überhaupt irgendwas zu empfangen. Ich habe mir angewöhnt, alle Sonderzeichen auf undef zu setzen und alles Weitere über die Anwendung zu regeln.

    Wenn Du über

    Code
    cat /dev/ttyUSB1


    keinen Empfang erkennen kannst, dann gelingt es Dir auch nicht mit anderer Software - inkl. selbstgeschriebener.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (22. Dezember 2015 um 20:55)

  • Sorry, aber was meinst du mit Start- und Stop-Zeichen auf [font="Courier New"]undef[/font] setzen?

  • Hallo dast,

    eine serielle Datenübertragung ist in der Regel so voreingestellt, dass bestimmte (Sonder)Zeichen als Start- und Ende-Zeichen definiert sind.

    Wenn diese Startzeichen nicht gesendet werden, dann wird auch kein Datenempfang erkannt. Sinngemäß gilt das Gleiche für die Ende-Zeichen.

    Dann gibt es noch alle möglichen Interrupt-Zeichen und Zeichen, die eine besondere Funktionalität auslösen können.

    In den vergangenen Monaten habe ich mehrere Projekte gehabt, bei denen es um Datenübertragung über die serielle Schnittstelle ging und weiterhin geht.

    Ich schalte als Erstes die ganzen Sonderzeichen aus, um einen Eindruck zu bekommen, was da an Daten ankommt - um dann in einer Anwendung darauf einzugehen.

    Poste einmal die Ausgabe von

    Code
    stty -F /dev/ttyUSB1 -a

    Ausschalten kannst Du die Sonderzeichen durch

    Code
    stty -F /dev/ttyUSB1 start undef
    Code
    stty -F /dev/ttyUSB1 stop undef


    Analog für die anderen Sonderzeichen.

    Dies ist aber nur wirksam, wenn die anderen Parameter (Baudrate, Parität, Stopbits) aufeinander abgestimmt sind.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (23. Dezember 2015 um 09:10)

  • Code
    pi@raspberrypi ~/sdm $ stty -F /dev/ttyUSB1 -a
    speed 19200 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
    flush = ^O; min = 0; time = 0;
    -parenb -parodd -cmspar cs8 hupcl cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    -opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

    Hab start und stop mal auf <undef> gesetzt, leider ohne Erfolg!

  • Hallo dast,

    Code
    pi@raspberrypi ~/sdm $ stty -F /dev/ttyUSB1 -a
    speed 19200 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
    flush = ^O; min = 0; time = 0;
    -parenb -parodd -cmspar cs8 hupcl cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    -opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

    Hab start und stop mal auf <undef> gesetzt, leider ohne Erfolg!


    Letzteres glaube ich Dir so nicht - denn die Ausgabe von

    Code
    stty -F /dev/ttyUSB1 -a


    sagt,

    Code
    start = ^Q; stop = ^S;


    Somit wartet das System auf das Startzeichen ^Q und das Stopzeichen ^S.

    Wenn Du Deine serielle Datenkommunikation NICHT mit diesem Startzeichen beginnst UND mit diesem Stopzeichen beendest, dann kannst Du nichts empfangen.

    Deswegen ja mein Tip, Start- und Stopzeichen auf [font="Courier New"]undef[/font] zu setzen.

    Die beste Hilfe kann nur so gut sein, wie sie umgesetzt wird.

    Bist Du sicher, dass Deine serielle Schnittstelle unter [font="Courier New"]/dev/ttyUSB1[/font] zu erreichen ist?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Ja, das Gerär ist unter /dev/ttyUSB1 zu erreichen. Am /dev/ttyUSB0 hängt ein RS232-USB Adapter.

    Sieht man auch im dmesg:

    [ 1164.399701] usbcore: registered new interface driver ch341
    [ 1164.399869] usbserial: USB Serial support registered for ch341-uart
    [ 1164.399973] ch341 1-1.5:1.0: ch341-uart converter detected
    [ 1164.411255] usb 1-1.5: ch341-uart converter now attached to ttyUSB1

    Der obere Auszug vom "stty -F /dev/ttyUSB1 -a" war VOR dem
    stty -F /dev/ttyUSB1 start undef und
    stty -F /dev/ttyUSB1 stop undef.

    Hier nochmal alles:

    pi@raspberrypi ~/sdm $ stty -F /dev/ttyUSB1 -a
    speed 19200 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = ^Z; rprnt = ^R; werase = ^W;
    lnext = ^V; flush = ^O; min = 0; time = 0;
    -parenb -parodd -cmspar cs8 hupcl cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    -opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

    pi@raspberrypi ~/sdm $ python modbus.py

    MinimalModbus debug mode. Writing to instrument (expecting 7 bytes back): '\x01\x04\x00\x00\x00\x011\xca' (01 04 00 00 00 01 31 CA)
    MinimalModbus debug mode. No sleep required before write. Time since previous read: 1450886784634.4 ms, minimum silent period: 2.01 ms.
    MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 1001.4 ms. Timeout setting: 1000.0 ms.

    Traceback (most recent call last):
    File "modbus.py", line 15, in <module>
    data = instrument.read_register(0x0000, 2, functioncode=4) # Registernumber, number of decimals
    File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 258, in read_register
    return self._genericCommand(functioncode, registeraddress, numberOfDecimals=numberOfDecimals, signed=signed)
    File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 697, in _genericCommand
    payloadFromSlave = self._performCommand(functioncode, payloadToSlave)
    File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 795, in _performCommand
    response = self._communicate(request, number_of_bytes_to_read)
    File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 930, in _communicate
    raise IOError('No communication with the instrument (no answer)')
    IOError: No communication with the instrument (no answer)
    Automatisch zusammengefügt:
    Was mir gerade aufgefallen ist:

    Am /dev/ttyUSB0 hängt ja ein RS232-USB Adapter, der einwandfrei funktioniert.
    Bei diesem ist start und stop auch auf start = ^Q; stop = ^S; gesetzt.

    Einmal editiert, zuletzt von dast (23. Dezember 2015 um 17:12)

  • Hallo dast,

    welche anderen Parameter erwartet das "Instrument"?
    - Baudrate
    - Parität
    - Stopbits

    Auch diese drei Werte müssen abgeglichen werden.

    Im Zweifelsfall solltest Du auch die anderen Sonderzeichen ausschalten, damit Du sehen kannst, was das auf der seriellen Schnittstelle passiert.

    Hast Du mal den Verkehr auf der seriellen Schnittstelle mit cuteCom angeschaut?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Das "Instrument" der Python minimalmodbus erwartet folgendes:

    Attributes:
    - port (str): Serial port name.
    - Most often set by the constructor (see the class documentation).
    - baudrate (int): Baudrate in Baud.
    - Defaults to :data:`BAUDRATE`.
    - parity (probably int): Parity. See the pySerial module for documentation.
    - Defaults to :data:`PARITY`.
    - bytesize (int): Bytesize in bits.
    - Defaults to :data:`BYTESIZE`.
    - stopbits (int): The number of stopbits.
    - Defaults to :data:`STOPBITS`.
    - timeout (float): Timeout value in seconds.
    - Defaults to :data:`TIMEOUT`.

    Nein, cuteCom hab ich noch nicht probiert.

    Ich hab nur am /dev/ttyUSB0 einen RS232-USB Adapter hängen über den ein Python Skript (mit pyserial) alle Minute ein paar Werte der Wärmepumpe abfragt.
    Das läuft wunderbar ... ohne irgendwelche Änderungen.

  • Manchmal hilf USB RS485 Adapter ein und wieder ausstecken. Leider blockiert meiner beim Booten die Maus mit dmesg wird er aber richtig erkannt:

    646.813983] usb 1-1.2: new full-speed USB device number 6 using xhci_hcd

    [ 646.960187] usb 1-1.2: New USB device found, idVendor=0403, idProduct=6001, bcdDevice= 6.00

    [ 646.960203] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

    [ 646.960216] usb 1-1.2: Product: FT232R USB UART

    [ 646.960228] usb 1-1.2: Manufacturer: FTDI

    [ 646.960239] usb 1-1.2: SerialNumber: AD0JZDSI

    [ 647.089400] usbcore: registered new interface driver usbserial_generic

    [ 647.089448] usbserial: USB Serial support registered for generic

    [ 647.092301] usbcore: registered new interface driver ftdi_sio

    [ 647.092347] usbserial: USB Serial support registered for FTDI USB Serial Device

    [ 647.092700] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected

    [ 647.092841] usb 1-1.2: Detected FT232RL

    [ 647.097224] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0

    leider führen die Abfragen der Holdingregister aber nur zu '0' als Rückantwort.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!