TwinCAD unterschied FUN und PRG???

ichder

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin Praktikant und soll für eine Firma ein Programm schreiben.
Ich kannte bis dato nur Siemens. Nun muss ich mich in eine Beckhoff einarbeiten. Ich wurschtel nun schon sehr lange mit dem TwinCAD herum. So langsam komme ich ein wenig klar damit. Ich habe nun begonnen eine Formel zu Programmieren. Wenn ich diese Formel nun im FUN schreibe dann bringt er mir das falsche Ergebnis, denn wenn ich die selbe Formel nun im PRG schreibe dann kommt das richtige ergebnis dabei raus. Woran kann das liegen?
Unbenannt.jpg
Ich habe es mit ST und FUP probiert...
Die Programme sind wirklich identisch...

ich hoffe ihr könnt mir helfen
 
Hallo zusammen,

ich bin Praktikant und soll für eine Firma ein Programm schreiben.
Ich kannte bis dato nur Siemens. Nun muss ich mich in eine Beckhoff einarbeiten. Ich wurschtel nun schon sehr lange mit dem TwinCAD herum. So langsam komme ich ein wenig klar damit. Ich habe nun begonnen eine Formel zu Programmieren. Wenn ich diese Formel nun im FUN schreibe dann bringt er mir das falsche Ergebnis, denn wenn ich die selbe Formel nun im PRG schreibe dann kommt das richtige ergebnis dabei raus. Woran kann das liegen?
Unbenannt.jpg
Ich habe es in ST und FUP probiert...
Die inhalte sind wirklich identisch...

ich hoffe ihr könnt mir helfen.
 
Danke für die schnelle Antwort.
was meinst du mit Zyklus?


Grundformel : Beta=180°-(arcsin(3.6/4 * sin(90°-Alpha)))-(90°-Alpha)
angewendete Formel: Beta=180°-Rad_TO_DEG(arcsin(3.6/4 * sin((90°-Alpha)*pi/180)))-(90°-Alpha)
pi/180 --> Umwandlung in Bogenmaß / RAD-TO-DEG --> Umwandlung Bogenmaß in Winkelmaß

Programm:
part_b := 90 - Alpha;
part_a := ASIN(3.6/4 * part_c);
part_c := SIN(pi/180*part_b);
part_d := RAD_TO_DEG(part_a);
beta := 180 - part_d - part_b;
winkel_lamelle := REAL_TO_INT(beta);
 
damit mein ich genau sowas:
part_a := ASIN(3.6/4 * part_c);
part_c := SIN(pi/180*part_b);

wahrscheinlich hast du diese variablen als "VAR" in deiner FUN deklaliert oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Programm:
part_b := 90 - Alpha;
part_a := ASIN(3.6/4 * part_c);
part_c := SIN(pi/180*part_b);
part_d := RAD_TO_DEG(part_a);
beta := 180 - part_d - part_b;
winkel_lamelle := REAL_TO_INT(beta);

Dein Fehler liegt in der Berechnung von part_a.

Du Verwendest für die Berechnung part_c. Part_c wird aber erst einen Schritt später berechnet. In einem Programm oder Funktionblock ist das Problem nicht so sehr ersichtlich, weil die Variablen statisch gespeichert werden. D.h. Part_c hat immer den Wert vom vorherigen Zyklus.
In einer Funktion sind die Werte immer temporär. Ist die FUN abgearbeitet werden alle Werte auf 0 gesetzt. Deswegen bekommst du 120 raus, weil Part_c = 0 ist wen du Part_a berechnest.

Problematisch bei der Lösung mit der Programm-Variante. Das Ergebnis ist immer für einen Zyklus falsch wenn Alpha einen neuen Wert bekommt. Du siehst es aber nicht, weil der Wert dann im folgendenen Zyklus stimmt ----> ganz böser Fehler, weil nicht beobachtbar!


Lösung:
part_b := 90 - Alpha;
part_c := SIN(pi/180*part_b);
part_a := ASIN(3.6/4 * part_c);
part_d := RAD_TO_DEG(part_a);
beta := 180 - part_d - part_b;
winkel_lamelle := REAL_TO_INT(beta);

Alle Werte werden in der korrekten Reihenfolge berechnet. Sollte jetzt auch als Funktion klappen.
 
Danke euch beiden... jetzt wo ichs so lese... das habe ich mal gelernt ja :)
jetzt ist es logisch... Daran habe ich mit keiner Silbe gedacht....
Danke Danke
 
Zurück
Oben