Beckhoff CX5130 Verbindung Unity über Modbus

Beckhoff_SPS

Level-1
Beiträge
32
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte gerne meine Beckhoff CX5130 über Unity ansteuern. Dafür habe ich die Klassen PLCModbus und EasyModbus herruntergelanden. Nun weiß ich jedoch leider nicht, wie ich diese mit meiner SPS verknüpfen kann und Werte aus der SPS auslesen kann? In der Session wird ein neuer ModbusPoller erstellt:
Code:
this.Poller = new ModbusPoller(host, port, queueCapacity, numAin, numDin, numDout, pollingDelay);
Hängen diese Werte mit der Anzahl der Klemmen zusammen, die ich verwende? Wo kann ich die Klemmen sonst entsprechend konfigurieren?
 
Warum machst du nicht hier weiter?
Unity Kommunikation mit Beckhoff SPS

Ansonsten:
Schön das du weisst in welchem Context du dich bewegst bzw. was du schon hast/nicht hast. Ich weiss es nämlich nicht.
Konkret: Hast du in TwinCAT die Modbus Function installiert und aktiviert? Was für Modbus functions willst du nutzen? Bist du frei auf der CX-Steuerung in der Deklaration der %-Adressen?

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort.
Ja die Modbus Lizenz ist installiert und aktiviert. Ich würde gerne Modbus TCP nutzen, um Register zu Lesen und zu schreiben. Ich bin frei in der Wahl meiner % Adressen.
 
Für TC3:
Na dann leg mal eine Variable auf %MW0 in der PLC an und versuche sie per Modbus über die Funktion 3 (read Holding register) mit Offset 0x3000 zu lesen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wo mache ich das denn? In dem Programm was ich vorher auf die SPS spiele, oder in dem was ich über Unity aufrufe?
Wie Guga schon schrieb, in der SPS. Es müssen ja erstmal Variablen definiert sein die per Modbus übertragen werden können, allerdings müssen die Variablen bestimmte Namen haben. Schau Dir mal die Doku an, dann wird es vielleicht klarer.
Das Auslesen erfolgt dann natürlich über Unity.
 
Zuletzt bearbeitet:
Nun weiß ich leider nicht welche Funktion ich nehmen soll. In der Modbus TCP Bibliothek habe ich zum Einlesen die Funktionen FB_MBReadInputRegs, FB_MBReadInputs und FB_MBReadRegs zur Auswahl. Wann verwende ich welche dieser Funktionen?
 
Nun weiß ich leider nicht welche Funktion ich nehmen soll. In der Modbus TCP Bibliothek habe ich zum Einlesen die Funktionen FB_MBReadInputRegs, FB_MBReadInputs und FB_MBReadRegs zur Auswahl. Wann verwende ich welche dieser Funktionen?
Häh, ich dachte Du willst mit Unity Werte aus der SPS auslesen und nicht umgekehrt. In der SPS musst Du nur die Variablen anlegen und mit Leben füllen, Modbusmäßig muss da gar nichts programmiert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte gerne eine Kommunikation zwischen Unity und der SPS aufbauen, in der ich sowohl Werte in Unity vorgeben kann, die die SPS liest, als auch Werte aus der SPS in Unity einlesen und verarbeiten kann. Hier ist mir leider nicht klar, wodurch die Verbindung zwischen der SPS und Unity aufgebaut wird.
 
Vorab: ich habe keine detaillierte Ahnung von Twincat und "Unity" habe ich nur mal irgendwo gehört.

Was für ein Gerät meinst Du mit "Unity"?

Wo rufst Du diesen ModbusPoller auf? In der TwinCat SPS oder in dem "Unity" Gerät?
ModbusPoller klingt mir stark nach Modbus Client (der aktive Partner einer Modbus Kommunikation).
Das was Du beschreibst klingt aber eher so, als ob die SPS ein (passiver) Modbus Server sein müsste, und das (aktive) "Unity"-Teil ist der Client, der der SPS sagt, welche Werte er lesen will oder welche Werte die SPS einstellen soll.

Harald
 
Unity ist auf dem Leitrechner installiert.
Der ModbusPoller wird über Unity aufgerufen. Somit ist der Leitrechner mit Unity der Client und die SPS der Server.
Meine Frage ist nun wie wie ich vom Client auf den Server zugreifen kann?
 
Der Poller wird in der PLC Modbus Klasse aufgerufen, die vor einiger Zeit zum download zur Verfügung stand. Wie kann ich den Poller dann mit der Testvar aufrufen?
 
ich bin genervt - deshalb ist das hier jetzt mein letztes Lebenzeichen.
Das Lesen und Umsetzen wird dir keiner Abnehmen. Modbus ist Registerbasiert, es gibt keine Namen oder Tags. Und über Modbus gibt es tonnen von Infos im Netz um sich schlau zu machen.

Und dein Unity kennt hier augenscheinlich keiner und ich auch nicht. Welcher Parameter dort was macht musst du selber rausfinden.

Im Post #4 sagte ich das du den Offset 0x3000 per Modbus auslesen musst mit der Function 3 um die Variable die sich in der SPS auf %MW0 befindet auszulesen.
Mehr kann dir keiner liefern.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

um die Modbusverbindung zu testen habe ich anstelle von Unity nun erstmal ein weiteres TwinCat 3 Programm geschrieben welches meinen Client darstellt.
Somit habe ich meine Beckhoff SPS (CX5130) als Server konfiguriert und das lokale Twincat 3 Programm als Client.



Die Modbus Register der SPS lege ich als globale Variablen an. Dazu habe ich auf der SPS den folgenden Code implementiert:




Code:
VAR_GLOBAL 

 mb_Input_Coils      : ARRAY [0..255] OF BOOL;  //Register für Modbus TCP Kommunikation

   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



Für den Client habe ich folgenden Code implementiert:


Code:
PROGRAM POU

 VAR
 fbReadRegs :FB_MBReadRegs;
 
 Test    : ARRAY [0..255] OF WORD;
 
 bReadRegs :BOOL;
 bWriteRegs :BOOL;
 
 bBusy :BOOL;
 bError :BOOL;
 nErrId :UDINT;
 cbRead :UDINT;
 END_VAR
--------------------------------------------

  fbReadRegs( //Test Client
 //sIPAddr:='xxx', //IP-Adresse der SPS oder weglassen?

 nTCPPort := 502,
 nUnitID := 255,
 nMBAddr := 16#8000,
 cbLength:=SIZEOF(Test),
 pDestAddr:=ADR(Test),
 bExecute:=bReadRegs,
 tTimeout:=T#1S,
 bBusy=>bBusy,

 bError=>bError,
 nErrId=>nErrId,

 cbRead=>cbRead);​

Nun logge ich mich mit beiden Programmen ein und Force das erste Bit der Register auf der SPS in den globalen Variablen auf 1 und force bExecute auf True.

Anschließend erwarte ich, dass auch in meiner Variablen Test eine 1 steht.

Ich bin mir an der Stelle, die ich für die IP-Adresse markiert habe nicht sicher, was ich dort eintragen muss.

Wenn ich die IP Adresse des Rechners (Client) eintrage bekomme ich als nErrId 32771 und wenn ich dort die IP Adresse der SPS eintrage bekomme ich den Fehler 1861.
Ich habe auf der Beckhoff Webseite bereits nach dem Fehler gesucht, werde allerdings nicht so recht schlau daraus. Der Fehler 1861 bedeutet Timeout weil evtl. falsche Routeneinstellungen konfiguriert sind, was mich vermuten lässt, dass ich die IP Adresse des Rechners eintragen muss. Der Fehler 32771 ist mir unklar.


Welche IP Adresse muss ich eintragen? Und was kann die Ursache für den Fehler sein?
 
Ohne jetzt alles gelesen zu haben
Code:
nMBAddr := 16#8000,
ist mit Sicherheit nicht richtig. Außerdem kann Modbus maximal 125 Register mit einem Rutsch lesen.
INFO: Ein Array[0..255] umfasst 256 Elemente. Ist sicherlich auch nicht gewollt.
 
Danke für die Antwort.

Im User Manual zu Modbus TCP (https://download.beckhoff.com/download/document/automation/twincat3/TF6250_TC3_Modbus_TCP_DE.pdf) findet sich auf Seite 15 folgendes:

Damit auf die spezifizierten Modbus-Bereiche per ADS zugegriffen werden kann, fügen Sie bitte folgendeGlobalen Variablen zu Ihrem SPS-Projekt hinzu.
VAR_GLOBALmb_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

Die Adressen werden dort auf Seite 16 beschrieben mit:


Eingangs-Register (InputRegisters)0x8000 - 0x80FF

Deswegen habe ich die Array Länge und die nMBAddr so gewählt. Habe ich da etwas falsch verstanden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Beckhoff_SPS,

hast du die Kommunikation hinbekommen? Kannst du mir e.v. ein Beispiel zukommen lassen? Ich möchte aus meiner Solaranlage die Adressen 4001 bis 4016 auslesen und bekomme weder Daten noch eine Fehlermeldung.

MfG
Cap. Spock
 
Zurück
Oben