In diesem Beispiel wird ein Programm vorgestellt, in dem HORST durch das vorgeben externer Posen (SPS seitig) gesteuert werden kann. Dabei werden TCP-Koordinaten in der Form x, y, z, rx, ry, rz von der SPS an HORST �bergeben.
1. SPS Programm
Hier wird das SPS Programm beschrieben, in dem die externen Koordinaten an CONTROL �bergeben werden. Das Programm besteht aus einem Funktionsblock (FB "External_positioning").
Dem FB ist ein Datenbaustein zugeordnet (DB5), in dem die lokalen Variablen definiert sind. Der FB verf�gt �ber zwei Eingangsvariablen. �ber die boolesche Inputvariable "start" wird der FB ausgef�hrt, diese wird hier �ber einen einfachen Schalter mit Merkerbitzuweisung gesteuert. Am Eingang "Pose" werden die TCP Koordinaten �bergeben. Die ben�tigte Datenstruktur ist in einem globalen DB vordefiniert:
Der Ausgang "is_moving" zeigt an, ob die �bergebene Pose gerade angefahren wird (=true). Der Ausgang "ready_for_data" zeigt, ob eine neue Pose �bertragen werden kann. Dieser Ausgang kann zur Taktung der Daten�bertragung zwischen externem Ger�t (z.B. Kamerasystem) und CONTROL genutzt werden.
Der interne Funktionsablauf ist in 6 Netzwerke aufgeteilt:
Netzwerk 1:
Bei Positiver Flanke der Inputvariablen #start, wird die lokale Startvariable #start_detected gesetzt und dadurch der weitere Programmablauf gestartet.
Netzwerk 2:
In diesem Netzwerk wird �berpr�ft, ob sich die aktuell am Input #Pose anliegenden Koordinaten von den zuletzt an CONTROL �bertragenen Koordinaten unterscheiden. Unterscheidet sich eine der Koordinaten, wird die lokale Variable #new_pose gesetzt - es wurde eine neue Pose an den FB �bertragen.
Netzwerk 3:
In diesem Netzwerk wird die von extern �bergebene Pose an CONTROL �berschrieben. Daf�r wird zun�chst �ber #new_pose abgefragt, ob eine neue Pose �bergeben wurde. Wenn ja, wird die Pose �ber einen MOVE-Block den vordefinierten Registern in CONTROL zugewiesen. Durch anschlie�endes setzen der dazugeh�rigen Masken, wird die Pose �bertragen.
Netzwerk 4:
Hier wird �berpr�ft, ob die anliegende Pose an CONTROL �bergeben wurde und ob sich der Roboter bewegt (#is_moving). Dazu wird ein Bool Register auf CONTROL ausgelesen ("HORST_IN".Bool_Tegister[1]), das in horstFX nach dem Einlesen der Pose und vor dem Start der Bewegung gesetzt wird. Ist dieses Statusbit gesetzt, wird #new_pose zur�ckgesetzt und #is_moving gesetzt. Beim erreichen der Pose wird das Statusbit in horstFX zur�ckgesetzt und somit der SPS gemeldet, dass die Pose erreicht wurde (#is_moving=false).
Netzwerk 5:
Wenn eine neue Pose �bergeben wurde, wird hier ein Statusbit gesetzt, das in horstFX eingelesen wird und das Abfragen und Anfahren der neuen Pose triggert.
Netzwerk 6:
Hier wird �berpr�ft. ob die zuletzt �bergeben Pose von horstFX eingelesen wurde (#new_pose=false). Ist dies der Fall, wird die Ausgangsvariable #ready_for_data gesetzt. Jetzt k�nnen neue Posen von der SPS �bergeben werden, auch schon w�hrend sich der Roboter zur zuletzt �bergebenen Pose bewegt.
2. Textuelles Programm horstFX
Das zugeh�rige horstFX Programm ist in zwei Teile aufgeteilt. Im ersten Teil werden die Statusbits zur Kommunikation mit der SPS zugewiesen und initialisiert.
Der zweite Teil, der eigentlich Programmablauf, besteht aus einer Endlosschleife, innerhalb der die �bergebenen Posen eingelesen und Angefahren werden.
configuration();
{
config("robot.horstproto", "HorstS1Rev3Black");
config("tool", "No Tool");
config("scripttype", "textual");
config("version", "2020.10");
config("tcp.weight", "2.0");
}
//*************Statusbits zuweisen und initialisieren*************************************************
var bit_is_moving = 1; //Statusbit f�r Roboterbewegung
var bit_new_pose = 2; //Statusbit, ob neue Pose vorhanden
setBoolRegister(bit_is_moving,0);
setBoolRegister(bit_new_pose,0);
//*************Endlosschleife in der die �bergebenen Posen nacheinander angefahren werden*************
while (true) {
if (getBoolRegister(bit_new_pose) == 1) { //wird nur ausgef�hrt, wenn neue Pose von SPS �bergeben wurde
var pose = getNextPose(); //nextPose einlesen und aufsplitten
x = pose.x;
y = pose.y;
z = pose.z;
rx = pose.rx;
ry = pose.ry;
rz = pose.rz;
setBoolRegister(bit_new_pose,0); //R�ckmeldung an SPS, dass Pose eingelesen wurde
setBoolRegister(bit_is_moving,1); //R�ckmeldung an SPS, dass �bergeben Pose gerade angefahren wird (Roboter bewegt sich)
move({ //Pose anfahren
'movetype': 'JOINT',
'poserelation': 'ABSOLUTE',
'coord' : 'cartesian_basis',
'speed.ratio': 0.75,
'targetpose.x': x,
'targetpose.y': y,
'targetpose.z': z,
'targetpose.rx': rx,
'targetpose.ry': ry,
'targetpose.rz': rz,
'blendradius.xyz':0.12,
'blendradius.orient':180
}, "Pose");
setBoolRegister(bit_is_moving,0); //R�ckmeldung an SPS, dass Pose erreicht wurde (Roboter steht)
}
}
3. Download
Hier kann das SPS-Programm sowie das horstFX-Programm heruntergeladen werden.