Aufruf eines in SCL geschriebenen FBs in OB1

Roland1

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,ich habe gerade ein FB (Integrator mit Begrenzungen)in SCL geschrieben, aber der Aufruf in OB1 klappt.Was kann ich falsch gemacht haben?

Hier der ganze Salat: Danke im voraus für euere Hilfe

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:=ED17,CYCLE1:=ED21,QRUN1:=A0.2,QRES1:=A0.3,QG1:=A0.4,XOUT1:=DB1.XOUT1);
END_ORGANIZATION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aufruf eines in SCL geschriebenen FB in OB1

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:=ED17,CYCLE1:=ED21,QRUN1:=A0.2,QRES1:=A0.3,QG1:=A0.4,XOUT1:=DB1.XOUT1);
END_ORGANIZATION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Fehlermeldung in SCL

Hallo, ich habe eine FB(Integrator mit Begrenzung) in SCL geschrieben und ich bekomme die fehlermeldung: "Fehler beim Zugriff auf de Baustein (offline)".Voran könnte das liegen?
Hier ist der ganze Code

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

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:=ED17,CYCLE1:=ED21,QRUN1:=A0.2,QRES1:=A0.3,QG1:=A0.4,XOUT1:=DB1.XOUT1);
END_ORGANIZATION_BLOCK
 
Hi Roland

bin zwar kein SCL-Held :rolleyes: aber wenn:

IF XOUT1>XMAX1 THEN XOUT1:=XMAX1;QG1:=TRUE;END_IF;

müsste dann XOUT1 nicht eine In_Out_Variable sein ?

Und was passiert hier?

XOUT1:=DB1.XOUT1
DB1 ist doch der Instanz zum FB1

Gruß
 
Fehler

Hallo,

klingt als hätteste den FB1 noch mit einem Editor offen. Oder der Editor hat den Baustein beim Schliessen nicht freigegeben.

André
 
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)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 !!!
 
Wenn das noch nicht hinhaut:

leeren FB mal übersetzen, mal schauen ob das geht. Danach den Inhalt Blockweise einfügen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ungültiger Datentyp

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 ;)
 
Zuletzt bearbeitet:
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:=ED17,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
 
Zurück
Oben