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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Aufruf eines in SCL geschriebenen FBs in OB1

  1. #11
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Da fehlt doch ein BEGIN in deinem FB1 - nach der Var-deklaration...

    Bitte nicht FB1, DB1, OB1 - gib denen doch bitte Symbolische Namen (funktioniert auch ohne - wär aber schön - Merci)

  2. #12
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard

    Code:
    IF RESET1 THEN 
        XOUT1:=X01;
    ELSIF RUN1 THEN 
        XOUT1:= XOUT1 + XIN1*CYCLE*0.001*KI1;(*0.001 wegen ms*); //Strichpunkt vergessen???
    END_IF;
    Beim übersetzen von welchem Baustein kommt die Fehlermeldung (FB1, DB1 oder OB1)?

    Hast du den DB noch im KOP-FUP Editor offen?

    Printscreen von deinem SCL-Editor (mit Fehlermeldung vom Compiler) wäre hilfreich...

    !!! ENDLICH MAL EINER DER SCL BENUTZT - das freut mich !!!

  3. #13
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard

    Wenn das noch nicht hinhaut:

    leeren FB mal übersetzen, mal schauen ob das geht. Danach den Inhalt Blockweise einfügen...

  4. #14
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard

    im OB1 würde ich auch noch ein BEGIN reinhängen...

  5. #15
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    So habe die Sache jetzt mal richtig gestellt.

    Code:
    FUNCTION_BLOCK FB1
    NAME : Integral
    
    VAR_INPUT
    RUN1: BOOL; (*Startsignal*)
    RESET1:BOOL; (*Rücksetzsignal*)
    KI1:REAL := 1.0; (*Integrierbeiwert in 1/sec*)
    XIN1:REAL := 0.01; (*Eingangssignal*)
    X01:REAL; (*Anfangswert*)
    XMAX1:REAL := 1000.0; (*Maximalwert*)
    XMIN1:REAL := 0.0; (*Minimalwert*)
    CYCLE:REAL := 0.5; (*Zykluszeit*)
    END_VAR
    VAR_OUTPUT
    QRUN1:BOOL; (*Run_Modus*)
    QRES1:BOOL; (*zurückgesetzt*)
    QG1:BOOL; (*am Anschlag*)
    XOUT1:REAL; (*Ausgangssignal*)
    END_VAR
    
    BEGIN
    QRUN1:=RUN1;
    QRES1:=RESET1;
    IF RESET1 THEN XOUT1:=X01;
    ELSIF RUN1 THEN XOUT1:= XOUT1 + XIN1*CYCLE*0.001*KI1;(*0.001 wegen ms*)
    END_IF;
    IF XOUT1>XMAX1 THEN XOUT1:=XMAX1;QG1:=TRUE;END_IF;
    IF XOUT1<XMIN1 THEN XOUT1:=XMIN1;QG1:=TRUE;END_IF;
    IF XOUT1>XMIN1 AND XOUT1 < XMAX1 THEN QG1:=FALSE;END_IF;
    END_FUNCTION_BLOCK
    
    DATA_BLOCK DB1 FB1
    BEGIN
    END_DATA_BLOCK
    ORGANIZATION_BLOCK OB1
    VAR_TEMP
    info : ARRAY[0..19] OF BYTE;
    END_VAR
    BEGIN
    FB1.DB1(RUN1 := E0.0 // IN: BOOL
           ,RESET1 := E0.1 // IN: BOOL
           ,KI1 := ED1 // IN: REAL
           ,XIN1 := ED5 // IN: REAL
           ,X01 := ED9 // IN: REAL
           ,XMAX1 := ED13 // IN: REAL
           ,XMIN1 := ED17 // IN: REAL
           ,CYCLE := ED21 // IN: REAL
           ); 
       A0.2 := DB1.QRUN1; // OUT: BOOL
       A0.3 := DB1.QRES1; // OUT: BOOL
       A0.4 := DB1.QG1; // OUT: BOOL
       DB1.XOUT1 := DB1.XOUT1; // OUT: REAL
    END_ORGANIZATION_BLOCK
    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  6. #16
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard

    ungültiger Datentyp

    ,KI1 := ED1 // IN: REAL
    ,XIN1 := ED5 // IN: REAL
    ,X01 := ED9 // IN: REAL
    ,XMAX1 := ED13 // IN: REAL
    ,XMIN1 := ED17 // IN: REAL
    ,CYCLE := ED21 // IN: REAL

    ansonsten sollte es jetzt laufen...

  7. #17
    Registriert seit
    17.10.2008
    Beiträge
    25
    Danke
    26
    Erhielt 4 Danke für 3 Beiträge

    Standard

    Zitat Zitat von sps-concept Beitrag anzeigen
    ....
    klingt als hätteste den FB1 noch mit einem Editor offen.
    ...
    Korrekter wäre:
    "klingt als hättest du den FB1 noch mit einem Editor offen."

  8. Folgender Benutzer sagt Danke zu chkdsk.exe für den nützlichen Beitrag:


  9. #18
    Registriert seit
    26.02.2009
    Ort
    Schweiz
    Beiträge
    33
    Danke
    3
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Den "ungültigen Datentyp" bekommt man weg, indem man vorher die Eingänge von DWORD nach REAL konvertiert und dann übergibt.
    Ebenso sollten die EDs günstigerweise immer mit einer geraden Adresse beginnen. Funktioniert auch anders, ist aber unsauber.

    Code:
    ORGANIZATION_BLOCK OB1
    VAR_TEMP
        info : ARRAY[0..19] OF BYTE;
        tmpKI1   : REAL;
        tmpXIN1  : REAL;
        tmpX01   : REAL;
        tmpXMAX1 : REAL;
        tmpXMIN1 : REAL;
        tmpCYCLE : REAL;
    END_VAR
     
    BEGIN
        tmpKI1   := DWORD_TO_REAL(ED2);
        tmpXIN1  := DWORD_TO_REAL(ED5);
        tmpX01   := DWORD_TO_REAL(ED9);
        tmpXMAX1 := DWORD_TO_REAL(ED13);
        tmpXMIN1 := DWORD_TO_REAL(ED17);
        tmpCYCLE := DWORD_TO_REAL(ED21);
     
        FB1.DB1(RUN1 := E0.0 // IN: BOOL
           ,RESET1 := E0.1 // IN: BOOL
           ,KI1 := tmpKI1 // IN: REAL
           ,XIN1 := tmpXIN1 // IN: REAL
           ,X01 := tmpX01 // IN: REAL
           ,XMAX1 := tmpXMAX1 // IN: REAL
           ,XMIN1 := tmpXMIN1 // IN: REAL
           ,CYCLE := tmpCYCLE // IN: REAL
           ); 
     
       A0.2 := DB1.QRUN1; // OUT: BOOL
       A0.3 := DB1.QRES1; // OUT: BOOL
       A0.4 := DB1.QG1; // OUT: BOOL
       DB1.XOUT1 := DB1.XOUT1; // OUT: REAL
    END_ORGANIZATION_BLOCK
    Viel Spass

    P.S.: Durch Einrückungen funktioniert's wohl nicht besser, aber es wird deutlich leichter zu lesen
    Geändert von stoecklepator (12.06.2009 um 21:06 Uhr)
    Jedes Problem erlaubt zwei Standpunkte: unseren eigenen und den falschen.
    Zitieren Zitieren Ungültiger Datentyp  

  10. #19
    Registriert seit
    25.06.2008
    Beiträge
    10
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Roland1 Beitrag anzeigen
    Hallo, ich habe gerade festgestellt,dass der Code nicht Komplett war.Hier der komplette Code. Was kann ich falsch gemacht haben? Danke für euere Hilfe.

    FUNCTION_BLOCK FB1
    NAME : Integral

    VAR_INPUT
    RUN1: BOOL; (*Startsignal*)
    RESET1:BOOL; (*Rücksetzsignal*)
    KI1:REAL; (*Integrierbeiwert in 1/sec*)
    XIN1:REAL; (*Eingangssignal*)
    X01:REAL; (*Anfangswert*)
    XMAX1:REAL; (*Maximalwert*)
    XMIN1:REAL; (*Minimalwert*)
    CYCLE:REAL; (*Zykluszeit*)
    END_VAR
    VAR_OUTPUT
    QRUN1:BOOL; (*Run_Modus*)
    QRES1:BOOL; (*zurückgesetzt*)
    QG1:BOOL; (*am Anschlag*)
    XOUT1:REAL; (*Ausgangssignal*)
    END_VAR
    KI1:=1.0;
    XIN1:=0.01;
    XMIN1:=0.0;
    XMAX1:=1000.0;
    CYCLE:=0.5;

    QRUN1:=RUN1;
    QRES1:=RESET1;
    IF RESET1 THEN XOUT1:=X01;
    ELSIF RUN1 THEN XOUT1:= XOUT1 + XIN1*CYCLE*0.001*KI1;(*0.001 wegen ms*)
    END_IF;
    IF XOUT1>XMAX1 THEN XOUT1:=XMAX1;QG1:=TRUE;END_IF;
    IF XOUT1<XMIN1 THEN XOUT1:=XMIN1;QG1:=TRUE;END_IF;
    IF XOUT1>XMIN1 AND XOUT1 < XMAX1 THEN QG1:=FALSE;END_IF;
    END_FUNCTION_BLOCK

    DATA_BLOCK DB1 FB1
    BEGIN
    END_DATA_BLOCK
    ORGANIZATION_BLOCK OB1
    VAR_TEMP
    info : ARRAY[0..19] OF BYTE;
    END_VAR
    FB1.DB1(RUN1:=E0.0,RESET1:=E0.1,KI1:=ED1,XIN1:=ED5,X01:=ED9,XMAX1:=ED13,XMIN1:=E D17,CYCLE1:=ED21,QRUN1:=A0.2,QRES1:=A0.3,QG1:=A0.4,XOUT1:=DB1.XOUT1);
    END_ORGANIZATION_BLOCK
    Hallo Roland1,

    der Aufruf hat ein paar formale Fehler, deshalb gibt es beim Übersetzen die Fehlermeldung. So sollte es formal gehen (ob der Code ansonsten leistet was Du willst weiß ich nicht):

    FUNCTION_BLOCK FB1
    VAR_INPUT
    RUN1: BOOL; (*Startsignal*)
    RESET1:BOOL; (*Rücksetzsignal*)
    KI1:REAL; (*Integrierbeiwert in 1/sec*)
    XIN1:REAL; (*Eingangssignal*)
    X01:REAL; (*Anfangswert*)
    XMAX1:REAL; (*Maximalwert*)
    XMIN1:REAL; (*Minimalwert*)
    CYCLE:REAL; (*Zykluszeit*)
    END_VAR
    VAR_OUTPUT
    QRUN1:BOOL; (*Run_Modus*)
    QRES1:BOOL; (*zurückgesetzt*)
    QG1:BOOL; (*am Anschlag*)
    XOUT1:REAL; (*Ausgangssignal*)
    END_VAR
    KI1:=1.0;
    XIN1:=0.01;
    XMIN1:=0.0;
    XMAX1:=1000.0;
    CYCLE:=0.5;

    QRUN1:=RUN1;
    QRES1:=RESET1;
    IF RESET1 THEN XOUT1:=X01;
    ELSIF RUN1 THEN XOUT1:= XOUT1 + XIN1*CYCLE*0.001*KI1;(*0.001 wegen ms*)
    END_IF;
    IF XOUT1>XMAX1 THEN XOUT1:=XMAX1;QG1:=TRUE;END_IF;
    IF XOUT1<XMIN1 THEN XOUT1:=XMIN1;QG1:=TRUE;END_IF;
    IF XOUT1>XMIN1 AND XOUT1 < XMAX1 THEN QG1:=FALSE;END_IF;
    END_FUNCTION_BLOCK

    //weiß nicht genau, was diese Anweisungen tun, sind aber jedenfalls unnötig.
    //beim Aufruf des FB mit angegebenen Instanz-DB wird der automatisch erstellt
    //siehe unten
    (*
    DATA_BLOCK DB1 FB1
    BEGIN
    END_DATA_BLOCK
    *)

    ORGANIZATION_BLOCK OB1
    VAR_TEMP
    info : ARRAY[0..19] OF BYTE;
    END_VAR
    //Aufruf enthält 2 grundsätzliche Fehler
    //FB1.DB1(RUN1:=E0.0,RESET1:=E0.1,KI1:=ED1,XIN1:=ED5,X01:=ED9,XMAX1:=ED13,XMIN1:=E D17,CYCLE1:=ED21,QRUN1:=A0.2,QRES1:=A0.3,QG1:=A0.4,XOUT1:=DB1.XOUT1);

    //Testaufruf von FB1 mit DB1 ohne Parameterübergabe
    FB1.DB1();

    //----------------------------------------------------------
    //1) richtigen Datentyp übergeben!
    //SCL macht strengere Typenüberprüfung als zB FUP
    fb1.db1(RUN1:=E0.0,KI1:=DWORD_TO_REAL(ED1));

    //-----------------------------------------------------------
    //2) Ausgangüparameter getrennt vom FB-Aufruf behandeln!
    //das geht nicht: fb1.db1(RUN1:=E0.0,KI1:=DWORD_TO_REAL(ED1),Qrun1:=A1.0 );
    //sondern so ähnlich
    A1.0:=db1.Qrun1; //Zuweisung der Ausgangs

    END_ORGANIZATION_BLOCK



    Grüße
    Felix123


    FUNCTION_BLOCK FB1
    VAR_INPUT
    RUN1: BOOL; (*Startsignal*)
    RESET1:BOOL; (*Rücksetzsignal*)
    KI1:REAL; (*Integrierbeiwert in 1/sec*)
    XIN1:REAL; (*Eingangssignal*)
    X01:REAL; (*Anfangswert*)
    XMAX1:REAL; (*Maximalwert*)
    XMIN1:REAL; (*Minimalwert*)
    CYCLE:REAL; (*Zykluszeit*)
    END_VAR
    VAR_OUTPUT
    QRUN1:BOOL; (*Run_Modus*)
    QRES1:BOOL; (*zurückgesetzt*)
    QG1:BOOL; (*am Anschlag*)
    XOUT1:REAL; (*Ausgangssignal*)
    END_VAR
    KI1:=1.0;
    XIN1:=0.01;
    XMIN1:=0.0;
    XMAX1:=1000.0;
    CYCLE:=0.5;

    QRUN1:=RUN1;
    QRES1:=RESET1;
    IF RESET1 THEN XOUT1:=X01;
    ELSIF RUN1 THEN XOUT1:= XOUT1 + XIN1*CYCLE*0.001*KI1;(*0.001 wegen ms*)
    END_IF;
    IF XOUT1>XMAX1 THEN XOUT1:=XMAX1;QG1:=TRUE;END_IF;
    IF XOUT1<XMIN1 THEN XOUT1:=XMIN1;QG1:=TRUE;END_IF;
    IF XOUT1>XMIN1 AND XOUT1 < XMAX1 THEN QG1:=FALSE;END_IF;
    END_FUNCTION_BLOCK

    //weiß nicht genau, was diese Anweisungen tun, sind aber jedenfalls unnötig.
    //beim Aufruf des FB mit angegebenen Instanz-DB wird der automatisch erstellt
    //siehe unten
    (*
    DATA_BLOCK DB1 FB1
    BEGIN
    END_DATA_BLOCK
    *)

    ORGANIZATION_BLOCK OB1
    VAR_TEMP
    info : ARRAY[0..19] OF BYTE;
    END_VAR
    //Aufruf enthält 2 grundsätzliche Fehler
    //FB1.DB1(RUN1:=E0.0,RESET1:=E0.1,KI1:=ED1,XIN1:=ED5,X01:=ED9,XMAX1:=ED13,XMIN1:=E D17,CYCLE1:=ED21,QRUN1:=A0.2,QRES1:=A0.3,QG1:=A0.4,XOUT1:=DB1.XOUT1);

    //Testaufruf von FB1 mit DB1 ohne Parameterübergabe
    FB1.DB1();

    //----------------------------------------------------------
    //1) richtigen Datentyp übergeben!
    //SCL macht strengere Typenüberprüfung als zB FUP
    fb1.db1(RUN1:=E0.0,KI1:=DWORD_TO_REAL(ED1));

    //-----------------------------------------------------------
    //2) Ausgangüparameter getrennt vom FB-Aufruf behandeln!
    //das geht nicht: fb1.db1(RUN1:=E0.0,KI1:=DWORD_TO_REAL(ED1),Qrun1:=A1.0 );
    //sondern so ähnlich
    A1.0:=db1.Qrun1; //Zuweisung der Ausgangs

    END_ORGANIZATION_BLOCK

Ähnliche Themen

  1. Bedingter Aufruf eines FBs
    Von petzi im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 30.09.2009, 13:47
  2. Aufruf eines Date_and_Time eines DB's
    Von hank12 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 08.07.2009, 10:33
  3. Aufruf eines FB
    Von blasterbock im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 17.06.2009, 12:38
  4. Mehrfacher Aufruf eines FC´s
    Von jamalau im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 01.12.2006, 23:14
  5. Aufruf eines SFB
    Von Kamania im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 28.10.2005, 09:50

Lesezeichen

Berechtigungen

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