Warnung
Sie lesen eine alte Version dieser Dokumentation. Wenn Sie aktuelle Informationen wünschen, schauen Sie bitte unter 5.0 .Beispiel - Beckhoff TwinCAT
Dieser Abschnitt zeigt ein Beispiel einer einfachen Integration von EYE+ mit dem EtherCAT-Modul in Beckhoff TwinCAT Version 3.1.
Voraussetzungen
- Bevor Sie beginnen, laden Sie bitte folgende Dateien herunter:
EYE+ EtherCAT ESI-Datei (Electronic datasheet)
Ggf. EYE+ TwinCAT Projektvorlage, die vordeklarierte Variablen für eine einfachere Integration enthält
Diese Dateien können unter EtherCAT Downloads heruntergeladen werden.
Nachdem Sie die notwendigen Dateien heruntergeladen haben, müssen Sie die ESI-Datei in das Installationsverzeichnis von Beckhoff TwinCAT installieren:
<pfad_zu_twincat_install>\3.1\Config\Io\EtherCAT
Wobei <pfad_zu_twincat_install>
normalerweise C:\TwinCAT\
entspricht.
Nachdem Sie die ESI-Datei in den richtigen Ordner installiert haben, starten Sie Beckhoff TwinCAT bitte neu.
Basis-Integration
Sobald alles eingerichtet ist, können Sie mit der Erstellung eines neuen Beckhoff TwinCAT Projekts fortfahren. Vergewissern Sie sich dann, dass Sie sich im Konfigurationsmodus befinden, indem Sie auf das folgende Symbol oben links drücken:
Danach sind Sie bereit, den EtherCAT-Bus zu scannen, um Ihr EYE+ und das Master-Gerät zu erkennen und zu lokalisieren. Die Scan-Option können Sie abrufen, indem Sie mit der rechten Maustaste auf Devices im linken Navigationsfenster klicken:
Der Scan-Vorgang kann einige Sekunden dauern und findet alle Geräte, die derzeit an den Bus angeschlossen sind.
Bemerkung
Wenn Ihr EYE+ nach dem Scan nicht in der Liste erscheint, stellen Sie bitte sicher, dass es korrekt angeschlossen und eingeschaltet ist. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an unser Support-Team.
Nach Abschluss des Scans sollten Sie Ihre EYE+ Box in der Liste unter Devices sehen:
Wenn Sie die optionale Projektvorlage heruntergeladen haben, folgen Sie bitte den nächsten Schritten. Durch das Importieren der Vorlage werden alle notwendigen Variablen erstellt, sodass Sie die Vorteile Ihres EYE+ in vollem Umfang ausschöpfen können. Das Importieren der Vorlage ist ganz einfach: Klicken Sie mit der rechten Maustaste auf Ihr SPS-Projekt und klicken Sie dann auf Import From ZIP:
Wenn dies gelingt, sollten Sie vollständige Variabel-Strukturen zur Verfügung haben:
Sie müssen das Projekt so erstellen, dass die Variablen innerhalb von TwinCAT verfügbar sind. Das Mapping der Variablen zu den Variablen von EYE+ kann mit der Multi-Link-Funktionalität leicht erreicht werden:
Nachdem die Variablen zugeordnet wurden und Sie im Betriebsmodus neu gestartet haben, sollten Sie in der Lage sein, eine Live-Rückmeldung der Register zu erhalten:
Das folgende Codebeispiel ermöglicht es Ihnen, eine Produktion zu starten und die ersten Teile für ein Rezept zu erhalten, das zuvor auf Ihrem EYE+ Controller erstellt wurde. Setzen Sie dazu udRecipeID
auf die ID des Rezepts und boStart
auf True. Die Koordinaten des gefundenen Teils werden in reRobotTargetX
, reRobotTargetY
und reRobotTargetRz
zurückgegeben.
(*
* This sample code is distributed under the license CC0 1.0 Universal,
* you can get a copy of the license at https://creativecommons.org/publicdomain/zero/1.0/
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*)
VAR
udRecipeID: UDINT;
boStart: BOOL;
R_TRIG_Start: R_TRIG;
boStop: BOOL;
R_TRIG_Stop: R_TRIG;
boClearError : BOOL;
inLastErrorID: UDINT;
eState: UDINT;
reRobotTargetX: REAL;
reRobotTargetY: REAL;
reRobotTargetRz: REAL;
END_VAR
VAR CONSTANT
STATE_IDLE: UDINT := 0;
STATE_START_PRODUCTION: UDINT := 10;
STATE_ROBOT_MOVE_OUT_FOV: UDINT := 20;
STATE_GET_PART: UDINT := 30;
STATE_ROBOT_PICK_PLACE: UDINT := 50;
STATE_STOP_PRODUCTION: UDINT := 60;
STATE_ERROR: UDINT := 100;
END_VAR
R_TRIG_Start(CLK:= boStart);
R_TRIG_Stop(CLK:= boStop);
CASE eState OF
STATE_IDLE:
IF R_TRIG_Start.Q THEN
eState := STATE_START_PRODUCTION;
END_IF
STATE_START_PRODUCTION:
EYEplus.suEYEplusOutputGLO.udRecipeIDGOU := udRecipeID;
EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := TRUE;
IF EYEplus.suEYEplusInputGLO.boStartProductionDoneGIN AND NOT EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
eState := STATE_ROBOT_MOVE_OUT_FOV;
ELSIF EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
eState := STATE_ERROR;
END_IF
STATE_ROBOT_MOVE_OUT_FOV:
//Robot move out of field of view
//Check that the movement is done before to go first get_part
eState := STATE_GET_PART;
STATE_GET_PART:
EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := TRUE;
IF EYEplus.suEYEplusInputGLO.boGetPartDoneGIN AND NOT EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
reRobotTargetX := EYEplus.suEYEplusInputGLO.rePose1XGIN;
reRobotTargetY := EYEplus.suEYEplusInputGLO.rePose1YGIN;
reRobotTargetRz := EYEplus.suEYEplusInputGLO.rePose1RzGIN;
EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;
eState := STATE_ROBOT_PICK_PLACE;
ELSIF EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;
eState := STATE_ERROR;
END_IF
STATE_ROBOT_PICK_PLACE:
//Robot pick and place the part
//Check that the movement is done before to go make another get_part
eState := STATE_GET_PART;
STATE_STOP_PRODUCTION:
EYEplus.suEYEplusOutputGLO.udStopStateGOU := 16#FF;
IF EYEplus.suEYEplusInputGLO.boStopStateDoneGIN AND NOT EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
EYEplus.suEYEplusOutputGLO.udStopStateGOU := 16#00;
eState := STATE_IDLE;
ELSIF EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
EYEplus.suEYEplusOutputGLO.udStopStateGOU := 16#00;
eState := STATE_ERROR;
END_IF
STATE_ERROR:
EYEplus.suEYEplusOutputGLO.udStopStateGOU := 16#00;
EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;
inLastErrorID := EYEplus.suEYEplusInputGLO.udErrorIDGIN;
EYEplus.suEYEplusOutputGLO.boClearErrorTriggerGOU := boClearError;
IF NOT EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
EYEplus.suEYEplusOutputGLO.boClearErrorTriggerGOU := FALSE;
eState := STATE_STOP_PRODUCTION;
END_IF;
END_CASE
IF R_TRIG_Stop.Q THEN
EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;
EYEplus.suEYEplusOutputGLO.boClearErrorTriggerGOU := FALSE;
eState := STATE_STOP_PRODUCTION;
END_IF