Unzulässige Parameterversorgunge bei Übergabe von in_out var von Multiinst. FB zu FC

iga-graz

Level-1
Beiträge
46
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich habe folgendes Problem.

Ich möchte von einer aufgerufenen Multiinstanz, die als in_out Variablen ein array hat, dieses an einen FC, der in der Multiinstanz aufgerufen wird, als in_out Variablen übergeben. Beide haben natürlich die gleiche Größe und Struktur. Beim Übersetzen bekomme ich einen Fehler: unzulässige Parameter-Versorgung

Hier noch mal mein Versuch die Struktur "grafisch" darzustellen:

Aufruf FB

Multiinstanz FB (inout array) --> FC (inout array)



Aufruf Dbi

Ich bin schon draufgekommen, das die Übergabe von in_out var nicht so einfach ist. Die Übergabe basiert auf einem DB-Zeiger.

Wenn ich die Übergabe der var über stat_var mache geht es auch. Ich wollte halt eine "gekapselte" Multiinstanz mit Schnittstelle erzeugen.

Hat vielleicht von euch jemand eine Idee wie man das Problem umgehen könnte, oder vielleicht eine Lösung.

Vielen Dank im voraus.

chris
 
Multiinstanz geht meines wissens nach nur mit zwei FB's.
Du sparst dir dann weitere Instanzdatenbausteine für jeden FB.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sieh dir auch das mal an, besonders marlobs Siemens-Link:

http://www.sps-forum.de/showthread.php?t=17479&highlight=INOUT

Ich glaube Array, UDT und auch Structs kann man nicht so einfach durchreichen, da sie ja nicht direkt übergeben werden, sondern als Any-Pointer im IDB abgelegt werden. Daher muß man sich den Pointer hernehemen und kann diesen dann weiterreichen. Leider geht dabei der eigentiche Vorteil verloren, man kann nicht mehr direkt mit der Symolik des übergebenen Structs alá mystruct.testvar arbeiten, sonden muß sich das alles selbst zusammenbasteln. Eine weitere Variante wäre das Umkopieren des 1. Inputs in ein statisches array/udt/stuct und diese dann übergeben. Das geht aber wieder zu Lasten der Zykluszeit.
 
Zuletzt bearbeitet:
hi ralle, wie würdest du denn ein array oder ein struct von in auf stat var umkopieren.
da muss ich mir ja auch was zusammenbasteln, mit blockmove usw. oder hast du einen besseren vorschlag.
 
Ich würde das ARRAY über einen ANY-Pointer einlesen.

aber Gegenfrage: Wofür brauchst du das überhaupt ? Kannst du die Daten, die du übergeben willst nicht schon mit dem FB erzeugen ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi, wie meinst du das denn, wie ich die daten mit dem fb erzeugen soll?

ich habe einen aufruf FB, in diesem 2 Multiinstanzen, die ich mit in-outs beschalten will, und in diesen Multiinstanzen wird jeweils der selbe FC aufgerufen, der die in_out var benötigen würde.

Ich würde das ARRAY über einen ANY-Pointer einlesen.

aber Gegenfrage: Wofür brauchst du das überhaupt ? Kannst du die Daten, die du übergeben willst nicht schon mit dem FB erzeugen ?

Gruß
LL

Grüße chris
 
Hallo Chris,
ich habe da schon eine Idee, aber ob die für dich paßt kann ich ohne mehr Info nicht sagen. Deshalb noch einmal die Frage von eben :
Wofür brauchst du das überhaupt ? Kannst du die Daten, die du übergeben willst nicht schon mit dem FB erzeugen ?
Jetzt müßtest du nur den Passus "mit dem FB erzeugen" gegen "mit dem FB verarbeiten" austauschen ...
Aber da kann ich auch vollkommen falsch damit liegen ... deshalb die Frage nach dem "Wofür".

Gruß
LL
 
Hi, also:
ich habe 2 Anlagenteile die ich jeweils in einem aufruf FB aufrufen möchte.
--> AT_FB, ATx_dbi
Die Programmstruktur:
aufrufFB, aufrufFB_dbi
MultiInst_FB_1
AT_FB, AT1_dbi

MultiInst_FB_2
AT_FB, AT2_dbi

jeden Anlagenteil muss ich vom aufrufFB aus beschalten, da sich diese beiden Anlagenteile in ein paar Ausprägungen unterscheiden.

Das wären nun keine Multiinstanzen sondern normale FB Aufrufe aus einem FB. --> AT_FB, ATx_dbi


ich habe nun für die Beschaltung der beiden Anlagenteile vor, im aufrufFB für jeden Anlagenteil eine Multiinstanz zu erstellen. --> MultiInst_FB_x

in diesem MultiInst_FB_x wiederum wird ein FC aufgerufen, der als in_out Variablen arrays mit structs hat.

Mein Ziel war es eigentlich mit den MultiInst_FB_x eine gewisse "Kapselung" zu erreichen, da die Anlage irgendwann noch erweitert wird und ich mir für die Beschaltung die Tippfehler ersparen wollte.

Ich hoffe mein Problem wird jetzt deutlicher.

Vielen Dank im voraus.

gr chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... irgendwie kommen wir beide nicht weiter ...

Es war mir schon klar, dass du (bei deinem Beispiel bleibend) den FC100 sowohl vom FB1 als auch vom FB2 aus aufrufst. Dieser FC100 (ich nenne ihn mal so) verarbeitet einen Teil der Daten aus dem FB (1 oder 2), die er zuvor als ARRAY übermittelt bekommen hat.
Meine Frage war nun, warum du die Daten dem FC zum Bearbeiten übergibst und sie nicht schon im FB verarbeitest ?

Wie auch immer ... wenn du so vorgehen möchtest, dann ist aus meiner Sicht der ANY-Pointer der richtige Weg (oder alternativ ein UDT). Mit dem ANY bis du nur aus vielleicht etwas flexibler bei Änderungen.

Gruß
LL
 
Es wird nur ein Any gehen, den er "durchreicht", auch ein UDT läßt sich nicht "Durchreichen", dafür sind eigentlich die Pointer als In gedacht (steht jedenfalls in der Siemens Hilfe.

ig-graz

Richtig, umkopieren mit SFC20. Aber Achtung, zum Schluß muß das sicher auch wieder zurückkopiert werden, schon wegen der INOUT.
 
hallo ralle und larry, vielen dank euch beiden für die raschen antworten.

ich habe mir schon gedacht, dass das nicht so einfach ist (wie ralle sagt: allein schon wegen dem in_out verhalten).

ich habe mich aus gründen der vereinfachung dazu entschlossen den fc im aufruf_FB, getriggert durch ein Bit aus der Multiinstanz, aufzurufen. ist glaube ich aus gründen der übersichtlichkeit und des fehlerhandlings die einzig richtige wahl.

bg chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... dann wirst du auch umkopieren müssen ...

Meine Idee an dieser Stelle war (aber das hängt halt stark von deiner Anwendung / Problemstellung ab), dass du die gleiche Instanz eines FB's mehrfach aufrufst. Über entsprechende Steuerbits (oder andere Schnittstellen-Variablen) sagst du dem FB, ob er Datenbereich 1 oder Datenbereich 2 benutzten soll - oder aber ob er dieses oder jenes mit den gleichen Daten anstellen soll.
So etwas findet bei mir Anwendung. Der Vorteil hier ist, dass du in einem in sich geschlossenen Daten-Konstrukt arbeiten kannst und es hier auch mit den Zugriffen auf Daten-Inhalte etwas einfacher hast.

Aber wie schon gesagt ... (s.o.)

Gruß
LL
 
Hallo zusammen, ich habe folgendes Problem.
Hier noch mal mein Versuch die Struktur "grafisch" darzustellen:

Aufruf FB

Multiinstanz FB (inout array) --> FC (inout array)
Nochmal das Problem aufzugreifen, die Länge des Array muss natürlich festgelegt werden.
Aber wie wäre es, mit diesen Varianten:

1. Array als UDT definieren und über diesen Umweg die Werte übergeben.
2. Statt inout ein IN und OUT des gleichen Typ's, evt mit einem Steuerbit im FC, das angibt ob die OUT-DAten übernommen werden sollen oder nicht.

Klar ist das etwas "Hand-am-Arm"... Prinzipiell finde ich die Idee der Kapselung aber schon in die richtige Richtung. BTW: In welchen Sprachen sind die Bausteine FB/FC gehalten. hth
 
Hallo Larry, ist ein sehr interessanter Ansatz mit deinem Vorschlag:
---
Über entsprechende Steuerbits (oder andere Schnittstellen-Variablen) sagst du dem FB, ob er Datenbereich 1 oder Datenbereich 2 benutzten soll - oder aber ob er dieses oder jenes mit den gleichen Daten anstellen soll.
---

Grundsätzlich ist ja schon durch den Aufruf der Multiinst. festgelegt welcher Datenbereich für die Instanz zur Verfügung steht.

Aber dein Ansatz mit einem Steuerbit (oder ähnlichem) die Datenbereiche auszuwählen hört sich sehr interessant an.

Wie setzt du diesen Ansatz dann bei dir programmtechnisch um?

ad: kiestumpe

der Vorschlag mit in und out getrennt ist auch sehr interessant, finde ich, da ja nur bei der Parameterübergabe von in_out ein DB-Pointer benutzt wird, bei in und out werden die Werte übergeben

Auf jeden Fall ein grosses Danke für die rege Disskusion an alle.:)
 
Hallo Chris,
ich beschreibe dir mal anhand eines Beispiels, was ich (und wie ich es) mache.

Ich habe einen FB "Kurven". Dieser hat unterschiedliche Steuer-Eingänge. Die 2 wichtigsten sind "Werte aufzeichnen" und "Kurve auswerten / glätten". Das "Werte aufzeichnen" passiert im OB35 und dort mache ich dann nicht viel mehr als "schreibe Wert in Speicher und erhöhe Pointer". Die Auswertung starte ich nicht dort, sondern in dem Ablauf-FC, der ursächlich die Geschichte startet. Der Grund dafür ist, dass die Auswertezeit (je nach CPU und Kurve) durchaus mal auf 300 - 500 ms hochlaufen kann. Das wäre für den OB35 das Aus - den FC stört das nicht. Entscheidend ist hier aber, dass ich beide Male auf die gleichen Datenbereiche zugreife und letztendlich die Auswertung davon erhalte (Quasi als Funktions-Ergebnis).

Ich hoffe, das inspiriert dich weiter ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo LL, danke für den Tip, ich verstehe schon das Konzept dahinter, einerseits hast du einen kurzen Aufruf des FB im Interrupt nur für die Datenaufzeichnung und andererseits für die Datenauswertung einen Aufruf der durchaus länger dauern darf im Aufruf FC. Und der Vorteil das immer die gleiche Datenbasis dahinter ist. Das kann ich glaube ich gut gebrauchen. Wie gesagt vielen Dank. Grüße chris

ps: sorry ich wollte dir über den Danke Button antworten, aber das hat nicht geklappt.
 
Zurück
Oben