Konfiguration pictory für folgendes Device

Für Themen rund um das Prozessabbild des RevPi Core
b2cr
Posts: 10
Joined: 08 Mar 2018, 17:15

Konfiguration pictory für folgendes Device

Post by b2cr »

Hallo!
Nachdem ich jetzt schon etliche Stunden an Trial-and-Error hinter mir habe, stelle ich die Frage mal hier rein.

Ich habe ein Gerät, das über Modbus kommuniziert. Mit Python kann ich bereits mit dem Gerät kommunizieren, und zwar durch Öffnen einer seriellen Schnittstelle zu /dev/ttyUSB0. Nachdem ich aber in C arbeiten möchte, würde ich gerne über die Variablennamen arbeiten.

In der Dokumentation für mein Gerät steht:

Code: Select all

Function code 03(FC03) is used for reading the status.

Example of FC03 Read function:
This message asks for register 0x07D0(2000) and register 0x07D1(2001)

Request is: 09 03 07 D0 00 02 C5 CE
Bits Description

09               SlaveID
03               Function Code 03(Read Holding Registers)
07D0             Address of the first requested register
0002             Number of registers requested(2)
C5CE             Cyclic Redundancy Check(CRC)

Response is: 09 03 04 E0 00 00 00 44 33

Bits Description
09               SlaveID
03               Function Code 03(ReadHoldingRegisters)
04               Number of data bytes to follow (2registers x 2bytes / register = 4bytes)
E000             Content of register 07D0
0000             Content of register 07D1
4433             Cyclic Redundancy Check(CRC)
Schreibe ich beispielsweise den Request 09 03 07 D0 00 02 C5 CE (wie oben beschrieben) über die serielle Schnittstelle hinaus, bekomme ich auch die oben stehende Antwort.

Ich möchte aber gerne direkt über das Prozessabbild arbeiten. Ich habe pictory jetzt folgendermaßen konfiguriert:

Im Modbus RTU Master Extended Menü steht:
Slave Address: 9
Function Code: READ_HOLDING_REGISTERS
Register Address: 2000
Quantity of Registers: 2
Interval: 1000ms
Device Value: Input_Word_1

piTest gibt mir aber nicht die Response zurück, die ich mit Python bekomme. Da stehen eine Reihe von Nullen und ein paar Hexwerte, die aber nicht zu dem Request passen.
Woran könnte das liegen? Am CRC Test? Oder an meiner RTU Master Konfiguration im Pictory?

Danke im Voraus!
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41

Re: Konfiguration pictory für folgendes Device

Post by volker »

Hi,
das ist eine Verwechslung zwischen Modbus Registeradressierung im Telegtramm (also Deinem python) wo Du offenbar mit 2000 Erfolg hattest und der Modbusregisternummer. In Pictory wird die bei 1 beginnende Registernummer eingetragen, während im Telegramm die bei 0 beginnende Mosbusregisteradresse steht. Im Tutorial haben wir daher den deutlich gekennzeichneten Hinweis angebracht, dass bei diesem Wert auf die Adresse ab 1 referenziert wird. Also musst Du 2001 eintragen. Im Telegramm wird dann 2000 übertragen. Ist halt das übliche Modbus-Chaos...
Unser RevPi Motto: Don't just claim it - make it!
b2cr
Posts: 10
Joined: 08 Mar 2018, 17:15

Re: Konfiguration pictory für folgendes Device

Post by b2cr »

Hi Volker!
Danke - mit 2001 hat es nun funktioniert. Beim Schreiben hab ich aber immer noch massive Probleme. Das Gerät tut zwar irgendwas, aber nicht das, was es soll.

Ein kleines Problem (und Feedback zu Pictory gleichzeitig) - welche Funktionscodes verbirgen sich hinter den Funktionen, die ich im Modbus Extended Menü einstellen kann? Das wäre dann nämlich eindeutig. Ich müsste nämlich FC16 ansprechen, bin mir aber nicht sicher ob das nun tatsächlich WRITE_MULTIPLE_REGISTERS ist, oder nicht. Gibt's da irgendwo eine Doku?

Beste Grüße
Christian
b2cr
Posts: 10
Joined: 08 Mar 2018, 17:15

Re: Konfiguration pictory für folgendes Device

Post by b2cr »

Oder vielleicht anders formuliert:

Ich hab's mit der 2001er pictory Konfiguration hinbekommen, dass ich die (funktionierende) read-Message

Code: Select all

09 03 07 D0 00 02 C5 CE

Dabei ist lt. Doku:
09    SlaveID
03    Function Code 03 (Read Holding Registers)
07D0  Address of the first requested register
0002  Number of registers requested(2)
C5CE  Cyclic Redundancy Check(CRC)
derart in pictory konfiguriere, dass ich sie mit piTest und damit in C nachprogrammieren kann. Das hat funktioniert, indem ich dem Input_Word_1 die Adresse 2001 gegeben habe, und als Funktion READ_HOLDING_REGISTERS, dh. FC03.

Ich bräuchte jetzt aber noch eine Konfiguration für

Code: Select all

09 10 03 E8 00 03 06 09 00 00 00 FF FF 72 19

Dabei ist lt. Doku:
09    SlaveID
10    Function Code 16(Preset Multiple Registers)
03E8  Address of the first register
0003  Number of registers written to
06    Number of data bytes to follow (3 registers x2 bytes / register =6 bytes)
0900  Value written to register 1
0000  Value written to register 2
FFFF  Value written to register 3
7219  Cyclic Redundancy Check(CRC)
Konfiguriere ich im pictory nun folgend:
WRITE_MULTIPLE REGISTERS
Register Address 1001

Wenn ich dann aber versuche, über das Output_Word_1 oder den Offset etwas rauszuschicken (z.B. über pictory oder auch über python), dann passiert einfach nichts am Gerät (die Werte kommen aber im Register an, wenn ich sie mit piTest -r auslese). Wenn ich wiederum die oben stehende output-Message über /dev/ttyUSB0 raus schicke, tut das Gerät, was es soll.

Bitte um Hilfe!
Last edited by b2cr on 03 May 2018, 15:37, edited 1 time in total.
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41

Re: Konfiguration pictory für folgendes Device

Post by volker »

Leider sind die Modbus Function Codes in unterschiedlichen Quellen unterschiedlich benannt. Es gibt daher mehrere üblihce Bezeichnungen, die wahrscheinlich nur für Insider selbsterklärend sind ;-)
Hier die Liste mit unseren Bezeichnungen:

01 Read Coil Status = READ_COILS
02 Read Input Status = READ_DISCRETE_INPUTS
03 Read Holding Registers = READ_HOLDING_REGISTERS
04 Read Input Registers = READ_INPUT_REGISTERS
05 Force Single Coil = WRITE_SINGLE_COIL
06 Preset Single Register = WRITE_SINGLE_REGISTER
15 Force Multiple Coils = WRITE_MULTIPLE_COILS
16 Preset Multiple Registers = WRITE_MULTIPLE_REGISTERS

Was Deine Konfiguratiojn anbelangt, hast Du erneut dieselbe verwechslung bemüht:
In Deinem Telegramm willst Du Registeradresse 3E9 beschreiben (1001). Dies entspricht aber der Registernummer 1002. In PiCtory ist daher Register 1002 zu konfigurieren (immer Telegrammadresse + 1).
Unser RevPi Motto: Don't just claim it - make it!
b2cr
Posts: 10
Joined: 08 Mar 2018, 17:15

Re: Konfiguration pictory für folgendes Device

Post by b2cr »

Hallo Volker!

Ad Funktionscodes:
Danke für die Funktionsdefinition. Ja, eben diese unterschiedlichen Bezeichnungen haben es für mich schwierig gemacht.

Ad Registeradressen:
Sorry, ich hab die obere Beschreibung aus der pdf-Doku des Geräts rauskopiert und nicht korrektur gelesen (nahm nicht an, dass die Doku nicht passt). Ich glaube, dass das ein Typo ist. Ich hab den Beitrag oben jetzt nochmal editiert. Jetzt handelt es sich dabei um ein Codebeispiel, von dem ich weiß, dass es funktioniert, und ich hab das jetzt dort raus kopiert.

Code: Select all

ser=serial.Serial(port='/dev/ttyUSB0',
    baudrate=115200,
    timeout=1,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS)

ser.write(b"\x09\x10\x03\xE8\x00\x03\x06\x09\x00\x00\x00\xFF\xFF\x72\x19")
Damit wären wir aber nun doch bei der Registeradresse 1001. Da tut sich aber nichts :(
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41

Re: Konfiguration pictory für folgendes Device

Post by volker »

Hi,
ich vermute das mit dem "rausschicken" ist jetzt das Missverständnis:
Du hast mit der Konfiguration jetzt "Output_Word_1" (und folgende) als Quelle für die Payload der Modbus-Action angegeben. Du schreibst, Du hättest über PiCtory was rausgesendet. Das geht aber gar nicht. Du kannst in PiCtory keine Daten in das Prozessabbild schreiben. Das geht nur über entsprechende Aufrufe des piControltreibers mit C oder Python oder aber auch mit PiTest -w Output_Word_1,xxxx.
Versuch das bitte erst einmal. Dann (wenn es mit PiTest geht), kannst Du mit Python einen Versuch starten. Achso: Das Intervall sollte vielleicht irgendwo bei 1000 sein, damit Du auch was siehst...
Unser RevPi Motto: Don't just claim it - make it!
b2cr
Posts: 10
Joined: 08 Mar 2018, 17:15

Re: Konfiguration pictory für folgendes Device

Post by b2cr »

Ich hab natürlich piTest gemeint, Verzeihung.
Das hab ich bereits versucht. Ich hab ja oben erwähnt, dass ich die Werte in das Prozessabbild schreiben kann, und zwar sowohl mit piTest, als auch mit python.

Zum Beispiel, rauskopiert aus ipython (Zeilennummern bitte ignorieren)

Code: Select all

In [35]: import fcntl 
In [36]: f = open("/dev/piControl0","wb+",0)
In [37]: message=bytes(bytearray((0x09, 0x00, 0x00, 0xFF, 0xFF, 0xFF)))
In [38]: f.seek(1252)
In [39]: f.write(message)
Dann bekomme ich im piTest via Terminal folgenden output:

Code: Select all


pi@RevPi4681:~ $ piTest -v Output_Word_1
variable name: Output_Word_1
       offset: 1252
       length: 16
          bit: 0


pi@RevPi4681:~ $ piTest -r 1252,6,h
09 00 00 ff ff ff
09 00 00 ff ff ff

Es kommt also im Prozessabbild an. Nur stimmt irgendetwas nicht mit dem Rausschreiben. Es kommt nichts beim Gerät an. Also stimmt entweder etwas nicht mit der Verbindung (Einstellungen der seriellen Schnittstelle im pictory passen, das hab ich 3x überprüft), oder mit dem offset, oder einer anderen Konfiguration im pictory. Denn über /dev/ttyUSB0 direkt die Message rausschreiben funktioniert ja.

Danke!
b2cr
Posts: 10
Joined: 08 Mar 2018, 17:15

Re: Konfiguration pictory für folgendes Device

Post by b2cr »

Nach weiteren Stunden Trial-and-Error habe ich nun folgende Vermutung:
Ich kann über den Modbus-Master zwar Werte aus dem Prozessabbild auslesen, die mir der Modbus-Slave (also mein Gerät) schickt. Ich kann auch Werte über die konfigurierten Offsets in das Prozessabbild schreiben (sowohl über piTest, als auch via python). Allerdings kommen die Werte aber offenbar nicht beim Gerät an. Kann es sein, dass es irgendein bekanntes Problem damit gibt? Also dass die Werte zwar im Prozessabbild stehen, aber nicht tatsächlich über ttyUSB0 verschickt werden?

Grüße
Christian
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41

Re: Konfiguration pictory für folgendes Device

Post by volker »

Sorry, aber da gibt es kein bekanntes Problem. Wir haben selber diverse Anwendungen mit Modbus master RTU und TCP bei denen wir auch Werte schreiben. Das muss schon gehen. Am einfachsten ist immer, wenn man so was mit einem PC und Modbus Slave Emulation testet. Da gibt es einige kostenlose Programme. Dann mit einem USB auf RS485 Dongle einfach mal die Gegenstelle bilden und schauen, was da am RevPi wohin rausgeht. Noch besser wäre ein RS485 Sniffer, aber die sind nicht billig.
Ich weiß nicht, wo da bei Dir der Wurm drinnen ist, aber irgendwo muss er drinnen sein. Was sagen denn die Statuseinträge vom Modbus Master? Alle auf 0? Wenn nicht, geben die auch einen Hinweis auf das Problem. Wenn dier zugehörige Action Status nicht auf 0 ist, dann ist irgendetwas noch nicht in der Konfiguration korrekt.
Du könntest hier auch mal Deinen RevPi Zustand posten: Welcher RevPi Core (1 oer 3)? Welches Image? Welche Upgrades? Welche PiCtory-Version?
Ein Kollege kann dann mal versuchen, das nachzustellen.
Unser RevPi Motto: Don't just claim it - make it!
Post Reply