Step 7 ANY-Pointer automatisch auf POOL DB initialisiert

Jason07

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bin grade dabei einen Baustein mit ANY-Eingängen zu schreiben, der erkennen soll, ob seine Eingänge verschaltet sind oder nicht. Die Überlegung war, dass ein ANY-Eingang der nicht verschaltet wurde theoretisch der Nullpointer NIL sein müsste. Schaue ich mir jedoch den instanz DB meines Bausteins an, muss ich festellen, dass meine ANY-Pointer die nicht verschaltet sind auf einen POOL DB vom Autor ES_MAP zeigen. Dieser erhält ein INT ARRAY. Lässt sich diese Initialisierung verhindern, so dass nicht Verschaltete ANY-Eingänge vom Typ NIL sind?
Grüße Jonas
 
Das sieht stark danach aus dass du CFC verwendest.

CFC verwendet den POOL-DB als Zwischenspeicher für bestimmte Funktionen. Z.B. müssen bei einem FC die Parameter mit Werten beschaltet werden, auch wenn diese im CFC Plan leer bleiben. Darum werden diese mit Variablen in dem Fall aus diesen Pool-DB beschaltet, damit das Übersetzen des SCL-Programms funktioniert. Eingänge werden ganz einfach mit Konstanten im Quellcode übersetzt, darum lassen sich diese auch nicht wie bei FBs im Online-Modus schreiben, sondern es muss dazu immer das Programm übersetzt und geladen werden.

Theoretisch wäre es bei einem FB möglich einen Parameter von Typ ANY leer zu lassen, aber Siemens macht das in CFC trotzdem so. Du kannst dir beim Übersetzen des CFC-Plans mal den Haken bei "SCL Quelle generieren" setzen und dir ansehen was der CFC-Übersetzer aus deinem Plan generiert. Daran ändern kannst du allerdings nichts.
Leider ist die Pool-DB Nummer auch noch einstellbar, sodass es nur bedingt funktionieren würde auf diese Nummer abzufragen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort. Sehr informativer Beitrag von dir. Ja ich verwende den Baustein(FB) in einem CFC-Plan. Ich hatte auch schon Situationen in denen der ANY-Pointer leer geblieben ist, aber leider kann ich die Randbedingungen nicht mehr rekonstruieren. Vielleicht war es auch Zufall. Also liegt das Problem eigentlich im CFC. An dem kann ich aber leider nicht vorbei. Habe ich irgendwelche anderen Möglichkeiten herauszufinden ob ein Eingang meines Bausteins verschaltet ist? Bedingung ist, dass der Baustein der angeschaltet wird ein Standardbaustein ist, ansonsten könnte ich ja einfach ein Statusbit hinzufügen.
 
Was ist bei dir denn ein Standardbaustein?

Der Pool-DB ist der mit der ersten freien Nummer nach dem reservierten Anwenderbereich, der wie gesagt in den Übersetzungsoptionen einstellbar ist. Ich meine zumindest dass das immer der erste ist, habe noch nichts anderes gesehen.
Aber in der Natur der Dinge liegt es bei einem Any-Pointer, dass du diesen mit allen möglichen anderen Werten beschalten kannst. Wenn du einen Out-Parameter eines anderen FBs mit dem Any-Eingang verschaltest, bekommst du einen Any-Pointer auf den Instanz-DB der anderen FB-Instanz. Und diese Nummer kann auch wieder bei jedem Übersetzungslauf anders sein. Du weißt nur dass die Nummer außerhalb des reservierten Bereichs liegt.
Das Prinzip verwendet Siemens auch bei Bausteinen der PCS7-APL, um daraus in der OS Bildsprünge zu anderen Bausteinen zu erzeugen.
 
Noch schlimmer. Es gibt pro Datentyp einen Pool-DB. Wenn du von Anfang an alle Datentypen verwendest, sind dieses die ersten freien Bausteinnummer. Alles was später kommt wird einfach mit der Nummer hinter den bestehenden angehängt.
Die Nummern zuverlässig im Programm auszuwerten wird darum schwer. Da müsste man schon die Bausteininformationen auslesen können (was imho nicht geht), oder sich auf die Länge verlassen die man mit Test-DB ausliest (unzuverlässig).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Standardbaustein meine ich ein Baustein aus vorhanden Bibliotheken, wie z.B. der APL. Ich kann die Schnittstelle der Bausteine nicht verändern die auf meinen Baustein aufgeschaltet werden. Dass ist die Grundvorraussetzung. Ansonsten könnte ich ja hingehen und StatusBits Einführen, wie diese bei der APL vorhanden sind. Werden APL-Bausteine auf meinen ANY Eingang geschaltet kann ich ja das Status Byte auswerten um Festzustellen ob ein Baustein vorhanden ist. Vorrausgesetzt im POOL DB stehen immer die Werte Null für die Default Verschaltungen.
Es gibt sicher auch keine Möglichkeit im Programm den Anwender Bereich der DBs herauszufinden oder? Was meinst du mit Test-DB?

EDIT: Zur Poolbaustein Reihenfolge ist mir grade nochwas aufgefallen. Die meisten unverschalteten ANY- Anschlüsse zeigen auf den DB 61, der mit einem INT Array gefüllt ist. Andere ANY Anschlüsse des selben Bausteins zeigen auf den DB107, ebenfalls mit INT gefüllt. Mein DB Anwenderbereich geht von 0-60. Somit passt der DB 61 ins Muster. DB 62 ist auch ein POOL für BOOL. Ansonsten sind weiter POOLs in den 90er und 100er - 110er Nummern verteilt. Wahrscheinlich je nachdem wann ich welche Variablen Typen benutzt habe. Aber Warum gibts es 2 POOLs für INT. Ist der eine dann zu klein gewesen? So wirklich zuverlässig um das ganze im Programm zu nutzen, scheint mir das nicht.
 
Zuletzt bearbeitet:
Zurück
Oben