FC_ProfileInvCompute - Allgemeine Informationen
Typ |
Funktion |
Verfügbar ab: |
V1.0.3.0 |
Versionen: |
Aktuelle Version |
Ermittlung der Leitposition einer Kurve zu einer Folgeposition.
Die Funktion startet mit einer linearen Suche von i_lrXStart mit der Schrittweite i_lrXIncr. Wird ein Vorzeichenwechsel in der Differenz aus i_lrYPos – Y(Xi) erkannt, ist der Abschnitt mit der Lösung gefunden.
In diesem Abschnitt wird dann ein binäres iteratives Verfahren genutzt, um das Ergebnis q_lrXPos zu finden.
Die Funktion wird beendet, wenn
|i_lrYpos – Y(XPos)| <= i_lrAccuracy oder nach maximal 20 Durchläufen.
Eingang |
Datentyp |
Beschreibung |
---|---|---|
i_diProfileId |
DINT |
ID des zu Grunde liegenden Profils |
i_lrYPos |
LREAL |
Folgeposition, zu der eine Leitposition gesucht werden soll. |
i_lrXOffset |
LREAL |
Offset der Position des Leitgebers |
i_lrYOffset |
LREAL |
Offset der Position der Slaveachse |
i_lrXFactor |
LREAL |
Skalierungsfaktor des Leitgebers |
i_lrYFactor |
LREAL |
Skalierungsfaktor der Slaveachse |
i_lrXStart |
LREAL |
Startwert für die Suche |
i_lrXIncr |
LREAL |
Schrittweite für die Suche |
i_lrAccuracy |
LREAL |
Genauigkeit des Ergenisses, bei dem die Interation abgebrochen werden soll. |
Ausgang |
Datentyp |
Beschreibung |
---|---|---|
q_etDiag |
Allgemeingültige, bibliotheksunabhängige Aussage zur Diagnose. Ein Wert ungleich ET_Diag.Ok entspricht einer Diagnosemeldung. |
|
q_etDiagExt |
POU-spezifischer, diagnosebezogener Ausgang. q_etDiag = ET_Diag.Ok -> Statusmeldung q_etDiag <> ET_Diag.Ok -> Diagnosemeldung |
|
q_lrXPos |
LREAL |
Position des Leitgebers zur Position der Slaveachse i_lrYPos |
Kurve mit drei X-Positionen zu einer Y-Position
Beispiel für das Finden von mehreren Lösungen:
lrXStart := lrXOffset;
i := 0;
WHILE lrXStart + lrXIncr < lrXOffset + lrXFactor DO
FC_ProfileInvCompute(i_diProfileId := diProfileId,
i_lrYPos := lrYPos,
i_lrXOffset := lrXOffset,
i_lrYOffset := lrYOffset,
i_lrXFactor := lrXFactor,
i_lrYFactor := lrYFactor,
i_lrXStart := lrXStart,
i_lrXIncr := lrXIncr,
i_lrAccuracy := lrAccuracy,
q_etDiag : etDiag,
q_etDiagExt : etDiagExt,
q_lrXPos := lrXPos);
IF etDiag <> Ok THEN
EXIT;
END_IF
alrXPos[i]:= lrXPos; (* save result *)
i := i + 1; (* number of valid results *)
lrXStart := lrXPos + lrXIncr / 2.0; (*Start of next search *)
END_WHILE
q_etDiag |
q_etDiagExt |
Enumerationswert |
Beschreibung |
---|---|---|---|
OK |
0 |
OK |
|
ExecutionAborted |
96 |
Die maximale Anzahl an Interationsschritten wurde überschritten. |
|
InputParameterInvalid |
118 |
Accuracy ist außerhalb des gültigen Bereichs. |
|
InputParameterInvalid |
114 |
ProfileId ist ungültig. |
|
InputParameterInvalid |
115 |
XFactor ist außerhalb des gültigen Bereichs. |
|
InputParameterInvalid |
117 |
XIncr ist außerhalb des gültigen Bereichs. |
|
InputParameterInvalid |
119 |
XStart ist außerhalb des gültigen Bereichs. |
|
InputParameterInvalid |
120 |
YPos ist außerhalb des gültigen Bereichs. |
|
UnexpectedProgramBehavior |
116 |
Das Profil wird bereits verwendet. |
|
UnexpectedProgramBehavior |
1 |
Es ist ein unbeabsichtigter Fehler während der Ausführung aufgetreten. |
Enumerationsname: |
AccuracyRange |
Enumerationswert: |
118 |
Beschreibung: |
Accuracy ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_lrAccuracy wurde eine Zahl kleiner als 1E-10 angelegt. |
Es muss ein Wert größer als null angegeben werden. |
Enumerationsname: |
MaxNumberOfIterationsExceeded |
Enumerationswert: |
96 |
Beschreibung: |
Die maximale Anzahl an Interationsschritten wurde überschritten. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
i_lrAccuracy wurde zu klein gewählt. Das numerische Annäherungsverfahren konvergiert nicht in weniger als Gc_diMaxNumberOfIterations Iterationsschritten auf ein solch genaues Ergebnis. |
Es muss ein größerer Wert für i_lrAccuracy gewählt werden. |
Enumerationsname: |
Ok |
Enumerationswert: |
0 |
Beschreibung: |
OK |
Die Leitposition wurde erfolgreich ermittelt.
Enumerationsname: |
ProfileAlreadyInUse |
Enumerationswert: |
116 |
Beschreibung: |
Das Profil wird bereits verwendet. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Das Bewegungsprofil wird bereits verwendet. |
Überprüfen Sie die Bewegungsdaten. |
Enumerationsname: |
ProfileIdInvalid |
Enumerationswert: |
114 |
Beschreibung: |
ProfileId ist ungültig. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Das Profil existiert nicht |
Überprüfen Sie den Wert am Eingang i_diProfileId. |
Enumerationsname: |
UnexpectedFeedback |
Enumerationswert: |
1 |
Beschreibung: |
Es ist ein unbeabsichtigter Fehler während der Ausführung aufgetreten. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Es ist ein Fehler in der internen Abarbeitung aufgetreten. |
Bitte informieren Sie das Supportteam über diesen Fehler. |
Enumerationsname: |
XFactorRange |
Enumerationswert: |
115 |
Beschreibung: |
XFactor ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_lrXFactor wurde der Wert 0 angelegt. |
i_lrXFactor darf nicht 0 sein. |
Enumerationsname: |
XIncrRange |
Enumerationswert: |
117 |
Beschreibung: |
XIncr ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_lrXIncr wurde eine Zahl <= 0 angelegt. |
i_lrXIncr muss größer sein als 0. |
Enumerationsname: |
XStartRange |
Enumerationswert: |
119 |
Beschreibung: |
XStart ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_lrXStart wurde eine Zahl außerhalb der Kurve angegeben. |
Überprüfen Sie i_lrXStart und setzen Sie den Parameter auf einen Wert über i_lrXOffset. Überprüfen Sie i_lrXStart und setzen Sie den Parameter auf einen Wert unter i_lrXOffset + i_lrXFactor - i_lrXIncr. |
Enumerationsname: |
YPosRange |
Enumerationswert: |
120 |
Beschreibung: |
YPos ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_lrYPos wurde ein Wert angelegt, der vom Master im angegebenen Bereich der Kurve nicht erreicht wird. |
Überprüfen Sie die Definition der Kurve. Überprüfen Sie die Startposition i_lrXStart. |