Modbus

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Modbus

Beitrag von ramses »

Hallo

ich hätte ein Project in dessen Mittelpunkt die Abfrage von einigen 100 Word Registern und mehrern 100 Coils aus mehreren Slaves über mehrere Ports RS232 und TCP/IP mit dem Modbus-Protokoll steht.

Hat sich schon jemand mit Modbus befasst bezw. kennt API-Funktionen oder Class Bibliotheken die sich direkt in xbase verwenden lassen.

Benötigt werden: Coils lesen, HoldingRegisters lesen/schreiben



Gruss Carlo
Valar Morghulis

Gruss Carlo
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Modbus

Beitrag von ramses »

Hi

Modbus ist ein Weltweit eingesetztes Protokoll für die Datenverbindung zwischen PC's und SPS-Steuermodulen in Schaltschränken und Maschinen. Dies läuft über RS232 oder TCP/UP
zur Datensicherheit wird CRC16 und verschiedeneTimeout's verwendet. übertragen werden nur wenige Bytes, Zustände und Messwerte, dies aber in Sekundenabständen.


Hat sich noch niemand damit rumgeschlagen, bezw. kennt das niemand?


Cu Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Modbus

Beitrag von brandelh »

Es gibt verschiedene Bibliotheken, die RS232 und TCPIP unterstützen, ich kannte jemand der mit den Clipper Tools und der RS232 Daten über das Telefon ausgetauscht hat.
XbToolsIII (RS232) und ASINET (TCPIP) von Alaska (Prof. Sub) oder Marshallsoft (alles :arrow: http://marshallsoft.com/) fallen mir dazu ein.
Gemacht habe ich damit aber noch nichts.
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Modbus

Beitrag von ramses »

Hallo Hubert

erwähnten Bibliotheken sind leider alle für diesen Zweck unbrauchbar. Im Mittelpunkt steht die kommunikation über RS232. Da es eine Punkt Mehrpunkt verbindung ist(RX=TX), also mehrere Geräte am selben Bus(Drähte) angeschlossen sind gibt es verschiedene Timouts die eingehalten werden müssen: Vor dem Senden muss z.B. 3.5 Byte Zeit Ruhe sein oder ein Abstand zwischen Bytes von mehr als 1.5 Byte Zeit markiert ein Fehler usw. usw. Bei 38400 Baud sind dies werte unter 1/1000 Sek die beachtet werdem müssen was jenseits der Xbase möglichkeiten liegt. Diese Timouts sind die Herausforderung nicht die Datenpakete selbst deren Aufbau ist sehr gut dokumentiert.

CU Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Modbus

Beitrag von brandelh »

1.5 Byte Zeit ?

was ist das für eine Einheit ;-)

Kennst du eine Programmiersprache die das kann ?

Wenn ja, dann nimm diese (oder beauftrage jemand der das kann) und erstelle eine DLL/EXE die das Handling übernimmt.
Von Xbase++ aus kannst du dann entweder diese Steuern oder die Daten austauschen, je nach Anforderung.
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Modbus

Beitrag von Koverhage »

Gruß
Klaus
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Modbus

Beitrag von ramses »

Byte-Zeit = Gemeint ist die Zeit welche das übertragen eines Bytes = 11 Bits mit der eingestellten Baudrate benötigt.

es ist meine Kurze übersetzung von "character times" siehe:
The entire message frame must be transmitted as a continuous stream of characters.
If a silent interval of more than 1.5 character times occurs between two characters, the message frame is declared incomplete and
should be discarded by the receiver
Käuflich zu erwebende DLL's gibt es einige, auch Demos dazu, leider benötigen die meisten das .NET Framework, welches Tabu ist (Verwendung verboten), diejenige die Infrage kommen würde ist leider in einer Funktion fehlerhaft, oder aber Sie (die DLL's) benötigen einen "Erpressungs/Nötigungs Dongle" was nicht, unter keinen Umständen in Frage kommen würde.

Ich habe mir jetzt einige SPS besorgt zusammengeschaltet und bin am testen, ohne Fehlerbehebung (Timeout Erkennung) würde es mit den xBaseTools schon laufen .....
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Modbus

Beitrag von brandelh »

die eigene Anwendung kann keinesfalls so genau sein, dass 1/1000 Sekunden genau zur rechten Zeit rausgehen.
Wenn dann müssen die 1.5 Byte ... 8 * 1.5 Bits, also 12 Bits mit nichts (chr(0)) gefüllt in den Datenstrom eingebaut und alles auf einmal übergeben werden.

Die Pufferung müsste bei RS232 der CHIP und bei TCPIP die Netzwerkkarte übernehmen. Zumindest kann ich mir nichts anderes vorstellen.

Windows ist nunmal KEIN realtime system, bei dem man tatsächlich den Ablauf so fein steuern könnte.
Ich persönlich fand die timing Problme mit meinem alten RS232 Drucker schon nervig genug :D
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Modbus

Beitrag von ramses »

Hallo Hubert

nein nein, nicht so, das senden ist nicht das Problem das bringt der 16500 Baustein der Schnittstelle dank FIFO perfekt hin.

wenn beim Empfang zwischen 2 Bytes mehr Zeit vergeht als für das senden von 1.5 Bytes benötigt wird muss alles verworfenen werden bis mindestens für 3.5 Byte Zeit nichts mehr ankommt.

Wenns Interessiert eine gute Dok ist unter: http://modbus.org/docs/Modbus_over_seri ... _V1_02.pdf zu finden. Punkt: 2.5.1.1 MODBUS Message RTU Framing

Cu Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Modbus

Beitrag von brandelh »

sorry, ich verstehe nicht mal das Problem ... :oops:
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Modbus

Beitrag von ramses »

Das Problem ist: Man muss die PAUSEN zwischen 2 übertragenen Bytes(Character) auswerten. Dies im Bereich von 0.4ms! Das ist genau das was bei einer Punkt-Punkt Verbindung z.B. zu einem Strichcodeleser usw. niemand interessiert. Da bei Modbus viele Geräte am selben Bus sind ist dies eine der wichtigsten Grundlagen.
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Modbus

Beitrag von brandelh »

Aber genau diese 1/1000 Sek. Pausen dürften vom Cache bzw. Chips ausgeglichen werden, da man im normalfall keine haben will. :?
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Modbus

Beitrag von ramses »

Hier ist der wichtige Teil
2.5.1.1 MODBUS Message RTU Framing
A MODBUS message is placed by the transmitting device into a frame that has a known beginning and ending point. This allows
devices that receive a new frame to begin at the start of the message, and to know when the message is completed. Partial
messages must be detected and errors must be set as a result.
In RTU mode, message frames are separated by a silent interval of at least 3.5 character times. In the following sections, this time
interval is called t3,5.

RTU Message Frame
The entire message frame must be transmitted as a continuous stream of characters.
If a silent interval of more than 1.5 character times occurs between two characters, the message frame is declared incomplete and
should be discarded by the receiver.
In meinem Testaufbau funktioniert die Kommunikation mit den XBTools jetzt, blos ohne diese Fehlererkennung ist das Risiko einer Fehlfunktion wegen Störung usw. sehr hoch ...
Valar Morghulis

Gruss Carlo
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Modbus

Beitrag von UliTs »

Ich bin mir nicht sicher, ob ich das Problem richtig verstehe:
geht es inzwischen nur noch darum, Zeiten im Millisekundenbereich mit xBase++ messen zu können?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Modbus

Beitrag von brandelh »

So wie ich das verstehe muss er "Lücken" zwischen den Bytes im Bereich von 1/1000 Sekunden entdecken,
aber nach meiner Meinung (ich kann mich irren ;-) ) gleicht doch der UART CHIP der RS232 gerade diese aus und liefert konstante Datenströme an Windowsprogramme.

https://de.wikipedia.org/wiki/Universal ... ransmitter

Er meint es gäbe DLLs die das handlen können, die müssten dann tiefer ansetzen und direkt mit der Hardware verhandeln, aber in dem Zeitrahmen :?
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Modbus

Beitrag von ramses »

Ja, beim Empfang eines Telegramms muss die Zeit zwischen den Bytes ausgewertet werden, ist diese ausserhalb den Bedingungen ist das Telegramm ungültig. Je nach Baudrate ist dies tatsächlich im Bereich von 1/1000 Sekunden.
Valar Morghulis

Gruss Carlo
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Modbus

Beitrag von UliTs »

Für die Messung von Zeiten im Millisekundenbereich (und kleiner) benutze ich die Klasse HRTime, die ursprünglich von Phil Ide stammt:

Code: Alles auswählen

*****************
* CLASS HRTimer: Für Zeiten mit höchstmöglicher Genauigkeit
* 31-Aug-2012    Klasse ursprünglich von Phil Ide, modizifiziert von Uli Tscharntke
*****************
DLLFUNCTION QueryPerformanceCounter(@cBuffer8)   USING STDCALL FROM Kernel32.dll
DLLFUNCTION QueryPerformanceFrequency(@cBuffer8) USING STDCALL FROM Kernel32.dll

CLASS HRTimer              // Für Zeiten mit höchstmöglicher Genauigkeit
  HIDDEN:
    CLASS VAR granule      // Anzahl Zeiteinheiten, die pro Sekunde gemessen werden können
    VAR iStart
    VAR isRunning
    VAR duration
  EXPORTED:
    CLASS METHOD InitClass()
    METHOD Init()
    METHOD Start()         // Zeitmessung starten
    METHOD Stop()          // Zeitmessung stoppen / unterbrechen
    METHOD Continue()      // Zeitmessung fortsetzen
    METHOD Duration()      // Zeitdauer
    METHOD isRunning()
    METHOD Precision()     // Kleinste messbare Einheit in Sekunden
ENDCLASS

CLASS METHOD HRTimer:InitClass()
  QueryPerformanceFrequency64( @::granule )
RETURN( self )

METHOD HRTimer:Init()
  ::isRunning := FALSE
  ::iStart    := 0
  ::duration  := 0
RETURN( self )

METHOD HRTimer:Start()
  ::isRunning := FALSE
  ::duration  := 0
  ::Continue()
RETURN( self )

METHOD HRTimer:Stop()
LOCAL i := 0
  IF ::isRunning
    QueryPerformanceCounter64( @i )
    ::isRunning := FALSE
    ::duration  += (i - ::iStart)/::granule
  ENDIF
RETURN( ::duration )

METHOD HRTimer:Continue()
  IF .NOT. ::isRunning
    QueryPerformanceCounter64( @::iStart )
    ::isRunning := TRUE
  ENDIF
RETURN( self )

METHOD HRTimer:Duration()
LOCAL nResult,i := 0
  nResult := ::duration
  IF ::isRunning
    QueryPerformanceCounter64( @i )
    nResult += (i - ::iStart)/::granule
  ENDIF
RETURN( nResult )

METHOD HRTimer:isRunning()
RETURN( ::isRunning )

METHOD HRTimer:Precision()
RETURN( 1/::granule )

STATIC FUNCTION Bin2U64( cBuffer )
LOCAL nResult,nLow,nHigh
  nHigh := (Bin2U(Right(cBuffer,4)))
  nLow  := Bin2U(cBuffer)
  nResult := (2**32)*nHigh+nLow
RETURN( nResult )
//RETURN( (2**32)*(Bin2U(Right(cBuffer,4)))+Bin2U(cBuffer) )

FUNCTION QueryPerformanceCounter64( n )
LOCAL nResult,cBuffer8 := space(8)
  nResult := QueryPerformanceCounter(@cBuffer8)
  n := Bin2U64(@cBuffer8)
RETURN( nResult )

FUNCTION QueryPerformanceFrequency64( n )
LOCAL nResult,cBuffer8 := space(8)
  nResult := QueryPerformanceFrequency(@cBuffer8)
  n := Bin2U64(@cBuffer8)
RETURN( nResult )
Hilft Dir das weiter?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Modbus

Beitrag von Koverhage »

Uli,

den Link dazu hatte ich oben schon geposted.
Gruß
Klaus
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Modbus

Beitrag von ramses »

Hi

danke für die Tips betr. HRTimer. Zwischenzeitlich habe ich mich mehrere (lange) Tage mit dem Problem befasst. Dabei sind einige Versuchs-Programme entstanden, die leider, in meiner Testumgebung nicht allzu überzeugend Funktionierten........

Per Zufall bin ich heute im Web auf eine DLL gestossen welche die Aufgabe sowas von perfekt erledigt. Und dies über RS232, TCP/IP und USB->RS232 (FTDI) und auch noch Multi-Threadfähig ist.
Dies mit gutem Handbuch ohne "Erpressungs-Dongle" und zudem Kostenlos ...... Oh Wunder! Mein Komunikationsmodul war damit in 2 Stunden fertig.

Dennoch danke für eure Tips.


Cu Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Modbus

Beitrag von Koverhage »

Könntest Du uns noch sagen wo es die DLL gibt ?
Eine Kennzeichnung des Themas als erledigt wäre auch nicht schlecht ;-)
Gruß
Klaus
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Modbus

Beitrag von UliTs »

Koverhage hat geschrieben:den Link dazu hatte ich oben schon geposted.
Stimmt. Die ursprüngliche Quelle habe ich übersehen :D . Aber ich finde, die abgewandelte Klasse ist intuitiver zu benutzen 8) .
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten