Hallo liebe Freunde des CodeSys !
Ich habe ein kleines Problem.
Hintergrund:
Ein Stellmotor mit einem Stellwinkel von 0-90° und einer Laufzeit von 35 Sek./90°,
soll mit meinem Programm aus einem beliebigen Winkel in einen beliebigen
anderen Winkel gefahren werden.
Dazu habe ich das untenstehende Programm geschrieben.
Ich nutze darin einen Timer (TON).
Das Kuriose ist, das es x-Mal funktioniert, besonders aber bei einem
Startwinkel von 0° auf 90° oder 90° auf 0° kommt für die Variable Timediff
eine unsinnig große Zahl heraus.
Ich weiß nicht warum.
Hat von euch jemand eine Idee / einen Hinweis ?
Vielen Dank im voraus, Martin
PROGRAM PLC_PRG
VAR
MOVE:BOOL; WINKEL,ZIELWINKEL:INT; (RETAIN) LINKS:TOF; RECHTS:TOF; TIMEDIFF:DWORD;
END_VAR
LINKS;
RECHTS;
IF MOVE=TRUE THEN
TIMEDIFF:=TRUNC(ABS(((ZIELWINKEL-WINKEL)*35000.0)/90.0));
IF ZIELWINKEL<WINKEL THEN
LINKS.PT:=DWORD_TO_TIME(TIMEDIFF);
RECHTS.PT:=DWORD_TO_TIME(TIMEDIFF);
LINKS.IN:=TRUE;
MOVE:=FALSE;
END_IF;
IF ZIELWINKEL>WINKEL THEN
RECHTS.IN:=TRUE;
WINKEL:=ZIELWINKEL;
IF LINKS.Q= TRUE THEN
PDigital_Output_00_00:=TRUE;
LINKS.IN:=FALSE;
ELSE
Digital_Output_00_00:=FALSE;
IF RECHTS.Q= TRUE THEN
Digital_Output_00_01:=TRUE;
RECHTS.IN:=FALSE;
Digital_Output_00_01:=FALSE;
Also inzw. habe ich raus das es mit dem Timer selber gar nichts zu tun hat.
Der Fehler passiert wenn z.B der Zielwinkel=0 und der Winkel =90
ist.
Der dann berechnete Wert (90-0)*35000/90 wird an
die Funktion DWORD_TO_TIME übergeben.
Diese liefert dann einen Wert der nicht dem entspricht
den ich erwarte.
Nur, wo liegt der Fehler - was mache ich da falsch ?
wie wird das Bit "MOVE" gesetzt? Den Namen solltest Du übrigens nicht verwenden, MOVE ist der Name einer Funktion.
Der Rest sollte eigentlich funktionieren:
Hallo Oberchefe,
das BIT MOVE heisst " in Echt fredP300_Move", so das es da keinen
Konflikt gibt.
Gesetzt wird es durch manuelles Eintasten.
Wie Du sagst, es sollte funktionieren, tut es aber nicht.
Hi
Unter OSCAT gibt es diese Funktion bereits fertig.
Nimm diese Funktion oder schau dir den Quelltext an.
( OSCAT ist Quelltextoffen und "frei" )
(Vieleicht hast du auch Verbessungsvorschläge für das OSCAT-Team)
Log in to post a comment.
Hallo liebe Freunde des CodeSys !
Ich habe ein kleines Problem.
Hintergrund:
Ein Stellmotor mit einem Stellwinkel von 0-90° und einer Laufzeit von 35 Sek./90°,
soll mit meinem Programm aus einem beliebigen Winkel in einen beliebigen
anderen Winkel gefahren werden.
Dazu habe ich das untenstehende Programm geschrieben.
Ich nutze darin einen Timer (TON).
Das Kuriose ist, das es x-Mal funktioniert, besonders aber bei einem
Startwinkel von 0° auf 90° oder 90° auf 0° kommt für die Variable Timediff
eine unsinnig große Zahl heraus.
Ich weiß nicht warum.
Hat von euch jemand eine Idee / einen Hinweis ?
Vielen Dank im voraus, Martin
PROGRAM PLC_PRG
VAR
END_VAR
LINKS;
RECHTS;
IF MOVE=TRUE THEN
TIMEDIFF:=TRUNC(ABS(((ZIELWINKEL-WINKEL)*35000.0)/90.0));
IF ZIELWINKEL<WINKEL THEN
LINKS.PT:=DWORD_TO_TIME(TIMEDIFF);
RECHTS.PT:=DWORD_TO_TIME(TIMEDIFF);
LINKS.IN:=TRUE;
MOVE:=FALSE;
END_IF;
IF ZIELWINKEL>WINKEL THEN
RECHTS.PT:=DWORD_TO_TIME(TIMEDIFF);
LINKS.PT:=DWORD_TO_TIME(TIMEDIFF);
RECHTS.IN:=TRUE;
MOVE:=FALSE;
END_IF;
WINKEL:=ZIELWINKEL;
END_IF;
IF LINKS.Q= TRUE THEN
PDigital_Output_00_00:=TRUE;
LINKS.IN:=FALSE;
ELSE
Digital_Output_00_00:=FALSE;
END_IF;
IF RECHTS.Q= TRUE THEN
Digital_Output_00_01:=TRUE;
RECHTS.IN:=FALSE;
ELSE
Digital_Output_00_01:=FALSE;
END_IF;
Also inzw. habe ich raus das es mit dem Timer selber gar nichts zu tun hat.
Der Fehler passiert wenn z.B der Zielwinkel=0 und der Winkel =90
ist.
Der dann berechnete Wert (90-0)*35000/90 wird an
die Funktion DWORD_TO_TIME übergeben.
Diese liefert dann einen Wert der nicht dem entspricht
den ich erwarte.
Nur, wo liegt der Fehler - was mache ich da falsch ?
wie wird das Bit "MOVE" gesetzt? Den Namen solltest Du übrigens nicht verwenden, MOVE ist der Name einer Funktion.
Der Rest sollte eigentlich funktionieren:
Hallo Oberchefe,
das BIT MOVE heisst " in Echt fredP300_Move", so das es da keinen
Konflikt gibt.
Gesetzt wird es durch manuelles Eintasten.
Wie Du sagst, es sollte funktionieren, tut es aber nicht.
Hi
Unter OSCAT gibt es diese Funktion bereits fertig.
Nimm diese Funktion oder schau dir den Quelltext an.
( OSCAT ist Quelltextoffen und "frei" )
(Vieleicht hast du auch Verbessungsvorschläge für das OSCAT-Team)