Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Wago "Modbus TCP"-Kommunikation mit 750-8100 (Master) und 852 (Slave) unter e!Cockpit

  1. #11
    aki09 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.03.2018
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Thruser,

    vielen Dank für die ganze Mühe, die du dir hier gemacht hast. Ich habe mir deine Programmierung mal angesehen und auf meine Steuerung übertragen - funktioniert einwandfrei.
    Mit dem Grundkonzept bin ich zumindest jetzt auf einem Stand, um eigenständig daran weiterarbeiten zu können.

    Vielen Dank dafür und ein schönes Wochenende!

  2. #12
    aki09 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.03.2018
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    ** hier sollte eigentlich keine neue Antwort stehen **

  3. #13
    aki09 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.03.2018
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo nochmal,

    mittlerweile bin ich schon ein paar Schritte weiter. Die Kommunikation zwischen Feldbuscontroller und Koppler läuft und ist soweit programmiert. Jetzt möchte ich eine weitere Modbus Verbindung zwischen einem "Nicht-Wago"-Modbusteilnehmer und dem Controller aufbauen und dafür die Eingänge und Ausgänge des Controllers schreiben / lesen.

    Dafür habe ich den Baustein "mySimpleTCPServer" verwendet in denen die folgenden Variablen initialisiert werden:
    Code:
    // Programm: ModbusSlave
        //------------------------------------------------------------------------------------
        myDiscreteInputs    :   ARRAY[0..20] OF BOOL;       // Modbus bit address 0 .. 20
        myCoils             :   ARRAY[0..20] OF BOOL;       // Modbus bit address 0 .. 20
        myInputRegisters    :   ARRAY[0..20] OF WORD;    // Modbus word address 0 .. 20
        myHoldingRegisters  :   ARRAY[0..20] OF WORD;       // Modbus word address   0 .. 20
        //------------------------------------------------------------------------------------
    Soweit ich verstanden habe, kann ich die Klemmen des Controllers mit den 4 Registern (DiscreteInputs, Coils, InputRegisters, HoldRegisters) deklarieren. Dafür habe ich folgenden Code geschrieben:

    Code:
    // Digitale Ausgänge
    IoConfig_Globals_Mapping.xOut11 := ModbusSlave.myCoils[0];
    IoConfig_Globals_Mapping.xOut12 := ModbusSlave.myCoils[1];
    IoConfig_Globals_Mapping.xOut21 := ModbusSlave.myCoils[2];
    IoConfig_Globals_Mapping.xOut22 := ModbusSlave.myCoils[3];
    
    // Analoge Eingänge
    xTemp11 := INT_TO_WORD(IoConfig_Globals_Mapping.xTemp11);     --> hab versucht mir das "zurechtzufuschen", aber auch das klappt nicht :eek:
    ModbusSlave.myInputRegisters[0] := IoConfig_Globals_Mapping.xTemp11;
    1. Die digitalen Ausgänge kann ich damit schreiben (-> OK). Ist diese Art der Initialisierung denn auch so vorgesehen, dass ich das myCoil[0..3] mit je einem Digitalausgang der Klemmen verknüpfe?
    2. Beim Auslesen der Temperaturen ist die Klemmenvariable "IoConfig_Globals_Mapping.xTemp11" als INT deklariert (vorzeichenbehaftet, Klemme ist ein AI für Temperatur TYP K Messung), das Register "ModbusSlave.myInputRegisters[0]" aber als WORD. Ich kann mir beim besten Willen nicht vorstellen, dass man die Klemmen mit den Registern auf diese Art und Weise deklariert. Zudem funktioniert das Auslesen der Temperatureingänge mit diesem Programmcode auch nicht. Fehler: "PLC_PRG: C0037: 'myInputRegisters' ist kein Eingang von 'ModbusSlave' (-> NOK)

    Beste Grüße
    Geändert von aki09 (26.04.2018 um 17:02 Uhr)

  4. #14
    Registriert seit
    20.01.2012
    Beiträge
    167
    Danke
    0
    Erhielt 58 Danke für 55 Beiträge

    Standard

    Hallo,

    groß weiterhelfen kann ich Dir da jetzt auch erst einmal nicht. Das müßte ich mir auche erst einmal ansehen. Habe sowieso noch nicht viel mit e!cockpit gemacht.

    Sehe ich das richtig, daß Du jetzt von einem anderen Gerät per Modbus auf den Controller zugreifen willst? Der Controller jetzt also als Slave/Server arbeiten soll?

    Ich würd da jetzt mal den entsprechenden Teil des Konfigurator nehmen.

    Ansonsten kann ich mir das erst zum Ende nächster Wocheansehen.

    Zitat Zitat von aki09 Beitrag anzeigen
    Zudem funktioniert das Auslesen der Temperatureingänge mit diesem Programmcode auch nicht. Fehler: "PLC_PRG: C0037: 'myInputRegisters' ist kein Eingang von 'ModbusSlave' (-> NOK)
    Du hast myInputRegisters wahrscheinlich nicht als VAR_INPUT deklariert. Das hatte ich damals auch bei der Jobliste.

    Gruß

  5. #15
    aki09 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.03.2018
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo zusammen,

    mittlerweile bin ich ein paar Schritte weitergekommen. Jetzt fehlt mir aber noch ein Punkt, für die ich noch keine Lösung gefunden habe.

    Rückfrage zum gleichzeitigen Schreiben/Lesen von Modbus Registern
    Ich benötige ein Feedback für die digitalen/analogen Ausgänge von meinem externen Endgerät. Hintergrund ist, dass ich sowohl vom Endgerät, als auch vom PFC die Ausgänge steuern möchte und dafür ein Feedback ("Ist der Ausgang jetzt an oder aus?!") benötige. Im Handbuch habe ich dafür folgenden Hinweis gefunden:

    Hinweis: „Lesen und Schreiben der Ausgänge bei FC1 bis FC4 auch durch Hinzuaddieren eines Offsets möglich! Bei den Lesefunktionen (FC1 ... FC4) können Sie zusätzlich die Ausgänge schreiben und zurücklesen, indem Sie für Adressen in dem Bereich [0 hex ... FF hex] ein Offset von 200hex (0x0200) und für Adressen in dem Bereich [6000 hex ... 62FChex] ein Offset von 1000hex (0x1000) zu der MODBUS-Adresse hinzu addieren“

    Meine Frage:
    Wie schaffe ich es, dass ich auf ein Modbus Register sowohl lesen, als auch schreiben kann? Wie ist das mit dem Offset genau gemeint? Mein Lösungsansatz, bei dem ich aber ab Adresse 0 schreibe und ab Adresse 512 lese (=> Offset von 0 + 512 = 512?):

    Code:
    PROGRAM ModbusMaster
    VAR
    FB_ModbusMasterTCP:FbMbMasterTcp;
           Jobliste: ARRAY [0..1] OF typMbQuery := [ 
            ( //JOB 0, Eingänge lesen (Registerzugriff, inklusive digitale Eingänge)
                bUnitId:= 1, 
                bFunctionCode:= 4,   // FC4 'Read Input Registers' -> Lesen der digitalen und analogen Eingänge
                uiReadAddress:= 0, 
                uiReadQuantity:= 3, 
                uiWriteAddress:= 0, 
                uiWriteQuantity:= 0, 
                awWriteData:= [125(0)]
            ),
            ( //JOB 1, Ausgänge schreiben/lesen (Registerzugriff)
                bUnitId:= 1, 
                bFunctionCode:= 1,     // FC1 'Force Multiple Coils' -> Schreiben & Lesen der Register
                uiReadAddress:= 512, 
                uiReadQuantity:= 4, 
                uiWriteAddress:= 0, 
                uiWriteQuantity:= 4, 
                awWriteData:= [125(0)]
            )];
            Responseliste:ARRAY [0..1] OF typMbResponse;
        
            // Um Array "Jobliste" und "Responseliste" zu triggern     
            iJobCounter:INT:=0;
            xTrigger:BOOL:=TRUE;
            FB_F_Trig:F_Trig;
    END_VAR
    Bei der Modbus Verbindung zwischen meinem externen Endgerät und einem 352 lässt sich das alles in einem Register (schreiben/lesen) umsetzen. Von meinem externen Endgerät wird das auch sofort erkannt, wenn der Zustand sich ändert. Was muss ich dafür beim PFC tun, damit ich das Feedback dort auch bekomme?
    Geändert von aki09 (11.05.2018 um 14:48 Uhr)

  6. #16
    aki09 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.03.2018
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich sehe da aktuell ein Problem beim Aufbau des Netzwerks, wodurch ich Probleme mit dem "Feedback" der digitalen und analogen Ausgänge bekomme. Ich vermute, dass ich bei dem derzeitigen Programmaufbau grundlegend etwas falsch gemacht habe und ich da erstmal ansetzen muss.

    Was habe ich gemacht?
    3 POUs habe ich derzeit eingebunden (PLC_PRG, ModbusMaster mit dem ModbusMasterTCP-Funktionsbaustein, ModbusSlave mit dem SimpleTCPServer-Funktionsbaustein).

    Folgende Idee steckt dahinter:
    - Externes Endgerät soll als Master gegenüber PFC und FC arbeiten
    - PFC soll als Slave zum externen Endgerät arbeiten und als Master zum Koppler
    - Sowohl PFC, als auch Endgerät sollen Ausgänge steuern (Endgerät ist höher priorisiert!)

    Was funktioniert und was nicht?
    - Das Lesen der digitalen/analogen Eingänge funktioniert einwandfrei -> OK
    - Das Schreiben der digitalen/analogen Ausgänge (auf PFC) funktioniert, wenn ich vom Endgerät aus schreibe und/oder vom PFC (über e!COCKPIT). In e!COCKPIT sehe ich auch die Zustandsänderung des Ausgangs, wenn ich vom Endgerät aus schalte. -> OK
    - Auf externem Endgerät sehe ich keine Zustandsänderung, wenn ich von e!COCKPIT die Ausgänge ansteuere. Weder bei den Ausgängen des PFCs, noch bei den des FCs (Feedback fehlt!). -> NOK
    - Das Schreiben vom Endgerät auf FC funktioniert prinzipiell, allerdings setzt mein Programm den Ausgang direkt wieder zurück. Ich habe keine Ahnung, wie ich das verhindern kann. -> NOK

    Ich verzweifle gerade wirklich an diesem fehlendem Feedback und das ich vom externen Endgerät nicht die Ausgänge des FCs vernünftig anteuern kann.

    Ansatz zur Problemlösung
    Ich würde versuchen vom Endgerät in Zukunft in die Merker-Register zu schreiben (als Ausgänge deklariert), die über e!COCKPIT auszulesen und dann von dort aus in die Modbus-Prozessabbilder zu schreiben? Am Montag möchte ich das mal versuchen. Beim FC fängt MX0 bei 0x3000 bzw 12288 an. Wieso finde ich das im Manual vom PFC nicht?
    Geändert von aki09 (12.05.2018 um 15:31 Uhr)

  7. #17
    aki09 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.03.2018
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Problem gelöst:
    Externes Endgerät als Master und PFC als Slave konfiguriert. Verbindung zwischen generischem Modbus Master (externem Endgerät) via Feldbuskonfigurator machen (mit Linie verbinden).
    Über SimpleServerTCP lassen sich die Modbus Adressen, je nach Deklarierung der Arrays (InputRegister[0..10] = Modbusadresse 0..10) in die passenden Adressregister schreiben.

    Mein Beispiel Code:
    Code:
    // Deklarierung von Modbus Telegrammen (von externem Endgerät) in Merker-Register (Adressbereich 0..20)
    // Eingehende Modbus Telegramme von MSE (Master)
    Merker1_IN_REG := ModbusSlave.myHoldingRegisters[0];
    Merker2_IN_REG := ModbusSlave.myHoldingRegisters[1];
    Merker3_IN_COIL := ModbusSlave.myCoils[0];
    Merker4_IN_COIL := ModbusSlave.myCoils[1];
     
    // Deklarierung von Modbus Telegrammen (von Endgerät) in Merker-Register (Adressbereich 0..20)
    // Ausgehende Modbus Telegramme von PFC (Slave), Anfrage von MSE (Master)
    ModbusSlave.myInputRegisters[0] := Merker1_OUT_REG;
    ModbusSlave.myInputRegisters[1] := Merker2_OUT_REG;
    ModbusSlave.myDiscreteInputs[0] := Merker3_OUT_COIL;
    ModbusSlave.myDiscreteInputs[1] := Merker4_OUT_COIL;

Ähnliche Themen

  1. Antworten: 21
    Letzter Beitrag: 09.02.2018, 15:05
  2. Wago 750-871 "Neu" ETHERNET TCP/IP, 2 Ports 32-Bit-CPU
    Von Wago750 im Forum Suche - Biete
    Antworten: 0
    Letzter Beitrag: 14.04.2017, 17:15
  3. WAGO 750-881 Modbus Master Slave
    Von Sait Fistikci im Forum WAGO
    Antworten: 9
    Letzter Beitrag: 06.03.2017, 16:33
  4. Antworten: 3
    Letzter Beitrag: 01.04.2015, 17:40
  5. Modbus UDP mit 3x WAGO 750-852
    Von Ampel03 im Forum WAGO
    Antworten: 1
    Letzter Beitrag: 24.02.2014, 14:46

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •