asm
Level-2
- Beiträge
- 71
- Reaktionspunkte
- 8
-> Hier kostenlos registrieren
Hallo,
Ich könnte nachfolgendes locker in AWL umsetzen, wollt mich aber mal in SCL versuchen.
Ziel: die Engänge eines Leuze CML720i (Messlichtgitter oder kurz "MLG") in den TEMP-Breich eines FB's sichern.
Mit diesem MLG kann ich 32 Strahlen abfragen. Jeder Strahl entspricht ein Bit.
In der 300er Steuerung habe ich die Peripherieeingänge ganz einfach ausgelesen:
	
	
	
		
In der 1500er Steuerung mit SCL schaut das alles komplett anders aus.
Netzwerk 1: Startadresse sowie Länge des Eingangsbereiches speichern:
	
	
	
		
Jetzt komme ich zu meinem Problem: Ich möchte WORD-weise die Eingänge in den TEMP-Bereich sichern. Hier mein Ansatz:
	
	
	
		
Im Kopf betrachtet bedeutet das:
--> #rd_Addr.PICount = 4 (siehe angehängtes Bild .. es sind 4 Byte)
--> SHR1 von #rd_Addr.PICount (schiebe das wort um 1 nach rechts was soviel bedeutet wie: #rd_Addr.PICount / 2 = 2 Worte)
--> #rd_Addr.PICount = 2
--> FOR i=1 TO 2 DO:
Dummerweise ist das %EW rot untermalt. Das heißt, TIA kann damit nix anfangen. Habt Ihr eine Idee, wie ich das elegant lösen kann ?
	
		
			
		
		
	
				
			Ich könnte nachfolgendes locker in AWL umsetzen, wollt mich aber mal in SCL versuchen.
Ziel: die Engänge eines Leuze CML720i (Messlichtgitter oder kurz "MLG") in den TEMP-Breich eines FB's sichern.
Mit diesem MLG kann ich 32 Strahlen abfragen. Jeder Strahl entspricht ein Bit.
In der 300er Steuerung habe ich die Peripherieeingänge ganz einfach ausgelesen:
		Code:
	
	      L     #Baugruppenadresse
      SLW   3
      LAR1  
      LAR2  P##t_strahlen
      L     PED [AR1,P#0.0]             // Byte-Betrachtung des Doppelwortes: A B C D
      TAD                               // Byte-Betrachtung des Doppelwortes: D C B A
      RLD   16                          // Byte-Betrachtung des Doppelwortes: B A D C
      T     LD [AR2,P#0.0]              // High / Low-Bytes müssen Wortweise gedreht werdenIn der 1500er Steuerung mit SCL schaut das alles komplett anders aus.
Netzwerk 1: Startadresse sowie Länge des Eingangsbereiches speichern:
		Code:
	
	    [COLOR=#008000]// Basisadressen auslesen[/COLOR]
    #geoAddr.HWTYPE := 4;                       // Hardwaretyp: 4 = Modul
    #geoAddr.IOSYSTEM := #idMastersystem;       // ID des Mastersystems (1..99 = PROFIBUS DP, 100.. = PROFINET IO)
    #geoAddr.STATION := #pndpTeilnehmer;        // Stationsnummer
    #geoAddr.SLOT := 1;                         // Steckplatz-Nummer
    #RetVal := GEO2LOG(GEOADDR := #geoAddr, LADDR => #rd_Addr.lAddr);
    [COLOR=#008000]// Startadresse und Anzahl der Eingangsbytes auslesen (Ausgänge gibt es nicht)[/COLOR]
    #RetVal := RD_ADDR(LADDR := #rd_Addr.lAddr, [COLOR=#ff0000]PIADDR => #rd_Addr.PIAddr[/COLOR], [COLOR=#0000ff]PICount => #rd_Addr.PICount[/COLOR],PQADDR => #rd_Addr.PQAddr, PQCount => #rd_Addr.PQCount);Jetzt komme ich zu meinem Problem: Ich möchte WORD-weise die Eingänge in den TEMP-Bereich sichern. Hier mein Ansatz:
		Code:
	
	FOR #i := 1 TO SHR(IN := UINT_TO_INT(#rd_Addr.PICount), N := 1) BY 1 DO
    #ew[#i] := SWAP([B][COLOR=#ff0000]%EW[/COLOR][/B](UDINT_TO_DINT(#rd_Addr.PIAddr) + #n):P);
    #n := #n + 2;    [COLOR=#008000]// nächstes Eingangswort[/COLOR]
END_FOR;Im Kopf betrachtet bedeutet das:
--> #rd_Addr.PICount = 4 (siehe angehängtes Bild .. es sind 4 Byte)
--> SHR1 von #rd_Addr.PICount (schiebe das wort um 1 nach rechts was soviel bedeutet wie: #rd_Addr.PICount / 2 = 2 Worte)
--> #rd_Addr.PICount = 2
--> FOR i=1 TO 2 DO:
tempword = gedrehtes Eingangswort
Dummerweise ist das %EW rot untermalt. Das heißt, TIA kann damit nix anfangen. Habt Ihr eine Idee, wie ich das elegant lösen kann ?
 
	 
  
 
		
 
			 
 
 
 
