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