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 werden
In 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 ?