Hallo zusammen,
gibt es eine Möglichkeit die aktuellen X/Y/Z-Koordinaten des TCP laufend in einem System Job auszulesen und an eine externe SPS zu senden? Interessant aber nicht notwendig wären auch die Achswerte.
LG
Hans Albrecht
Hallo zusammen,
gibt es eine Möglichkeit die aktuellen X/Y/Z-Koordinaten des TCP laufend in einem System Job auszulesen und an eine externe SPS zu senden? Interessant aber nicht notwendig wären auch die Achswerte.
LG
Hans Albrecht
Du kannst über die Parameter die Positionen in Register schreiben diese kannst du dann entweder über einen systemjob oder die ladder auf entsprechende Ausgänge legen
Welche Parameter meinst du?
S1CxG
208 1 "Enables/Disables the function for outputting the present Cartesian position (in the
base coordinates) to registers. (command value)"
210 10 Cartesian position (command value) X register number of output destination
211 11 Cartesian position (command value) Y register number of output destination
212 12 Cartesian position (command value) Z register number of output destination
213 13 Cartesian position (command value) RX register number of output destination
214 14 Cartesian position (command value) RY register number of output destination
215 15 Cartesian position (command value) RZ register number of output destination
216 16 Cartesian position (command value) Re register number of output destination
Perfekt, das auslesen aus den Registern klappt schon mal. Jetzt hab ich nur das Problem, dass ich Integer scheinbar nicht mit DOUT auf eine Output Group schreiben kann, da kann ich nur eine Byte-Variable auswählen. Gibts da einen Trick? ja klar kann ich auf eine ein Byte breite Gruppe nur Bytes schreiben...
Ich habe nun einen fast funktionierenden Code zur Umrechnung, der nur leider nicht bei negativen Koordinatenwerten funktioniert:
///ATTR SC,RW,SY
///LVARS 6,6,0,0,0,0,0,0
NOP
' ---------------------
' Sends TCP coordinates
' to SPS
' ---------------------
' Parameter Settings:
' S1C1G0208 - 1
' S1C1G0210 - 140
' S1C1G0211 - 141
' S1C1G0212 - 142
' ---------------------
' Read coordinates
' from registers
' X
GETREG LI000 MREG#(140)
' Y
GETREG LI002 MREG#(141)
' Z
GETREG LI004 MREG#(142)
' ---------------------
' Split integers
' into two bytes:
' copy to new INT:
SET LI001 LI000
SET LI003 LI002
SET LI005 LI004
' for diagnostic
' purposes store
' to INT:
SET I000 LI000
SET I001 LI002
SET I002 LI004
' Get the High Bytes:
DIV LI001 256
DIV LI003 256
DIV LI005 256
' for diagnostic
' purposes store
' to INT:
SET I003 LI001
SET I004 LI003
SET I005 LI005
' Store the High Bytes:
SET LB000 LI001
SET LB002 LI003
SET LB004 LI005
' Get Low Byte in INT
' by shifting by 256:
SET LI001 256
SET LI003 256
SET LI005 256
MUL LI001 LB000
MUL LI003 LB002
MUL LI005 LB004
' subtract high byte
' from original int:
SUB LI000 LI001
SUB LI002 LI003
SUB LI004 LI005
' only low byte remains.
' store low byte:
SET LB001 LI000
SET LB003 LI002
SET LB005 LI004
' ---------------------
' Write bytes to Output:
DOUT OG#(191) LB000
DOUT OG#(192) LB001
DOUT OG#(193) LB002
DOUT OG#(194) LB003
DOUT OG#(195) LB004
DOUT OG#(196) LB005
END
Display More
Beim Schreiben der High-Bytes von LI00X auf LB00X bekomme ich einen "OVER VARIABLE LIMIT" Fehler, weil in die Byte-Variable kein negativer Wert darf.
Hat jemand eine kreative Idee, wie ich das lösen kann?