FB Aufruf mit DB übergabe in AWL/SCL

Admec

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

Ich habe eine Frage zum Thema übergabe von DB's. Ich habe einen Aufruf eines FC's, der Auruf ist in AWL.
Den FC selber will ich in SCL programmieren. Der FC soll jeweils einen Achsdatenbaustein bedienen (lesen und schreiben), pro Instanz wird eine andere Achse angesteuert. Beim Aufruf will ich jeweils nur den DB der betreffenden Achse übergeben, intern im FC möchte ich eigentlich mit den UDT-Symbolen des DB's programmieren. Alle Achsbausteine sind mit dem selben UDT erstellt. Gibt es hierfür eine Möglichkeit? Kann ein DB als VAR_IN_OUT definiert werden?

Ich habe momentan nur folgende Lösung gefunden, leider ohne symbolischen zugriff (da eine neue Sicht mit "AT" nicht funktionniert):

FUNCTION FC94 : VOID

VAR_INPUT
bdbAxisDB: Block_DB;
bRegelImpulsfreigabe, // [BOOL] 0=Keine Freigabe / 1=Regel-und Impuls
bKeineAchssperre:BOOL; // [BOOL] 0=Achssperre aktiv / 1=Freigabe
END_VAR

// Regel- und Impulsfreigabe setzen
bdbAxisDB.DBX2.1:=bRegelImpulsfreigabe;
bdbAxisDB.DBX21.7:=bRegelImpulsfreigabe;

// VorschubHalt setzen
bdbAxisDB.DBX4.3:= NOT bKeineAchssperre;

END_FUNCTION;
 
pro Instanz wird eine andere Achse angesteuert. Beim Aufruf will ich jeweils nur den DB der betreffenden Achse übergeben, intern im FC möchte ich eigentlich mit den UDT-Symbolen des DB's programmieren. Alle Achsbausteine sind mit dem selben UDT erstellt. Gibt es hierfür eine Möglichkeit?
Genau dafür gibt es FB (FUNCTION_BLOCK). Schreibe Deinen Baustein als FUNCTION_BLOCK.
Statt UDT heißt der Instanz-Datenspeicher dann Instanz-DB bzw. Multiinstanz. Der Instanz-DB bzw. die
Multiinstanz-Struktur wird nicht als Übergabeparameter übergeben, sondern beim Aufruf mitgegeben.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok Danke, grundsätzlich stimme ich dir zu. Es ist nur so, dass die Besagten Achs-DB's vom System erzeugt wird und nicht angepasst werden kann. Das heisst, ich kann ihn auch schlecht als Instanzdatenbaustein verweden. Der Achs-DB an sich kommt im Projekt selber auch gar nicht vor (nur in der Symboltabelle mit Siemens-UDT31), er wird erst auf der Maschinensteuerung generiert.
Ich möchte diese DB's also wirklich nur als Signalschnittstelle verwenden.

Gruss, Admec
 
Hallo,
in dem Fall gäbe es dann die Möglichkeit, den UDT selbst auf die Schnittstelle des Bausteins zu legen und dann damit zu arbeiten. Wenn dem SCL-Script der Datentyp (UDT31) auch bekannt ist kannst du direkt mit dem IN_OUT-Parameter arbeiten oder, was vielleicht schöner wäre, ihn beim Start des FC's (ich hielte hier allerdings auch einen FB für besser - wegen dem Gedächnis) in den TEMP-Bereich kopieren, mit den lokalen Variablen arbeiten (das spart ggf. Zykluszeit) und ihn am Ende des FC's wieder zurück zu schreiben.

Die Übergabe an den Baustein selber geht dann über einen symbolischen Pointer (z.B. "meinDB".Achse_1).

Geht das jetzt in deine Richtung ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Harald
Ja klar, das System kann ich nennen, hat jedoch nicht direkt mit meinem Problem zu tun. Es ist eine Sinumerik 840D Powerline NC-Maschinensteuerung. Die SPS ist ein Teil der ganzen Steuerung.


@Larry

Danke auch dir, ich denke das geht schon ziemlich in meine Richtung. Ich habe versucht den UDT direkt als Schnittstelle an zu geben, der SCL COde an sich lässt sich so auch problemlos compilieren. Wenn ich jedochbeim Bausteinaufruf in AWL den DB zuweisen will, klappt das nicht mehr. Erwartet wird an dieser Stelle ein "Struct". Gibt es da noch irgend einen Trick, wie man den DB angeben kann? (Code siehe unten)
Betreffen FC oder FB ist mir klar, mit dme FB habe ich sicher immer die zuletzt verwendeten Daten. Ich werde ev. eh Lokale "Merker" gebrauchen, somit wäre sowieso der FB wieder im Vorteil. Wie würde dies genau gehen, mit dem symbolischen Pointer? Kannst du ein kleinen Codebeispiel machen?

Gruss, Admec

FUNCTION FC94 : VOID

VAR_INPUT
bdbAxisDB: BLOCK_DB;
bRegelImpulsfreigabe, // [BOOL] 0=Keine Freigabe / 1=Regel-und Impulsfreigabe setzen
bKeineAchssperre:BOOL; // [BOOL] 0=Achssperre aktiv / 1=Freigabe zum verfahren
END_VAR

VAR_IN_OUT
AchsDB:UDT31;
END_VAR


// Regel- und Impulsfreigabe setzen
//bdbAxisDB.DBX2.1:=bRegelImpulsfreigabe;
//bdbAxisDB.DBX21.7:=bRegelImpulsfreigabe;
AchsDB.A_ContrEnable:=bRegelImpulsfreigabe;
AchsDB.A_PulseEnable:=bRegelImpulsfreigabe;

// VorschubHalt setzen
bdbAxisDB.DBX4.3:= NOT bKeineAchssperre;

END_FUNCTION
 
Wenn ich jedochbeim Bausteinaufruf in AWL den DB zuweisen will, klappt das nicht mehr. Erwartet wird an dieser Stelle ein "Struct".
AWL-Aufrufbeispiel, wenn Du einen DB11 "DB_Achse1" hast und darin ist ein UDT31 "AchsData", der 22 Byte lang ist:
Code:
CALL FC94
 bRegelImpulsfreigabe:=M10.0
 bKeineAchssperre    :=M10.1
 AchsDB              :="DB_Achse1".AchsData  //z.B. P#DB11.DBX 0.0 BYTE 22
Wenn der AWL-Editor das "DB_Achse1".AchsData nicht nehmen will, dann versuche die Eingabe: P#DB11.DBX 0.0 BYTE 22
Wenn alles klappt, dann macht der AWL-Editor daraus ein P#DB11.DBB0 (Zugriffsbreite 22 Byte)

Harald
 
Hallo Admec,
PN/DP hat den Ball ja schon aufgenomen. Du mußt es dann genau so machen, wie in dem Beitrag.
Was mir an deinem Script-Schnipsel aufgefallen ist :
Wenn du mit dem UDT auf der Schnittstelle arbeitest, dann entfallen dardurch natürlich (und das ist ja auch gut so) ALLE absolute Zugriffe auf irgendwelche beteiligten DB-Adressen. Das solltest du berücksichtigen und auch generell (bei solchen Bausteinen) vermeiden ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat geklappt!

Hallo Zusammen

Genau, um die absoluten zugriffe ging es mir ja. Es hat nun geklappt. Ich musste den UDT anpassen, damit darin ein benanntes Struct vorhandne ist. Mit der Übergabe DBName.StructName klappt das ganze dann einwandfrei, wenn in der Schnittstelle eben dieses UDT definiert ist. Di Übergabe rein als Pointer hat aber nicht geklappt, obwohl die Angabe "DBName.StructName" schlussendlich auch als Pointer interpretiert wird. Danke für die Tipps!

Grüsse, Admec
 
Zurück
Oben