# Beckhoff und Modbus TCP



## luchs2a (31 März 2007)

Guten morgen,

wie die meisten habe ich ein Problem. Diesesmal eines in dem es um Verständniss geht. Seit ca 2 Wochen habe ich auf meinem Tisch ne Beckhoffkelmme BC9000 liegen und Schrittmotorklemmen KL2531 bzw KL2541 sowie ein paar I/O klemmen. das ganze zusammenstecken und mit der KS software per hand zu steuern ok geht.

nun meine probleme ich bin siemens verstrahlt. durch studium und diplomarbeit. ich bekommt sogesehen in der Beckhoffwelt fast nix hin. 

wir haben vor von linux aus per ethernet die schrittmotoren zu verfahren. mein bisheriger gedanke: für die BC ein programm schreiben (unter TwincadPLC) und dann von linux aus per modbus die steuersignal (in der form von fahre 5000 schritte CW). 

ich verzweifel hier aber schon daran das ich nicht weiß, wo und wie modbus in die variablen eingereift oder wo welches abbild liegt. ob ich erst eines erschaffen muss oder oder. bin total verwirrt.

zudem habe ich mir bisher nur solche ominoesen tolls geladen um modbus pakete zu erstellen da ich unter windows entwickle. da taucht immer wieder das feld slave auf ich kanns blso nicht zuordnen was das mit meiner steuerung zu tun haben soll. 

ich bin schon für jeden hinweiß auf ein verständliches datenbaltt oder how to dankbar  noch dankbarer wenns deutsch ist.
die anleitung die beckhoff zu modbus leifert halte ich für sehr dürftig die sind irgendwie sehr auf ihrer twincad geschichte verblendet und sehen leider nicht das man auch hin und wieder was anders machen muss außer windows (firmenpolitk)

naja erstmal so als überblick wäre schön wenn ihr mir helfen könntet

als gegenangebot kann ich nur sagen, wer probleme mit µc oder elektronik allgemein hat. fragt ruhig im elektronik-projekt forum. da helf ich euch dann gerne 

Mischa


----------



## pvbrowser (31 März 2007)

Als Einstieg in Modbus:
http://www.beckhoff.de/german/default.htm?fieldbusbox/b730.htm
Aber google sollte weiter helfen.
Die richtige Spezifikation gibts aber glaube ich nur in Englisch.

Wenn Du Modbus unter Linux+Windows nutzen willst,
schau Die doch mal unser Projekt
http://pvbrowser.org
an.
Eine deutsche Doku findest Du in unserer wiki.
http://pvbrowser.de/pvbrowser/index.php?menu=7&topic=7

In pvbrowser braucht man im Prinzip nur eine INI Datei ausfüllen,
um auf Modbus zugreifen zu können.
Den Server kannst Du unter Linux laufen lassen und
dann mit den Clients für Linux + Windows drauf zugreifen.

Am einfachsten kannst Du zugreifen, wenn Du Merker
M0...Mn definierst.
Dann ist M0 register 0 zugeordnet.

Viel Erfolg:
pvbrowser


----------



## peewit (31 März 2007)

wir haben vor von linux aus per ethernet die schrittmotoren zu verfahren


Du brauchst zumindest einmal unter deinen Linux die passende Routinen
die Modbus TCP-IP für dich abwickeln.

Slaveadresse ist der Modbus-Seriell die Stationsadresse
und bei Modbus-TCP-IP die IP-Adresse der E/A-Station
(musst du natürlich vorher vergeben !)

Die lokalbusmodule am Beckhoff-Ethernetbuskopf werden automatisch
adressiert (nachzulesen im Handbuch der Busklemme)

Die Module werden in Adressraum 0-X für binäre Signale und 0-X für Analoge signale gebündelt. Mittels der verschienden FCxx Befehle kannst du diese Register/Coil lesen und schreiben.

Da ich das ganze hier nicht in kürze beschreiben kann, solltest du dir auf jedenfall das Handbuch der Beckhoff-Busklemme durchlesen und von der modbus.org Homepage kannst du dir diverse Doku/Infos/Test-Treiber runterladen.

Ich habe das schon oft mit Modulen von Phoenix-Contact gemacht, das ist 
überhaupt kein Problem, dort geht man einmal in den Plug&Play Mode dann ist die Stationskonfiguration automatisch erzeugt, und man kann zwischen
Standardmode (wie Beckhoff) und die dynamischen Modbustabellen wählen
Bei dynmischen Modbustabellen kann ich mit einen Lese und Schreibbefehl alle Signale verarbeiten.


----------



## pvbrowser (31 März 2007)

peewit schrieb:


> wir haben vor von linux aus per ethernet die schrittmotoren zu verfahren
> 
> Du brauchst zumindest einmal unter deinen Linux die passende Routinen
> die Modbus TCP-IP für dich abwickeln.



Den Zugriff auf Modbus unter Linux haben wir in pvbrowser integriert.

Hier ist die Basisklasse für den Modbus Zugriff,
(geht unter Linux+Windows und Seriell + TCP)
http://pvbrowser.de/pvbrowser/sf/manual/rllib/html/classrlModbus.html


----------



## luchs2a (1 April 2007)

nabend,

Danke das ihr geantwortet habt. anscheined habe ich zu schwammig gefragt oder verstehe eure antworten nicht. 

so ich bin gerade auf arbeit und es wird noch immer nix. 

also ich habe hier zum testen folgendes programm von http://www.modbustools.com/ als testversion geladen. damit kann man angeblich einzelne modbusbefehle schicken.

Das Datenblatt zum Koppler habe ich mir schon vor 1 woche ausgeduckt und mehrmals zu gemüte gefüht. ich kann daraus nichts sinvolles zusammenhängendes ziehen. es mag ja die ethernetgeschichte mit ihren kabelsorten schön und ausführlich beschrieben aber das was interessant is geht unter (aus meiner sicht).

also wo und wie greife ich von modbus  auf variablen zu? wo müssen die liegen und wie deklariere ich sie? oder greife ich doch direkt auf meine K-busklemmen zu und nicht auf das abbild im BC?

die routinen für linux werden bei uns im hause von einer anderen gruppe erstellt. denn mus sich dann "nur" sagen was wann zu passieren hat ;-).


im datenblatt auf seite 80 das modbusTCP-protokoll is mir klar
aber was will man mir zB. auf seite 81 mit modbusTCP-interface sagen ? is für mich nen fragment das auch mal abgedruckt werden musste.

ich bin mir fast sicher das mir 2-3 kleinigkeiten zum gesammtverständniss fehlen damit es ein bild ergibt. bisher isses nur buchstabensuppe.


Mischa


----------



## pvbrowser (2 April 2007)

Vielleicht hilft Dir ja das weiter:

http://www.modbus.org/specs.php

PS: Wir haben Modbus anhand von PI_MODBUS_300.pdf implementiert.


----------



## pvbrowser (2 April 2007)

Die über Modbus adressierten Variablen können sonst wo liegen.
Bei einer Schneider/Telemechanique Twido SPS liegen z.B. M0...Mn auf Modbus Adr 0 ... n
Du musst also ins Handbuch deines SPS Anbieters sehen, wenn Du das Mapping wissen möchtest.


----------



## ge_org (2 April 2007)

Vielleicht hilft Dir das:

Verwende Cimrex41 von Beijer an BC9000. Kommunikation über Modbus und globale Merker am BC9000. Startadresse beim Panel für MW 0 ist 44000. Am BC9000 habe ich nichts gemacht, ausser die für die Kommunikation zum Panel wichtigen Variablen auf globale Merker gelegt.
z.B. m_hmi_symbol_vakuumpumpe_ein AT %MX2.5 : BOOL;
ist dann bei Cimrex Adresse 44001.5 (hoffe ich jetzt mal);
Georg


----------



## Zottel (3 April 2007)

luchs2a schrieb:


> ...
> wir haben vor von linux aus per ethernet die schrittmotoren zu verfahren. mein bisheriger gedanke: für die BC ein programm schreiben (unter TwincadPLC) und dann von linux aus per modbus die steuersignal (in der form von fahre 5000 schritte CW).


Um Modbus zu benutzen, mußt du ein paar Variablen definieren, die auf speziellen Adressen liegen (ab 2048 oder 2049 wenn ich mich recht erinnere). Diese kannst du dann als Register 1 usw. über Modbus beschreiben. Leider ist die Anzahl der auf Modbus abbildbaren Variablen recht beschränkt (wenn ich es nicht falsch verstanden habe).
Daher habe ich vor einiger Zeit mal das Beckhoff-eigene Protokoll ADS für Linux implementiert. Damit hast du Zugriff auf alle Speicherbereiche der Steuerung.
Den Quellcode findest du im Anhang. Laß die Endung .zip weg, sie ist nur für die Forum-Software.


----------



## luchs2a (3 April 2007)

hallo, 

erstmal danke für die weiteren informativen antworten habe es mittlerweile auch geschafft. für alle die ne grundlagenlösung suchen das wäre meine 

```
PROGRAM MAIN
VAR
	zustand: BYTE;
	posGesetzt: BOOL;
END_VAR

VAR_INPUT
	statusbyte AT %IB6: BYTE;
	datain AT %IW8:WORD;
END_VAR

VAR_OUTPUT
	controlbyte AT %QB6 :BYTE;
	dataout AT %QW8: WORD;
	ziellow AT %MW0: WORD;
	zielhigh AT %MW2: WORD;
	starten AT %MW4: WORD;
	regsitercom AT %MW6: WORD;
	einschalten AT %MW8: WORD;
	stop AT %MW10: WORD;
END_VAR
```


```
IF (regsitercom >0) THEN
	regsitercom:=0;
	zustand:= 10;
END_IF

IF ( (starten>0) AND (zustand=0)) THEN
	starten:=0;
	controlbyte:=2#00000101;
END_IF

IF ( (einschalten>0) AND (zustand=0)) THEN
	einschalten:=0;
	controlbyte:=2#00000001;
END_IF

IF ( stop>0) THEN
	stop:=0;
	controlbyte:=2#00000001;
	zustand:=0;
END_IF

CASE zustand OF
0:   zustand:=0;			(*nischt *)
10:  controlbyte := 16#DF; 				(*registerkomm auf register 31*)
        dataout := 16#1235; 				(*schreibschutz aufheben*)
	zustand := 20;
20: 	IF ( statusbyte <> controlbyte ) THEN
	controlbyte:= 2#11000000+2; 		(* registerkomm + registernummer (ziel pos niedriges wort) *)
	dataout:=ziellow;
	zustand:=30;
	END_IF
30:	IF ( statusbyte <> controlbyte ) THEN
	controlbyte:= 2#11000000+3; 		(* registerkomm + registernummer (ziel pos high wort) *)
	dataout:=zielhigh;
	zustand:=40;
	END_IF
40:	IF ( statusbyte <> controlbyte ) THEN
	controlbyte:= 2#11000000+31; 		(* registerkomm + registernummer (codewort register) *)
	dataout:=16#0000;  				(* schreibschutz widerherstellen*)
	zustand:=50;
	posGesetzt:=1;
	END_IF
50:	zustand:=0;
END_CASE
```

es ist eine absolut rudimentäre lösung  die grundeinstellungen ahbe ich mit der KS software vorgenommen mir ging es bis zu diesem punkt erstmal um das grundlagenverständnis. das habe ich erstmal in grundzügen erreicht.

in der von mir angegebenen software folgende adressen beschreiben !dez angaben:

adrr: 16384 ziel low word
adrr: 16384 zeil high word
adrr: 16387 regsiter komm starten
adrr: 16388 kelmme einschalten 
adrr: 16386 verfahren straten
adrr: 16389 verfahren stoppen / quitieren 

@zottel  das mit der libary werde ich unserer IT weiterleiten.
is halt ne politische frage, ob modbus oder ads. was wäre denn aus geschwindigkeitssicht zu empfehlen?  wie siehts aus wenn beckhoff nochmal darin rum pfuscht?

soweit ich verstanden habe kann ich 511 merkerwörter für die kommunikation zur verfügung. inwiewiet da noch was für andere variablen angeht keine ahnung.
mal sehen was ich da für ein konstuckt entwerfe.... .  .

was ich erstmal von der aktion mit nehem das ich mit der doku von beckhoff nichts so richtig anfangen kann ich halte sie für unausgegoren.

so denn 

Mischa


----------



## Telefisch (28 Juli 2017)

Ich weiß, dass das Thema schon etwas verstaubt ist aber dennoch hole ich den Threat nochmal vor.
Ich versuche per Modbus auf meine CX9020 zuzugreifen.
ModbusTCP-Server-Supplement ist installiert.
Wenn ich den obigen Beitrag richtig verstehe kann ich direkt auf die Merker-Bereiche zugreifen aber ich bekomme irgendwie keine Reaktion.
Welche Adresse muss ich denn ansprechen, wenn ich MW0 lesen / schreiben will?
Wie bekomme ich direkten Zugriff auf die IO-Ebene (uner welchem Adressbereich)?
Ich muss gestehen dass ich totaler Noob mit TwinCat2 bin und dieses Projekt meine eigene Lichtsteuerung ist.
Hoffe dass mir trotzdem jemand helfen kann.

Danke und Gruss


----------



## pvbrowser (28 Juli 2017)

Das hier finde ich ganz hilfreich:
http://www.simplymodbus.ca/FAQ.htm#Stored


----------



## hicom500 (28 Juli 2017)

Ich nutze auch die Modbus Schnittstelle bei meiner CX9020 um von IPS Symcon drauf zuzugreifen-
Du must diese Arrays global anlegen:

    mb_Input_Coils          : ARRAY [0..255] OF BOOL;
    mb_Output_Coils        : ARRAY [0..255] OF BOOL;   
    mb_Input_Registers    : ARRAY [0..255] OF WORD;
    mb_Output_Registers : ARRAY [0..255] OF WORD; 

zur Kommunikation nutze ich aber nur die mb_Output _coils für Boolesche Variablen
und mb_Output_Registers für Word Variablen. Die Werte finden sich jeweils ab Modbus Adresse 32768.
Gutes Testprg ist z.B. Modbus Poll: http://www.tucows.com/preview/502459/Modbus-Poll

Gruß
Jürgen


----------



## Telefisch (28 Juli 2017)

Danke erstmal, dann will ich mal etwas experimentieren...


----------



## Telefisch (28 Juli 2017)

Hmm...
also mit Simply Modbus klappt der Zugriff...
Jetzt muss ich nur noch meine Smart-Home Anwendung überzeugen 

Also erstmal Danke bis hierher


----------



## hicom500 (28 Juli 2017)

Ja ganz genau, wie gesagt lade dir mal das Testprg runter, damit kann man das super testen


----------



## hicom500 (29 Juli 2017)

was hast du für eine Smart Home Anwendung?


----------



## Telefisch (29 Juli 2017)

IoBroker. 
Läuft mittlerweile auch. 
Problem war, dass der Modbus Adapter eine Alias-Adressierung vorgenommen hat und damit die Adressen auf einen anderen Adressbereich gemappt hat. 
Nach deaktivieren klappte es sofort. 
Also alles schick. Danke nochmal für die Hilfe. 

Gruß Carsten


----------



## domme (5 Oktober 2017)

Moin, 

ich habe ebenfalls eine Beckhoff CX9020.
Nun habe ich auch vom IOBroker gehört und bin erstmal ganzt angetan. Allerdings kenne ich mich mit Modbus gar nicht aus.
Wie bekomme ich es eingerichtet auf der Twincat Ebene.
Läuft das stabil bzw bist du zufrieden mit der Kombi CX9020 <--> IO-Broker?

Was kostet die Lizenz?


----------



## Telefisch (5 Oktober 2017)

Die Serverlizenz liegt irgendwo bei 65.
Eigentlich ist das relativ einfach zu verknüpfeln.
Sorry, wenn ich mich hier manchmal etwas unerfahren ausdrücke aber ich bin kein Programmierer sondern Schaltanlagen-Planer und deswegen nur Hobbymäßig mit der SPS-Programmierung betraut.

Also, nachdem die Serverlizenz installiert ist werden alle Anfragen an den Modbus auf fixe Adressen gemappt.
Ich selber benutze nur die Output Coils, da das anscheinend die einzigen Variablen sind, die man lesen und schreiben kann.

Im Twincat PLC legst Du unter Resourcen die folgenden Globalen Variablen an:

```
VAR_GLOBAL
	mb_Input_Coils : ARRAY [0..255] OF BOOL;
	mb_Output_Coils : ARRAY [0..255] OF BOOL;
	mb_Input_Registers : ARRAY [0..255] OF WORD;
	mb_Output_Registers : ARRAY [0..255] OF WORD;
END_VAR
```
...je nachdem, welche Du brauchst.
Wie gesagt, ich benutze nur die Output-Coils.

An Deinem Baustein kannst Du dann direkt auf ein Bit dieser Arrays zugreifen (hier Bit 201)

```
mb_Output_Coils[201]
```

Ich habe jeweils eine Adresse für das Tastsignal und eine Adresse am Ausgang des jeweiligen Bausteins als Statusbit für den iobroker angelegt.

Im ioBroker legst Du dann im modbus-Adapter diskrete Ausgänge an (die man auch später als Status-Eingang lesen kann).
Hier ist im Grunde die erste Coil-Adresse ab Adresse 32768.
mb_Output_Coils[0] entspricht also Diskretem Ausgang 32768.

Wenn ich mich noch recht erinnere musste im iobroker modbus-Adapter der Haken bei Aliases benutzen entfernt werden.

Was jetzt etwas blöd ist, ist die Tatsache, dass die meisten iobroker-widgets kein Tastsignal nehmen sonden von einem Schaltsignal ausgehen. (Amazon Alexa im übrigen auch)
Daher hab ich dazu noch ein kleines Script für jeden Beckhoff-io im iobroker angelegt, der mir einen Schalter quasi simuliert.
Aber die Details können wir dann gerne im iobroker-forum klären.
...da hab ich auch schon mal beschrieben wie es aktuell bei mir läuft.

Falls noch Fragen offen sind, schreib mich gerne an.

Gruß Carsten


----------

