Funktionsbaustein verändert seine Ausgänge, obwohl er nicht mehr aufgerufen wird.

Daxgehtsteil

Level-1
Beiträge
74
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

kennt jemand eine Situation in der das Möglich ist? Also ich rufe einen Baustein in einem bestimmten zustand auf, dieser meldet zurück das er aktiv ist (output-Variable). Im nächsten Zustand rufe ich den Baustein nicht mehr auf, und frage die Output-Variable ab die dann plötzlich zurückgesetzt ist und eine andere Output- Variable plötzlich gesetzt. d.h. der Baustein hat seine Ausgänge verändert ohne aufgerufen worden zu sein....

viele Grüße
 
Ein anderer Programmteil schreibt auf die Variablen oder ein Kommunikationspartner (Visu?) von außerhalb der CPU?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich wünschte es wäre so einfach :)
Nein, es handelt sich um einen lokal aufgerufenen Funktionsbaustein, MT_ScsData von Rexroth zum Aulesen von Sercos- Parametern.
dazu müsste der Baustein ja schon global aufgerufen werden, das das so zutreffen könnte. Ich habe dieses verhalten bisher noch nie gesehen.
Sehr eigenartig. Wenn ich direkt hinter dem Baustein einen Breakpoint setze, so hat er seinen Output "Active" gesetzt, wenn ich dann den baustein nicht mehr aufrufe, ist der Ausgang plötzlich nicht mehr gesetzt. Ich frage mich halt wie das überhaupt möglich ist, da ja nur darauf gearbeitet werden kann, wenn der Baustein ausgeführt wird.


Oder gibt es Bausteine, die temporäre Ausgänge besitzen. Und bei dem Baustein den ich nutze handelt es sich um einen solchen?
 
Zuletzt bearbeitet:
Meinst Du einen Output des FB oder eine an dem Output angeschlossene Variable?

Wenn der FB nicht aufgerufen wird, dann wird auch nicht der Zustand der FB-Ausgänge in die angeschlossenen Variablen kopiert. Wenn die angeschlossene Variable eine TEMP-Variable ist, dann hast Du das selbe Problem wie mit jeder TEMP-Variable, deren Inhalt unbestimmt ist, solange ihr nicht in dem selben Programmdurchlauf etwas zugewiesen wurde.

Wenn Du den Zustand des Ausgangs eines FB bzw. einer FB-Instanz wissen willst ohne die Instanz aufzurufen, dann kannst Du direkt den Ausgang abfragen: Instanzname.Output

Harald
 
Wenn Du den Zustand des Ausgangs eines FB bzw. einer FB-Instanz wissen willst ohne die Instanz aufzurufen, dann kannst Du direkt den Ausgang abfragen: Instanzname.Output

genau das mache ich ja, aber seltsamerweise wird genau der output verändert, obwohl die instanz selbst nicht mehr aufgerufen wird.


fbReadScsData(
Start := true,
Mode := 5,
StandardsParam:= 'S',
DataAddr := ADR(aSCSCycData),
Size := SIZEOF(aSCSCycData)
);

if not fbReadScsData.Active
then
do something.....
fbReadScsData(Start:=false);
end_if

es handelt sich um diese Active- Variable. den Aufruf habe ich gesataltet wie oben gezeigt. Dabei ist mir aufgefallen das der Baustein so nie feritg wird, das heißt active nicht zruückgesetzt wird. Durch ausprobieren habe ich dann festgestellt, das er nur beim Wechsel des Sps- Zyklus das Signal wegnimmt, und zwar bevor ich den Baustein nochmal aufrufe!! Ich kenne den genauen Sinn dahinter nicht, aber dann brauche ich keine Variable gestalten, die mir sagt wann der Baustein fertig ist, wenn das dann so nicht funktioniert.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Kommt drauf an was der Baustein intern so treibt.
Wenn er beispielsweise eine Systemfunktion die einmalig angestoßen wurde verwendet, wird diese vom Betriebssystem auch weiter ausgeführt ohne dass der Baustein der die Funktion angestoßen hat aufgerufen wird.
Bekommt die Systemfunktion dann beispielsweise Zeiger auf bestimmte Adressen übermittelt, so wird diese ihre Daten nach Beendigung auf diese Variablen schreiben. Dann hättest du eine Änderung ohne dass du den eigentlichen Baustein aufrufst.

Sercos hört sich ja nach Kommunikation an, darum könnte das durchaus so ein Szenario sein.
 
ja ich habe auch so ein dumpfes Gefühl, das dort irgendwie soetwas passiert. Aber wenn dem so ist, dann ist das doch Wahnsinn...
Ich muss mich doch darauf verlassen könnnen, das ein Baustein mir sauber zurückmeldet wann er fertig ist...
Sonst ist doch diese "Active" Output varialbe auch zwecklos...
 
Die Funktion hat doch einen extra Parameter "Start".
Es ist bei vielen Funktionen so, dass diese nur zuverlässig funktionieren wenn sie nur über ihre Parameter gesteuert werden, und nicht einfach übersprungen werden. Das ist beispielsweise bei den diversen IEC-Timern auch so (TON, TOF, etc.).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja natürlich. Stimme ich dir zu. Aber ein TON gibt iwann seinen Ausgang "Q" zurück. D.h. ich kann den baustein mit TRUE am Eingang "IN" starten und definiert warten bis der Baustein den ausgang setzt und ihn anschließend wieder zurücksetzen, in dem ich ihn mit ton(in:=false) aufrufe. bei diesem bAustein hier ist das nicht so. Der wird einfach nicht fertig, es sei denn der SPS zyklus wechselt und dann ist die Variable sofort zurückgesetzt, auch ohne Aufruf des Bausteins mit "FALSE" an seinem Start- Eingang. Für mich ist das kein sauberer Handshake.
 
Moin
Welche emulation? Ich kenne keine Hardware emulation!
Also funktioniert das mit den Bausteinen nicht. Ab den indradrive cs kannst du im Drive den Motor emulieren. Nur Geschwindigkeit oder zyklische lagesollwertvorgabe.



Sent from my iPhone using Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@nl_tmp Unabhängig vom tatsächlichen Code sollte meiner Meinung nach ein sauberer Handshake auch mit dem gezeigten Code-Snippet so funktionieren. Und wie der Baustein sich verhält entspricht das auch nicht 100% der Doku. wie und wann übergibst du dem Baustein denn den start- befehl?
Mit einer Flanke auf den Start- Input funktioniert das ganze sehr wohl, aber nur allein durch den Zykluswechsel der Sps.
Das Problem war ja, das der Baustein gundsätzlich erst im 2.Zyklus das Active wegnimmt (und das auch ohne nochmaligem Aufruf), auch wenn er im 1.Zyklus die daten schon liefert. In der Version des Snippets wird er daher direkt wieder aufgrufen weil ich das Start ja dauerhaft mitgebe und so sofort wieder gestartet. Ergo ist das Active wieder True.


P.s.: Stark, das du es mal ausprobiert hast! Danke schon mal dafür!!
 
Zuletzt bearbeitet:
Funktionsbaustein verändert seine Ausgänge, obwohl er nicht mehr aufgerufen w...

Moin
@ nl_tmp
Schau mal unter Www.boschrexroth.de/indraworks. Da kannst du neue Release runterladen. Update von 13v10 oder 13v14 auf 13v16 möglich. Wenn Lizenzen vorhanden auch neu Installation möglich. Ich selbst macht nix mit der MTX. Bei der MtCnc hab ich noch was gemacht. Jetzt nur noch Antriebe!!

Ps wer keine Lizenz hat kann sich die 30 Tage Testversion installieren
Sent from my iPhone using Tapatalk
 
Zuletzt bearbeitet:
@nl_tmp: Das ist doch alles was ich will, den Baustein absolut aufrufen weil mir klar ist das er "da sein" muss. Allerdings muss ich dann direkt nach dem aufruf das start zurücksetzen, damit der Baustein not acitve rausgibt. Ich geb jetzt ne Flanke drauf und gut ist. Hätte mal gerne gewusst wie du es beim Testen gemacht hast. Wann hast du denn Start zurückgesetzt?

Alles was ich erwartet hätte ist, das ich den baustein aufrufen kann wie hier:

Code:
fbReadScsData( 
  Start:= TRUE,
  Mode:= 5,
  StandardsParam:= 'S',
  SERCOS_Param := 84,
  DataAddr:= [COLOR=#0000ff]ADR[/COLOR](aSCSCycData),
  Size:= [COLOR=#0000ff]SIZEOF[/COLOR](aSCSCycData)
                                          );

[COLOR=#0000ff]IF NOT[/COLOR] fbReadScsData.Active
[COLOR=#0000ff]THEN[/COLOR]
       do something.....
     fbReadScsData(Start:=false);
[COLOR=#0000ff]END_IF[/COLOR]

und dann nur noch auf not active warten muss um den baustein zu beenden und die daten abzuholen. Dann hätte ich den baustein noch einmal mit false aufgerufen und thats it. Wo setzt du START zurück???
 
Zuletzt bearbeitet:
Zurück
Oben