Ein DB Array in FC übergeben

All4one

Level-2
Beiträge
29
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.
Die Idee ist im Grunde trivial (denke ich....)
Ich will Bit-Weise ein Array aus einem DB in eine Funktion übergeben.
Ich habe eine Schleife die 54mal durchlaufen wird, und bei jedem durchlauf sollte das nächste Bit aus dem DB in die FC übergeben werden.
Also praktisch:
AUF "CNT_EA"
L 53
T #index
beg: NOP 0
L #index
T #Ptr

CALL FC 1
Eingang:=
count :=#Ptr

L #index
L 1
-I
T #index
L #index
L 0
<I
SPB ende
SPA beg
ende: NOP 0

Allerdings kann ich beim Eingang keine Variable übergeben,die mein Array ein Bit nach einander aus dem DB liest.
Was kann ich tun???
 
Hallo,

ich verstehe die Frage nicht wirklich.
Natürlich kannst du einem Baustein entweder ein ARRAY oder einen ANY-Pointer als IN-Parameter übergeben.
In beiden Fällen mußt du dir dann in dem Baustein den übergebenen Pointer zerlegen und ihn dann zu Adressierung der eigentlichen Adresse hernehmen.
Dazu gibt es im Forum unzählige Beispiele. Am Besten mal in der Foren-Suche das Stichwort "indirekte Adressierung" eingeben. Da findet sich sehr wahrscheinlich auch etwas, das für dich passen könnte ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich verstehe die Frage nicht wirklich.
Natürlich kannst du einem Baustein entweder ein ARRAY oder einen ANY-Pointer als IN-Parameter übergeben.
In beiden Fällen mußt du dir dann in dem Baustein den übergebenen Pointer zerlegen und ihn dann zu Adressierung der eigentlichen Adresse hernehmen.
Dazu gibt es im Forum unzählige Beispiele. Am Besten mal in der Foren-Suche das Stichwort "indirekte Adressierung" eingeben. Da findet sich sehr wahrscheinlich auch etwas, das für dich passen könnte ...

Gruß
Larry

wenn es sich nur um ein bit handelt kann man auch eine temp-variable zur übergabe bereitstellen...
einfache zuweisung mit indirekt adressiertem aufruf
 
Danke für eure überlegungen,allerdings komme ich noch nicht weiter.
Im allgemeinen muss ich über 50 Motoren ansteuern,sie tun alle dasselbe.Lediglich hat jeder eine Menge an Sensoren zu bearbeiten, die ich in einer Multiinstanz aufrufen möchte,und das alles in einer Schleife (z.B. 50) mal aufrufe.
Nehmen wir mal einfach an,die Motoren besitzen eine Temperatur Sensor und Endschalter.So eine Code habe ich bereits in Codesys programmiert und ist recht einfach.Allerdings ist jetzt eine S7 dran.
Also möchte ich 50 mal die Multiinstanz aufrufen,in jeder wird separat alle Bits verarbeitet und ausgegeben.
Wenn ich jetzt einen FB erstelle,eine IN Variabel erstelle und sie als 'Bool' deklariere,kann ich in dem Baustein indem ich sie aufrufe,kein Array übergeben.[1..50] Ich hatte es mit so gedacht:
Call "MultiInstanz"
Eingang:=DBn.Array[#index]
....
Ausgang:=DBm.Array[#index]
...
Loop ...
Ich glaube da ist nur ein geringer Denkfehler,allerding beisse ich mir mitlerweile die Zähne daran aus.
Ich kann dem Engang kein Array übergeben.Wie kommt das?
 
Wenn ich jetzt einen FB erstelle,eine IN Variabel erstelle und sie als 'Bool' deklariere,kann ich in dem Baustein indem ich sie aufrufe,kein Array übergeben.

Wenn du einen Eingang mit bool definierst kannst du natürlich kein Array übergeben. Warum deklarierst du den Eingang denn nicht auch als Array?
 
@TE:
Du kannst in Step7 kein ARRAY_of_FB machen - das geht nicht.
Du kannst aber durchaus indizierte Elemente an einen Baustein übergeben. Idealerweise würde ich das aber in SCL tun und nicht in AWL oder so.
Von der Überlegung könnte man es so machen, dass du nicht einen FB für deine Motorsteuerung machst sondern einen FC, dem du dann in der Schleife auch seine Arbeitsdaten (also das, was und wo er sich etwas "merken" soll) mit übergibst.
Wäre das ggf. eine Möglichkeit für dich ?

Gruß
Larry
 
Mit einem FC habe ich es anfangs probiert.Wie erwähnt,in Codesys ist es ganz einfach.
Da sieht es vereinfacth so aus:
FOR index:=1 TO 60 DO
multi_instanz(
Start:=nut_state.Taster_Steuerbirne[index], (** Eingang n **)
Temperatur_sensor:=nut_state.Temperatur[index], (** Eingang n+1 **)
(** Eingang n+... **)
);
nut_state.Relais_Kontakt[index]:=multi_instanz.Motor; (** Ausgang "Motor" auf's Ausgangs-Array **)
END_FOR
Das wollte ich in S7 programmieren,allerdings in AWL,da SCL undere Lizenz nicht beinhaltet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wenn ich mir das (auch wenn schematisch) so ansehe, dann kann deine Multi-Instanz aber keine FB-Fähigkeiten haben (also merkt sich nichts) sondern wird komplett über die Schnittstelle versorgt. Das wäre dann eher ein FC.
Aber wie auch immer. AWL kann nicht wie SCL (oder ST) Variablen direkt indexieren sondern nur über Pointer oder als absolute Eingabe. Das willst du ja nicht. Ich würde dann ggf. mal über den Erwerb von SCL nachdenken, da du dort die meißten Dinge auch so machen kannst, wie dir schon bekannt ist - in AWL würde ich das nicht anpacken (meine Meinung) obwohl es natürlich ginge (halt über Pointer bilden).

Was hast du nun vor ?

Gruß
Larry
 
Zurück
Oben