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

Ergebnis 1 bis 2 von 2

Thema: e!Cockpit Modbus-TCP

  1. #1
    Registriert seit
    04.06.2018
    Beiträge
    1
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich bin neu hier und versuche seit einiger Zeit mit einer Wago PFC200 eine elektronische Last anzusteuern. Zur Kommunikation dient ein zusätzliches Modul an der Last. Dieses erlaubt die Kommunikation via Modbus TCP (auf dem Port 502) und Modbus RTU (auf dem Standard-Port 5025 und allen anderen). Die Daten selbst werden über ein Patchkabel übertragen.
    Ich arbeite in e!Cockpit mit dem Baustein FbMbMasterTcp, um mit Modbus TCP die Last anzusteuern, was soweit auch ganz gut funktioniert. Nun möchte ich ein Programm (ModbusTCP_1), das sich um die wiederkehrenden Standardanfragen kümmert. Dieses wird regelmäßig von PLC_PRG aufgerufen und bekommt nur die Daten mit, die übergeben werden. Die Register sind schon im Programm deklariert. In PLC_PRG werden die Daten verarbeitet bzw. weitergeleitet, was auch klappt.


    Nun habe ich zwei Probleme, die ich nicht gelöst bekomme:

    Problem 1: Ich kann einzelne Register nicht auslesen. Konkret geht es hier um die aktuellen Messwerte der Last. Ich empfange das Echo, welches besagt, dass ich die Register auslesen möchte, awData bleibt jedoch leer (0).

    Problem 2 (ist vermutlich simpler): Ich möchte in drei unterschiedliche Register nacheinander verschiedene Werte schreiben und anschließend drei weitere Register auslesen. Das Ganze soll noch mit einer IF-Bedingung kombiniert werden, sodass die nächste Anfrage nur gesendet wird, wenn die Anfrage, die zuletzt gesendet wurde, in utResponse zu finden ist. Eigentlich dachte ich, ich könnte das recht einfach lösen, aber alle Versuche und auch ein Lösungsvorschlag mit einer Joblist, aus einem anderen Beitrag hier, haben bei mir nur zu Fehlern geführt (zumal ich die Register nicht auslesen kann, siehe erstes Problem).

    Die Variablen hätte ich wie folgt deklariert:
    Code:
    PROGRAM ModbusTCP_1
    VAR_INPUT
        // Sollwerte von U I und P  werden übergeben und sollen nacheinander gesendet werden.
        // Wurde ein Wert gesendet soll erst die Antwort (ein Echo) überprüft werden
        // im Anschluss werden die Werte gemessen und zurück ans Hauptprogramm gegebenausgegeben. 
        
        wertU:        WORD;
        wertI:        WORD;
        wertP:        WORD;
        // Istwert Strom lesen: (regNr:=16#03, readAdd:= 16#01FB, readQua:=1, writAdd:=0, writQua:=0);
        // Istwert Spannung lesen: (regNr:=16#03, readAdd:= 16#01FC, readQua:=1, writAdd:=0, writQua:=0);
        // Istwert Leistung lesen: (regNr:=16#03, readAdd:= 16#01FD, readQua:=1, writAdd:=0, writQua:=0);
    END_VAR
    VAR_OUTPUT
        messWertU:        WORD;
        messWertI:        WORD;
        messWertP:        WORD;
    END_VAR
    VAR
        // Spannung    
        regNrU:        BYTE := 16#06;
        writAddU:    WORD := 16#01F4;
        writQuaU:    WORD := 1;
        // Strom
        regNrI:        BYTE := 16#06;
        writAddI:    WORD := 16#01F5;
        writQuaI:    WORD := 1;
        // Leistung
        regNrP:        BYTE := 16#06;
        writAddP:    WORD := 16#01F6;
        writQuaP:    WORD := 1;
            
        myTcpMaster     : FbMbMasterTcp :=  (  xConnect        := TRUE,
                                               sHost        := '192.168.1.6',    // IP of the remote server
                                               wPort        := 502,                // port at the remote server
    
                                                utKeepAlive    := (    xEnable      := TRUE, // use keep alive
                                                                    tMaxIdleTime := T#5S, //  Maximum time of inactivity
                                                                    tInterval    := T#2S, //  Interval between two successive KA-Packets
                                                                    udiProbes    := 5     //  Number of KA retry before giving up
                                                                ),
                                                                
                                                eFrameType  := eMbFrameType.ETHERNET,
                                                tTimeOut    := T#30MS
                                            );
    
        utQuery         : typMbQuery := (   bUnitId         := 0,            // Slaveaddress
                                            bFunctionCode   := 0,            // write input registers
                                            uiReadAddress   := 0,            // Startaddress
                                            uiReadQuantity  := 0,            // Quantity of wanted registers
                                            uiWriteAddress  := 0,            // Startadresse
                                            uiWriteQuantity := 0,            // Quantity of wanted registers
                                            awWriteData        := [124(0)]        // array to write
                                        );
    
        xTxTrigger      : BOOL;             (* Set this variable once for start a job. This variable will be automaticly reset by the master if the job is done.*)
        utResponse      : typMbResponse;    (* After the job is done you can find at this structure the result.*)
        tonDelay        : TON := (PT := T#30MS); // This is the silence time between two requests
    END_VAR
    Im Programm wollte ich bFuctionCode bis awWriteData immer mit den passenden Informationen überschreiben.

    Ich muss dazu sagen, ich hatte mit Wago und Modbus noch nie etwas am Hut und bin, was das angeht, absoluter Anfänger. Verschiedene Dokus und das ein oder andere Video hatten mich bei meinen Problemen leider nicht groß weitergebracht.
    Bin für jeden Tipp dankbar.


    Viele Dank.
    Zitieren Zitieren e!Cockpit Modbus-TCP  

  2. #2
    Registriert seit
    20.01.2012
    Beiträge
    130
    Danke
    0
    Erhielt 50 Danke für 47 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    hast Du denn schon einmal das auch in dem anderen Beitrag erwähnte qmodmaster oder ähnliches ausprobiert?

    Wie fragst Du denn die Daten im Programm ab, könntest Du eventuell mal den Teil des Codes zeigen? Da Du die Daten hier jetzt einzeln abfragst mußt Du auch erst jedesmal abwarten bis ein Auftrag fertiggestellt ist. Mit der Jobliste wären das bereits drei einzelne Jobs.

    Da die drei Adressen aufeinanderfolgen solltest Du versuchen die Daten in einem Rutsch, d.h. mit einem Auftrag, zu lesen (readQua:=3). Das minimiert die Ablaufzeit und die zu übertragende Datenmenge erheblich..

    Gruß

    PS: Warum benutzt Du nicht den Modbuskonfigurator von e!cockpit?
    Geändert von Thruser (13.06.2018 um 12:16 Uhr)

Ähnliche Themen

  1. Antworten: 16
    Letzter Beitrag: 17.05.2018, 11:22
  2. Antworten: 2
    Letzter Beitrag: 19.01.2018, 10:37
  3. Antworten: 1
    Letzter Beitrag: 03.11.2016, 16:28
  4. Antworten: 13
    Letzter Beitrag: 27.06.2016, 18:00
  5. Antworten: 3
    Letzter Beitrag: 18.09.2015, 07:28

Stichworte

Lesezeichen

Berechtigungen

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