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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: S7-300 ET200sp Modbus CM

  1. #1
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi zusammen

    Ich versuche mich das erste mal an den ET200sp CM für Freeport und R3964.
    Erstmal wollte ich es mit ET200sp und Modbus RTU probieren.

    Ich hab mal ein kleines Beispielprogramm zusammengestiefelt. Aber laufen tut es leider noch überhaupt nicht.
    https://www.dropbox.com/sh/cvgv46rnp...cybGrfnha?dl=0

    Code:
    FUNCTION_BLOCK "Modbus_Serial"{ S7_Optimized_Access := 'FALSE' }
    VERSION : 0.1
       VAR_INPUT 
          ID : Word;
          Port : Int;
       END_VAR
    
    
       VAR 
          Req : Bool;
          Disconnect : Bool;
          Reset { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
          ResetTimer {OriginalPartName := 'TON'; LibVersion := '1.0'} : TON;   // Resettimer wenn Req zu lange ansteht, wird dieser Resetiert
          Zaehler : Int;
          R_TRIG_error : "Trigger";
          R_TRIG_Done : "Trigger";
          AktuellerLDB : Int;
          Status_Save : Word;
          ReqTrigger : "Trigger";
          Daten : Array[0..50] of Int;
          ErrTimer {OriginalPartName := 'TON'; LibVersion := '1.0'} : TON;   // Wenn Error länger als 3s ansteht werden Werte auf 0 gesetzt.
          Modbus_Master {OriginalPartName := 'Modbus_Master'; LibVersion := '2.3'} : Modbus_Master;
          Modbus_Comm_Load_Instance {OriginalPartName := 'Modbus_Comm_Load'; LibVersion := '3.0'} : Modbus_Comm_Load;
          Requestcount : Int;
       END_VAR
    
    
       VAR_TEMP 
          index : Int;
          RET_val : Int;
       END_VAR
    
    
       VAR CONSTANT 
          Datenlaenge : Int := 20;
       END_VAR
    
    
    
    
    BEGIN
    	        #Modbus_Comm_Load_Instance.RETRIES := 4;
    	        #Modbus_Comm_Load_Instance.MODE := 4; // 4 für Halbduplex RS485 Zweidraht
    	        #Modbus_Comm_Load_Instance.BAUD := 9; // 9 für 57600
    	        #Modbus_Comm_Load_Instance.LINE_PRE := 0; // Keine Vorbelegung
    	        #Modbus_Comm_Load_Instance.PARITY := 2; // Gerade
    	        #Modbus_Comm_Load_Instance.FLOW_CTRL := 0; // keine
    	        #Modbus_Comm_Load_Instance.STOP_BITS := 1; // 1 Stopbit
    	        #Modbus_Comm_Load_Instance.RTS_OFF_DLY := 10; // 10ms
    	        #Modbus_Comm_Load_Instance.RTS_ON_DLY := 10; // 10ms
    	        #Modbus_Comm_Load_Instance.RESP_TO := 3000; // 3s auf Antwort warten
    	        #Modbus_Comm_Load_Instance."PORT" := INT_TO_WORD(#Port); // Port w#16#100 im Test
    	        
    	        "Tag_2" := NOT #Modbus_Comm_Load_Instance.COM_RST;
    	        
    	        #Modbus_Comm_Load_Instance(REQ:="Tag_2",
    	                                   MB_DB:=#Modbus_Master.MB_DB);
    	        
    	        #Modbus_Master(REQ:="Tag_3", // Hier #Req anschliessen wenn nicht im Test
    	           MB_ADDR:=#ID,
    	                        MODE:=0,
    	                        DATA_ADDR:=40001,
    	                        DATA_LEN:=5,
    	           DATA_PTR:=#Daten);
    	
    	
    	#ErrTimer(IN:=#Modbus_Master.ERROR,
    	          PT:=t#3s);
    	
    	
    	#Req := (#Modbus_Master.ERROR OR #Modbus_Master.DONE) AND NOT (#Modbus_Master.BUSY OR #Reset);
    	
    	#ResetTimer(IN:=#Req,
    	            PT:=t#10s,
    	            Q=>#Reset);
    	
    	IF #Modbus_Master.ERROR THEN
    	    #Status_Save := #Modbus_Master.STATUS;
    	    
    	END_IF;
    END_FUNCTION_BLOCK
    Ich Initialisiere den Load im OB100. Und sobald dieser den COM_RST zurücksetzt wird der Req des Load aktiviert und bleibt gesetzt.
    Soweit alles okay.

    Wenn ich jetzt aber den Req des Modbus Masters setze. Geht die CPU in Stop und zwar mit einer nicht wirklich nachvollziehbaren begründung.

    4 von 10; Ereignis-ID: 16# 4562
    STOP durch Programmierfehler (OB nicht geladen oder nicht möglich, bzw. kein FRB vorhanden )
    FB-Nummer: 613
    Bausteinadresse: 210
    Bisheriger Betriebszustand: RUN
    Angeforderter Betriebszustand: STOP (intern)
    02.05.2016 14:04:05.664




    5 von 10;
    Ereignis-ID: 16# 2522
    Bereichslängenfehler beim Lesen
    P-Bereich , Doppelwortzugriff, Zugriffsadresse: 65535
    Angeforderter OB: Programmierfehler-OB (OB 121)
    OB nicht vorhanden oder gesperrt oder nicht startbar im aktuellen Betriebszustand
    02.05.2016 14:04:05.660
    Jemand ne Idee was das sein kann? Ich wüsste gerne woher dieser Zugriff auf 65535 kommen kann? übergebe ich da irgendeinen Scheiss?
    FB613 ist der Send_P2P den die Siemensbibliothek einbindet wenn man die Modbus Bildbibliothek nutzt.

    mfG René
    Zitieren Zitieren S7-300 ET200sp Modbus CM  

  2. #2
    Registriert seit
    09.08.2006
    Beiträge
    3.627
    Danke
    912
    Erhielt 656 Danke für 542 Beiträge

    Standard

    kennst Du das:

    https://support.industry.siemens.com.../view/69124220

    nen Beispielprojekt scheint's da aber nicht zu geben...

  3. Folgender Benutzer sagt Danke zu ducati für den nützlichen Beitrag:

    vollmi (02.05.2016)

  4. #3
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Doch das Dokument kenn ich. Nach dem Arbeite ich auch. Nur wiederspricht das Dokument schon in der s7-1500 der TIA-Hilfe die man im TIA beim Auswählen des Bausteins geliefert bekommt. z.B. Baudrate. In der Hilfe steht
    Baudrate zulässige Werte: s7-1200/1500 int := 300,600,1200 etc.
    Baudrate zulässige Werte: s7-300/400 Word := 300,600,1200 etc.
    Handbuch s7300/400 Word := 1,2,3,4 für 300,600,1200etc.

    mfG René

  5. #4
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.344
    Danke
    450
    Erhielt 691 Danke für 516 Beiträge

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen
    Jemand ne Idee was das sein kann? Ich wüsste gerne woher dieser Zugriff auf 65535 kommen kann? übergebe ich da irgendeinen Scheiss?
    FB613 ist der Send_P2P den die Siemensbibliothek einbindet wenn man die Modbus Bildbibliothek nutzt
    Eine Variante wäre sowas....
    Code:
          L     0
          +     -1
          SLD   3
          LAR1
          L PEW [ AR1 , P#0.0 ]
    65535 ist auch W#16#FFFF.
    Wenn ich dein Beispiel in den Simulator lade, die CPU starte und den "Tag_3" auf True setze, dann steht in folgenden Variablen...
    • "Modbus_holen_DB".Modbus_Serial_Instance.Modbus_Master.MB_DB.S_PORT
    • "Modbus_holen_DB".Modbus_Serial_Instance.Modbus_Master.Send_P2P."PORT"
    • "Modbus_holen_DB".Modbus_Serial_Instance.Modbus_Master.Send_P2P.OldPORT
    • "Modbus_holen_DB".Modbus_Serial_Instance.Modbus_Master.Send_P2P.WRREC.ID

    ... der Wert W#16#FFFF.

    Grad beim WRREC-Baustein kann FFFF sicher nicht stimmen, auch der PORT am P2P-Eingang mit FFFF passt auch vermutlich nicht.
    Du könntest eventuell mal in diese Richtung suchen.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  6. #5
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.344
    Danke
    450
    Erhielt 691 Danke für 516 Beiträge

    Standard

    Das Problem scheint irgendwo bei der Initialisierung zu liegen.
    Wenn ich den deinen Code in den Simulator spiele und die CPU auf RUN schalte bleibt
    "Modbus_holen_DB".Modbus_Serial_Instance.Modbus_Master.MB_DB.S_PORT = W#16#FFFF.
    Das ist nämlich lustigerweise der Startwert im IDB.

    Wenn ich einfach so ne Zeile bei der ModBus_Comm_Load hinten dran hänge...
    Code:
    #Modbus_Comm_Load_Instance(REQ:="Tag_2",
                                       MB_DB:=#Modbus_Master.MB_DB
            );
            "Modbus_holen_DB".Modbus_Serial_Instance.Modbus_Master.MB_DB.S_PORT :=  #Modbus_Comm_Load_Instance."PORT";
    ... also den Port selbst noch lade, dann kann ich den "Tag_3" (Modbus_Master.REQ) auf high setzen und ich hab keine Diagnosereignisse am Simulator mehr.
    Das müsstest du halt mal mit der Hardware nachprüfen.

    Das Problem scheint also beim Modbus_Comm_Load zu sein
    Code:
    #Modbus_Comm_Load_Instance(REQ:="Tag_6",
                                       MB_DB:=#Modbus_Master.MB_DB
            );
            IF #Modbus_Comm_Load_Instance.DONE THEN "Tag_4" := True; END_IF;
            IF #Modbus_Comm_Load_Instance.ERROR THEN "Tag_5" := True; END_IF;
            IF #Modbus_Comm_Load_Instance.ERROR  THEN
                "Tag_7" := #Modbus_Comm_Load_Instance.STATUS;
            END_IF;
    Wenn ich den Status auswerte wird nachdem ich "Tag_6" einmal auf low/high setze auch das Error-Bit ("Tag_5") high und in "Tag_7" landet DW#16#8181.
    Prüf mal bei dir nach ob du zum selber Ergebnis kommst, wenn ja, dann sollte der Fehlercode Aufschluss darüber geben warum Modbus_Comm_Load nicht richtig tut.
    Geändert von RONIN (02.05.2016 um 21:48 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  7. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    vollmi (02.05.2016)

  8. #6
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Guten Morgen

    Danke Ronin. Ich wär ja heut nach fast nochmal ins Büro gefahren um das mit Hardware auszutesten.

    Es schein mindestens zwei Probleme zu geben. Die Init geht offenbar nicht durch die ganze instanz inkl. Modbus_Master.
    Also deinen Tip hinzugefügt und den Port nochmal im programm bei der Instanz von Modbus_Master eingetragen. (eigentlich ja übler Pfusch)
    Hat aber noch nicht ganz hingehauen. Das zweite hat bei mir auch Fehler W#16#8181. Welcher falsche Baudrate bedeutet.
    Also Baudrate entgegen dem Handbuch als 57600 direkt eingetragen.

    Jetzt geht
    #Modbus_Comm_Load_Instance.COM_RST ohne fehler
    #Modbus_Comm_Load_Instance.Req ohne Fehler
    #Modbus_Master.Req ebenfalls ohne fehler.

    Es trägt also keiner mehr einen Status mit Error ein. Aber trotzdem wird kein Telegramm abgesetzt wenn ich einen Req an Modbus_Master setze.

    Kann natürlich sein das ich einen Verdrahtungsfehler habe. Aber zumindest müsste doch ne negative Quittierung zurückkommen.

    Ich habe Das Programm auf der Dropbox aktualisiert.

    mfG René
    Geändert von vollmi (03.05.2016 um 07:04 Uhr)

  9. #7
    Registriert seit
    22.05.2005
    Ort
    sonniges Maifeld
    Beiträge
    1.067
    Danke
    77
    Erhielt 205 Danke für 159 Beiträge

    Standard

    Ich kämpfe grad mit dem gleichen Problem; allerdings bin ich schon einen Schritt weiter, Telegramme gehen raus, aber ich bekomme keine Antwort vom Slave.
    Erst habe ich auch kein Telegramm raus bekommen, das lag bei mir an einer falschen Base-Unit, die muss mit A0 enden.
    "Man kann auf seinem Standpunkt stehen, aber man sollte nicht darauf sitzen" - Erich Kästner

  10. #8
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Jetzt kriege ich auf einmal negative Quittierungen vom Modul (Fehler 0x8280) wenn ich den Req des Modbus_Master auslöse.

    Die Base-Unit habe ich eine A0 also mit Einspeisung.

  11. #9
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Weil ich den Status 8280 bekomme werte ich den RDREC aus wie im Handbuch beschrieben.
    Allerdings schmeisst dieser keine Statusänderung. Ich komme langsam zum schluss, dass das wieder so ne halbgare Sache ist was die da gebastelt haben.

    mfG René

  12. #10
    Registriert seit
    22.05.2005
    Ort
    sonniges Maifeld
    Beiträge
    1.067
    Danke
    77
    Erhielt 205 Danke für 159 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    So, ich kontaktiere jetzt mal den Support - die Einstellungen der Schnittstelle passen nicht. Die Karte ist in der HW-Konfig auf RS485 eingestellt, senden tut der Sauhund aber auf der RS232. In der Instanz vom Modbus_Comm_Load steht in MODE auch eine 0 und keine 4, das bestätigt meine Vermutung. Vielleicht passen die Bausteine für die 1500, aber nicht für die ET200SP...
    "Man kann auf seinem Standpunkt stehen, aber man sollte nicht darauf sitzen" - Erich Kästner

  13. Folgender Benutzer sagt Danke zu Lars Weiß für den nützlichen Beitrag:

    vollmi (03.05.2016)

Ähnliche Themen

  1. Step 7 Step7 Classic, ET200SP und Modbus
    Von sventek im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 29.09.2014, 13:24
  2. Step 7 S7-300 Modbus mit RS485
    Von Mike345 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 14.04.2014, 12:53
  3. S7-300 mit 8 ET200SP
    Von Grapefruuuut im Forum Simatic
    Antworten: 29
    Letzter Beitrag: 16.03.2013, 20:18
  4. ET 200 - S7 300 - Serielle Kommunikation (Modbus?!)
    Von saarlaender im Forum Feldbusse
    Antworten: 2
    Letzter Beitrag: 06.11.2011, 09:06
  5. Modbus und S7 300
    Von Taddy im Forum Feldbusse
    Antworten: 2
    Letzter Beitrag: 03.04.2006, 15:45

Lesezeichen

Berechtigungen

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