Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: FB Aufruf mit DB übergabe in AWL/SCL

  1. #1
    Registriert seit
    06.10.2010
    Beiträge
    4
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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;
    Zitieren Zitieren FB Aufruf mit DB übergabe in AWL/SCL  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Admec Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Admec (06.10.2010)

  4. #3
    Admec ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.10.2010
    Beiträge
    4
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  5. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Admec Beitrag anzeigen
    Es ist nur so, dass die Besagten Achs-DB's vom System erzeugt wird und nicht angepasst werden kann. [...]
    er wird erst auf der Maschinensteuerung generiert.
    Dann solltest Du eventuell erwähnen, wie das "System" heißt.
    Vielleicht gibt es ja Applikationshinweise und -beispiele dazu.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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

  7. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Admec (07.10.2010)

  8. #6
    Admec ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.10.2010
    Beiträge
    4
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @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

  9. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Admec Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Admec (07.10.2010)

  11. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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

  12. #9
    Admec ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.10.2010
    Beiträge
    4
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Zitieren Zitieren Hat geklappt!  

Ähnliche Themen

  1. Parameter Übergabe in ST
    Von RobiHerb im Forum Programmierstrategien
    Antworten: 10
    Letzter Beitrag: 11.05.2010, 07:20
  2. Struc-Übergabe in FB
    Von Immer_1 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 17.10.2008, 15:41
  3. SCL: Übergabe Instanz-DB (für FB in FC)
    Von IchBinsNur im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 22.07.2008, 19:34
  4. Antworten: 1
    Letzter Beitrag: 11.03.2008, 09:39
  5. Antworten: 3
    Letzter Beitrag: 07.03.2008, 11:09

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •