Python und RS485

Rund um die Software von Revolution Pi
digohm
Posts: 35
Joined: 10 Aug 2017, 23:00
Answers: 0

Python und RS485

Post by digohm »

Hallo zusammen,

ich würde gerne einen Eurotherm 3216 via Modbus RTU auslesen, scheitere jedoch bisher.
Was ich bisher gemacht habe:

RS485 Stick aus dem Shop angeschlossen und angesteckt (/dev/ttyUSB0)
Beim 3216 die Addresse auf 5 und die Baudrate auf 19200 eingestellt.
HE mit D+ (A) verbunden
HF mit D- (B) verbunden
HE und HF mit einen 220 Ohm Widerstand verbunden
Minimalmodbus Bibliothek installiert: http://minimalmodbus.readthedocs.io/en/ ... usage.html

Für folgenden Test

Code: Select all

ser = serial.Serial('/dev/ttyUSB0', 19200, timeout=1)
print(ser)
erhalte ich

Code: Select all

Serial<id=0x7571fb90, open=True>(port='/dev/ttyUSB0', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)
Für ein kurzes Testprogramm

Code: Select all

import serial
import minimalmodbus

instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 5) # port name, slave address (in decimal)
instrument.debug = True
print(instrument)

## Read temperature (PV = ProcessValue) ##
temperature = instrument.read_register(1) # Registernumber, number of decimals
print(temperature)

erhalte ich folgende Fehlermeldung:

Code: Select all

minimalmodbus.Instrument<id=0x74d11350, address=5, mode=rtu, close_port_after_each_call=False, precalculate_read_size=True, debug=True, serial=Serial<id=0x757a1270, open=True>(port='/dev/ttyUSB0', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=0.05, xonxoff=False, rtscts=False, dsrdtr=False)>

MinimalModbus debug mode. Writing to instrument (expecting 7 bytes back): '\x05\x03\x00\x01\x00\x01ÔN' (05 03 00 01 00 01 D4 4E)
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1519823930887.9 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 50.3 ms. Timeout setting: 50.0 ms.

Traceback (most recent call last):
  File "/home/pi/Desktop/program.py", line 10, in <module>
    temperature = instrument.read_register(1) # Registernumber, number of decimals
  File "/usr/local/lib/python3.4/dist-packages/minimalmodbus.py", line 258, in read_register
    return self._genericCommand(functioncode, registeraddress, numberOfDecimals=numberOfDecimals, signed=signed)
  File "/usr/local/lib/python3.4/dist-packages/minimalmodbus.py", line 697, in _genericCommand
    payloadFromSlave = self._performCommand(functioncode, payloadToSlave)
  File "/usr/local/lib/python3.4/dist-packages/minimalmodbus.py", line 795, in _performCommand
    response = self._communicate(request, number_of_bytes_to_read)
  File "/usr/local/lib/python3.4/dist-packages/minimalmodbus.py", line 930, in _communicate
    raise IOError('No communication with the instrument (no answer)')
OSError: No communication with the instrument (no answer)
Laut Bedienungsanleitung (https://www.eurotherm.de/index.php?rout ... ad_id=1161) auf Seite 55 müsste die Registeraddresse 1 PV:.N mit dem Function Code 3 sein.
Folgendes Beispiel verwedet ebenfalls Register 1: https://www.gitbook.com/book/alexdumitr ... oc/details

Mit Pictory war ich ebenfalls erfolglos. Da ich aber im nächsten Schritt Motoren ansteuern möchte, werde ich sowieso bei dieser Variante bleiben müssen.

Ich würde mich sehr freuen, wenn ihr mir weiterhelfen könntet :)
Wulf
Posts: 25
Joined: 01 Nov 2017, 11:49
Answers: 0

Re: Python und RS485

Post by Wulf »

Wenn ich's richtig sehe, bekommst du keinerlei Response?
Ob der Code so funktionieren müsste, kann ich leider nicht beurteilen.
Könnte es ein Problem mit der Hardware oder Verkabelung sein?
digohm
Posts: 35
Joined: 10 Aug 2017, 23:00
Answers: 0

Re: Python und RS485

Post by digohm »

Ja genau, nur woran es liegt weiß ich leider nicht.
ich habe

Code: Select all

HE mit D+ (A)
HF mit D- (B)
HE und HF mit einem 220 Ohm Widerstand

verbunden.
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41
Answers: 1

Re: Python und RS485

Post by volker »

Warum nuttz Du denn nicht den Modbus Master im RevPi? Der ist doch in PiCtory ganz einfach zu konfigurieren und tauscht seine Daten dann auch mit dem Prozessabbild aus. Dann steht Dir die ganze Welt der Software zur Verfügung, die es inzwischen für den RevPi gibt und die ebenfalls über das Prozessabbild läuft.
Was die Klemmen anbelangt: HE unf HF sind nicht grade übliche Bezeichnungen. Gibt es da keine anderen Bezeichnungen in der Doku? Bei Modbus kommt immer plus an plus und Minus an Minus. Bitte nicht nach /B gehen, weil die Hersteller da unterschiedliches Verständnis haben. Bei einigen ist A plus, bei anderen ist B plus.
Unser RevPi Motto: Don't just claim it - make it!
digohm
Posts: 35
Joined: 10 Aug 2017, 23:00
Answers: 0

Re: Python und RS485

Post by digohm »

Bezüglich der Klemmen steht in der Betriebsanleitung HE A(+) und HF B(-). Insofern müsste das eigentlich passen. Den Widerstand habe ich nochmals kontrolliert, passt also ebenfalls.
Das mit dem Modbus Master im RevPi habe ich vielleicht noch nicht ganz verstanden. Mich hat das Feld "Action Interval" verwirrt. Sobald der Temperaturregler funktioniert möchte ich via Modbus RTU Servomotoren ansteuern. Diese sollen ja nur dann etwas tun, wenn ich das möchte und nicht in einem fixen Intervall. Oder verstehe ich das falsch?
User avatar
Ingo
Posts: 266
Joined: 10 Nov 2016, 21:56
Answers: 1
Location: Luth.Wittenberg

Re: Python und RS485

Post by Ingo »

Hallo Dighom,

der Action intervall gibt ja nur an in welchem Zyklus er daten holen soll dies hat nichts damit zu tun das er etwas schalten soll, dies macht alleine dein Programm am Ende.
Sandartmäßig sind dort 1 sec eingetragen die du aber kürzer oder länger einstellen kannst, wo wie du diese brauchst.

gruß
digohm
Posts: 35
Joined: 10 Aug 2017, 23:00
Answers: 0

Re: Python und RS485

Post by digohm »

ok, dann habe ich das falsch verstanden.
Habe es jetzt nochmal mit dem Modbus RTU Master versucht aber bisher ohne Erfolg.

Code: Select all

 piTest -d
Found 4 devices:

Address: 0 module type: 95 (0x5f) RevPi Core V1.2
Module is present
     input offset: 0 length: 6
    output offset: 6 length: 5

Address: 32 module type: 96 (0x60) RevPi DIO V1.3
Module is present
     input offset: 11 length: 70
    output offset: 81 length: 18

Address: 33 module type: 103 (0x67) RevPi AIO V1.2
Module is present
     input offset: 124 length: 20
    output offset: 144 length: 4

Address: 64 module type: 24580 (0x6004) ModbusRTU Master Adapter V0.0
Module is present
     input offset: 213 length: 101
    output offset: 317 length: 75

Code: Select all

piTest -r temp
2 Byte-Value of temp: 0 dez (=0000 hex)
2 Byte-Value of temp: 0 dez (=0000 hex)
2 Byte-Value of temp: 0 dez (=0000 hex)

Code: Select all

piTest -v temp
variable name: temp
       offset: 213
       length: 16
          bit: 0

Code: Select all

piTest -r 213,5,h
00 00 00 00 00
00 00 00 00 00
00 00 00 00 00
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41
Answers: 1

Re: Python und RS485

Post by volker »

Schau bitte mal in die Fehlerregister vom Modbus master, insbesondere auch in das register zu deiner action. Dann mach scrrendumps von der masterkonfiguration und von den piTest Asugaben zu den Fehlerregistern.
Unser RevPi Motto: Don't just claim it - make it!
digohm
Posts: 35
Joined: 10 Aug 2017, 23:00
Answers: 0

Re: Python und RS485

Post by digohm »

Ich hoffe ich habe alles richtig gemacht:
The attachment masterconf1.JPG is no longer available
masterconf1.JPG
masterconf1.JPG (89.25 KiB) Viewed 9629 times
piTest.JPG
piTest.JPG (61.51 KiB) Viewed 9629 times

Im Menü des Eurotherm Reglers steht Baudrate auf 9600 und Parity auf None. Da es im Handbuch so aussieht als würde man am Anfang und am Ende einen 220 Ohm Widerstand benötigen habe ich auch dies ausprobiert. Leider ohne Erfolg.
Wie man in den Bildern sieht, steht auch im Fehlerregister (sofern ich das richtig gemacht habe) außer viele Nullen nichts.
Via Windows Notebook und ModbusPoll bzw. Modscan erhalte ich ebenfalls keinerlei Resultate außer Modbus Message Timeout. Es scheint also irgendein grundlegendes Problem zu geben. Gibt es eine Möglichkeit zu testen ob der RS485 Stick überhaupt funktioniert (bevorzugt ohne Oszilloskop)?
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41
Answers: 1

Re: Python und RS485

Post by volker »

okay.
Deine Ergebnisse sind ziemlich eindeutig:
Da die Fehlerregister alle 0 sind und auch unter Modbuspoll nur Nullen kommen und keine Fehlermeldungen, steht eigentlich ohne Zweifel fest: Dein Slave schickt auf den Modbus-Funktion code Nullen als Antwort zurück. Es braucht auch kein Oszi oder Zweifel an dem USB zu Modbus-Konverter, denn wenn der Slave nicht oder Schrott antworten würde, hättest Du klare Fehlercodes im Master oder den Actions. Der Salve antwortet und muss offenbar eine gültige Antwort zurück senden. Und die bringt Modbusregisterwerte von Null.
Eigentlich empfehle ich immer, dass man erst einmal mit einem Tool wie Modpoll oder Qmodbus den Slave abfragt und verifiziert, ob überhaupt die Registeradressen korrekt sind und dort auch die erwarteten Inhalte stehen. Das spart viel Frust...
Wieviel Actions hast Du denn in Pictory definiert und wie sehen die aus? Schick mal einen Screendump davon.
Und dann bitte mal einen Auszug aus der Doku Deines Slaves, in dem die Info steht, dass das entsprechende Register den von Dir gewünschten Inhalt hat und auch welchen Function Code der Slave überhaupt akzeptiert.
Unser RevPi Motto: Don't just claim it - make it!
Post Reply