Benutzerspezifische Transformationen
Neben den bereitgestellten Transformationen können auch eigene kinematische Transformationen als TwinCAT C++-Modul implementiert und eingebunden werden.
Einschränkungen
- Die Funktionsbausteine FB_KinCalcTrafo und FB_KinCalcMultiTrafo können nicht für benutzerspezifische Transformationen verwendet werden.
- Ein Online-Change ist nur mit TwinCAT C++-Modulen vom Projekttyp „TwinCAT 3 Versioned C++ Project“ erlaubt. Andernfalls kann es auf C++-Seite zu Unstetigkeiten kommen.
Vorbereitung
Vorab ist einmalig der Entwicklungsrechner für die Entwicklung von TwinCAT C++-Modulen einzurichten. Details hierzu sind in der TwinCAT C++-Dokumentation zu finden.
Entwicklung eines TwinCAT C++-Moduls für eine 2D-XC-Kinematik
Im Folgenden wird am Beispiel einer 2D-XC-Kinematik gezeigt, wie eine benutzerspezifische Kinematik erstellt wird. Die Kinematik setzt sich aus einer Linearachse (M1), auf die sich eine Rotationsachse (M2) mit einem Arm befindet, zusammen. Dabei soll die Armlänge einstellbar sein.
Hinweis | |
Online-Change Ein Online-Change ist nur mit TwinCAT C++-Modulen vom Projekttyp „TwinCAT 3 Versioned C++ Project“ erlaubt. Andernfalls kann es auf C++-Seite zu Unstetigkeiten kommen. |
Transformationsmodul in der XAE konfigurieren
- Voraussetzung: Ein leeres TwinCAT-Projekt muss sich auf einem Entwicklungssystem befinden, welches für die TwinCAT C++-Entwicklung eingerichtet ist.
- 1. Fügen Sie ein TwinCAT C++-Projekt in das leere TwinCAT-Projekt ein.
Machen Sie dazu einen Rechtsklick auf den Teilbaum C++ > Add New Item… - 2. Wählen Sie als Projekttyp TwinCAT Versioned C++ Project aus und vergeben Sie einen Namen. Bestätigen Sie die Auswahl mit dem Button Add.
- 3. Wählen Sie TwinCAT Module Class als Modultyp aus. Bestätigen Sie die Auswahl mit dem Button Add.
- 4. Benennen Sie im nächsten Schritt das Modul. Bestätigen Sie die Angaben mit dem Button OK.
- Ein TwinCAT C++-Projekt mit Modul wurde angelegt.
Interfaces und Parameter hinzufügen
- 5. Öffnen Sie mit einem Doppelklick im Solution-Baum auf die tmc-Datei den TMC-Editor, um Interfaces und Parameter hinzufügen zu können.
- 6. Für eine benutzerspezifische Transformation wird das Interface ITcNcTrafo benötigt.
Öffnen Sie im TMC-Editor über Modules > <Module Name> > Implemented Interfaces > Add new interface (insert) den Choose data type…-Dialog. - 7. Wählen Sie "ItcNcTrafo" aus und bestätigen Sie mit OK.
Auch benutzerspezifische Transformationen können Parameter besitzen, mit denen die Transformation konfiguriert werden kann. Bei der beispielhaften 2D-XC-Kinematik soll die Armlänge einstellbar sein.
Armlänge einstellen
- 8. Fügen Sie im TMC-Editor über Modules > <Module Name> > Parameters > Add new Parameter (Insert) einen neuen Parameter hinzu.
- Mit einem Doppelklick auf den neuen Parameter kann dieser konfiguriert werden.
- 9. Konfigurieren Sie den Parameter für die einstellbare Armlänge wie folgt:
- Nachdem die Änderungen an der tmc-Datei abgeschlossen sind, kann der TwinCAT-TMC-Code-Generator ausgeführt werden.
TwinCAT-TMC-Code-Generator ausführen
- 10. Gehen Sie über das Menü des TMC-Editors oder machen Sie einen Rechtsklick auf das C++-Projekt > TwinCAT TMC Code Generator im Solution-Baum.
- 11. Fügen Sie im Header
<ProjectName>Interfaces.h
den HeaderTcNcKinematicsInterfaces.h
hinzu. - 12. Die Funktionen
Forward
(Vorwärts),Backward
(Rückwärts),TrafoSupported
(UnterstützteTransformationen),GetDimensions
(hole Dimensionen) wurden automatisch unterSource Files\<TrafoName>.cpp
angelegt, beinhalten aber noch keine gültige Implementierung.
In der FunktionGetDimensions
ist eine Überpüfung der Anzahl der ACS- und MCS-Achsen zu implementieren.
HRESULT CMyTrafo::GetDimensions(ULONG* pFwdInput, ULONG* pFwdOutput)
{
HRESULT hr = S_OK;
if (pFwdInput && pFwdOutput)
{
*pFwdInput = 2;
*pFwdOutput = 2;
}
else
{
hr = E_POINTER; //pointer error
}
return hr;
}
- 13. TwinCAT ruft die Funktion
GetDimensions
bei der Aktivierung auf. Bei Bedarf können Sie weitere Überprüfungen, die beim Aktivieren erfolgen sollen, in die Funktion implementieren. Zum Beispiel die Überprüfung von benutzerspezifischen Lizenzdateien. - 14. Beim Bauen der Kinematischen Gruppe (FB_KinConfigGroup) wird die Funktion
TrafoSupported
aufgerufen.
Zusätzlich ist es empfehlenswert, die Funktion auch in den FunktionenForward
undBackward
aufzurufen.
In der Funktion sollten die Achsdimensionen und Parameterwerter auf Gültigkeit geprüft werden.
HRESULT CMyTrafo::TrafoSupported(TcNcTrafoParameter* p, bool fwd)
{
HRESULT hr = S_OK;
if (p)
{
if (fwd)
{
if (p->dim_i != 2 || p->dim_o != 2)
{
// kinematics transformation error: invalid dimension
hr = MAKE_ADS_HRESULT(NCERR_KINTRAFO_INVALIDDIM);
}
}
else
{
if (p->dim_i != 2 || p->dim_o != 2)
{
// kinematics transformation error: invalid dimension
hr = MAKE_ADS_HRESULT(NCERR_KINTRAFO_INVALIDDIM);
}
if (p->i[1] > m_ArmLength)
{
// kinematics transformation error: invalid position
hr = MAKE_ADS_HRESULT(NCERR_KINTRAFO_INVALIDAXISPOS);
}
}
}
else
{
hr = E_POINTER;
}
return hr;
}
- 15. Implementieren Sie in den Funktionen
Forward
undBackward
die (Positions-)Transformationen.
Hierzu stehen die Parameter „o“ und „i“ zur Verfügung. Wobei „i“ immer die Eingangswerte sind und „o“ die Ausgangswerte, entsprechend gilt für dieForward
Funktion:
o[0] = Position of first MCS_axis
d_o[0] = Velocity of first MCS_axis
dd_o[0] = Acceleration of first MCS_axis
i[0] = Position of first ACS_axis
d_i[0] = Velocity of first ACS_axis
dd_i[0] = Acceleration of first ACS_axis
Es ist nicht notwendig, die Transformationen für Geschwindigkeit und Beschleunigung zu implementieren.
Zu Beginn beider Funktionen sollte die Funktion TrafoSupported
aufgerufen werden, um zu überprüfen, ob die Positionen gültig sind.
HRESULT CMyTrafo::Forward(TcNcTrafoParameter* p)
{
HRESULT hr = TrafoSupported(p, true);
if (SUCCEEDED(hr))
{
if (p->i && p->o)
{
p->o[0] = p->i[0] + m_ArmLength*cos_((p->i[1])*PI/180);
p->o[1] = m_ArmLength * sin_((p->i[1])*PI / 180);
}
if (p->d_i && p->d_o)
{
p->d_o[0] = p->d_i[0];
p->d_o[1] = p->d_i[1];
}
if (p->dd_i && p->dd_o)
{
p->dd_o[0] = p->dd_i[0];
p->dd_o[1] = p->dd_i[1];
}
}
return hr;
}
HRESULT CMyTrafo::Backward(TcNcTrafoParameter* p)
{
HRESULT hr = TrafoSupported(p,false);
if (p->i && p->o)
{
p->o[1] = asin_(p->i[1] / m_ArmLength) * 180 / PI;
p->o[0] = (p->i[0] - (cos_(p->o[1] * PI / 180)*m_ArmLength));
}
if (p->d_i && p->d_o)
{
p->d_o[0] = p->d_i[0];
p->d_o[1] = p->d_i[1];
}
if (p->dd_i && p->dd_o)
{
p->dd_o[0] = p->dd_i[0];
p->dd_o[1] = p->dd_i[1];
}
return hr;
}
Erstellen- und Veröffentlichen der Module
- 16. Machen Sie einen Rechtsklick auf C++- > UserSpecificTrafo Project im Solution-Baum und wählen Sie TwinCAT Publish Modules aus.
- 17. Überprüfen Sie den Build-Output. Hier sollte keine Fehlermeldung enthalten sein.


NC/PTP konfigurieren
- 18. Erstellen Sie ein NC-Projekt im Teilbaum MOTION.
- 19. Legen Sie die benötigten PTP-Achsen an.




Transformation erstellen
- 20. Legen Sie zusätzlich einen NC-Channel (for Kinematik Transformation) im NC-Projekt an.
- 21. Fügen Sie die erstellte Transformation anschließend zur Group des Kinematik-Kanals hinzu.
Machen Sie dazu einen Rechtsklick auf die Group > Add Object(s)… - Es öffnet sich der Insert TcCom Object-Dialog.
- 22. Wählen Sie Ihr Transformationsmodul aus und bestätigen Sie Ihre Auswahl mit OK. Wenn Sie Ihr Modul nicht finden können, aktualisieren Sie die Ansicht über Reload.
- 23. Parametrieren Sie die Objektparameter entsprechend der verwendeten Kinematik.
- Die XAE-Konfiguration ist abgeschlossen.




- Die Transformation kann jetzt von der SPS aus aktiviert werden (siehe SPS-Bibliothek). Definieren Sie zum Ansprechen der Transformation ein zyklisches Kanalinterface in der SPS und verknüpfen Sie dieses mit den IO des Kinematikkanals.

in_stKinToPlc AT %I* : NCTOPLC_NCICHANNEL_REF;
out_stPlcToKin AT %Q* : PLCTONC_NCICHANNEL_REF;