- Beiträge
- 5.848
- Reaktionspunkte
- 1.774
-> 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/cvgv46rnp71k1x0/AAA7SThEDro2aajZcybGrfnha?dl=0
	
	
	
		
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.
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é
	
		
			
		
		
	
				
			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/cvgv46rnp71k1x0/AAA7SThEDro2aajZcybGrfnha?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_BLOCKIch 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é
 
	 
  
 
		 
  
 
		 
  
 
		 
 
 
  
 
		 
 
		