Hallo!
Du legst einen DB an, in dem du jeweils 3 Arrays [0..2] of Bool erstellst. Diese gibst du dann beim Aufruf deinens FB´s an. (STRG + J und danach den DB mit den jeweiligen Array auswählen).
Hallo,
kann mir mal jemand verraten was ich da bei // IN : ARRAY schreiben soll!
Zur Vorgeschichte:
- Ich hatten kleinen FB geschrieben, die mir die Funktion von einen Wire Break macht. D.h. falls ein Wire Break kommt, soll mir die MSG anzeigen und mit einem RESET soll ich es CHECKEN(Bestätigen).
Ich habe diesen FB so geschrieben, dass ich per Eingabe die Anzahl bestimme.
Diesen Baustein habe ich in diesen FB1 eingefügt und jetzt weiss ich leider nicht mehr weiter!!!!!!
FUNCTION_BLOCK FB1
// Bausteinparameter
VAR_INPUT
RESET
{S7_m_c := 'true'; S7_param := 'false'} : BOOL := FALSE;
TEMP1_WB
{S7_m_c := 'true'; S7_param := 'false'} : BOOL := FALSE;
TEMP2_WB
{S7_m_c := 'true'; S7_param := 'false'} : BOOL := FALSE;
TEMP3_WB
{S7_m_c := 'true'; S7_param := 'false'} : BOOL := FALSE;
END_VAR
VAR_OUTPUT
TEMP1_WB_MSG
{S7_m_c := 'true'} : BOOL := FALSE;
TEMP2_WB_MSG
{S7_m_c := 'true'} : BOOL := FALSE;
TEMP3_WB_MSG
{S7_m_c := 'true'} : BOOL := FALSE;
RES_CHK_TEMP1_WB_MSG
{S7_m_c := 'true'} : BOOL := FALSE;
RES_CHK_TEMP2_WB_MSG
{S7_m_c := 'true'} : BOOL := FALSE;
RES_CHK_TEMP3_WB_MSG
{S7_m_c := 'true'} : BOOL := FALSE;
END_VAR
VAR_TEMP
RESET_MERKER : BOOL;
END_VAR
VAR
RESET_FLANKEN_MERKER : BOOL := TRUE;
TEST1 : FB900;
WBn : ARRAY[0..2] OF BOOL;
WBn_MSG : ARRAY[0..2] OF BOOL;
RESn : ARRAY[0..2] OF BOOL;
END_VAR
WBn[0] := TEMP1_WB;
WBn[1] := TEMP2_WB;
WBn[2] := TEMP3_WB;
WBn_MSG[0] := TEMP1_WB_MSG;
WBn_MSG[1] := TEMP2_WB_MSG;
WBn_MSG[2] := TEMP3_WB_MSG;
RESn[0] := RES_CHK_TEMP1_WB_MSG;
RESn[1] := RES_CHK_TEMP2_WB_MSG;
RESn[2] := RES_CHK_TEMP3_WB_MSG;
IF RESET = true AND RESET_FLANKEN_MERKER = false THEN
RESET_MERKER := TRUE;
END_IF;
RESET_FLANKEN_MERKER := RESET;
IF RESET_MERKER = true THEN
RESET_MERKER := FALSE;
END_IF;
TEST1(RESET := RESET // IN: BOOL,
n_WB := 2 // IN: INT
,TEMPn_WB := // IN: ARRAY
);
:= TEST1.TEMPn_WB_MSG; // OUT: ARRAY
:= TEST1.RES_CHK_TEMPn_WB_MSG; // OUT: ARRAY
END_FUNCTION_BLOCK
Hallo!
Du legst einen DB an, in dem du jeweils 3 Arrays [0..2] of Bool erstellst. Diese gibst du dann beim Aufruf deinens FB´s an. (STRG + J und danach den DB mit den jeweiligen Array auswählen).
Hallo,
aus deiner Frage und dem beiliegenden Code entnehme ich, dass du aus dem FB1 heraus den FB900 mit Daten versorgen willst.
Wenn du ein ARRAY (oder STRING oder UDT) an einen anderen Baustein übergeben willst, so geht das intern nur als Pointer - nicht als direkte Wert-Übergabe. Du mußt also im FB1 ein ARRAY mit exakt der gleichen Struktur wie der IN-Parameter des FB900 hinterlegt haben und du kannst dieses dann direkt symbolisch übergeben - SCL kümmert sich dann schon um den Rest. Gleiches gilt für die OUT-Parameter. Der Daten-Bereich, in den der FB900 hineinschreiben soll, muß im FB1 als Variable vorhanden sein.
Dein Code für den FB900 könnte dann also in etwa so aussehen :Ich weiß jetzt allerdings nicht, ob ich die richtigen Array's an der richtigen Stelle plaziert habeCode:TEST1 (RESET := RESET , n_WB := 2 , TEMPn_WB := WBn ) ; WBn_MSG := TEST1.TEMPn_WB_MSG ; RESn := TEST1.RES_CHK_TEMPn_WB_MSG ;
Gruß
LL
husox81 (13.12.2008)
Vielen Dank für deine Hilfe!
die ARRAYS hast du richtig vergeben aber das hatte ich auch versucht
und der Compiler sieht das als Fehler!!! (siehe BILD)
Last edited by husox81; 13.12.2008 at 18:49.
ioch teile diese vermutung und bitte darum, beim einstellen die code-tags zu verwenden, denn die einrückungsstruktur, die du siehst, macht es uns auch einfacher.
(OT: in AWL/KOP/FUP kann ich ein ARRAY absolut adressieren, UDT geht nicht ... bei struct bin ich mir grad nicht sicher - zu selten als übergabe verwendet)
[SIGNATUR]Ironie setzt Intelligenz beim Empfänger voraus.[/SIGNATUR]
Das ist der FB 900
Da ich mehrere Temperatur Sensoren mit dem Wire Break programmieren soll, habe ich mir dabei gedacht, dass ich einen FB 900 schreibe, den ich als fertiger Baustein verwenden kann. Mit der Option, das ich die anzahl der Sensoren Manuel eingeben kann.
Code:FUNCTION_BLOCK FB900 TITLE = 'Wire Break' // KNOW_HOW_PROTECT // Ermittlung der Wire Break // VERSION : '1.0' AUTHOR : AGH NAME : WB FAMILY : SECURE VAR_INPUT RESET {S7_m_c := 'true'; S7_param := 'false'} :BOOL := FALSE; // Anzahl der Wire Break n_WB {S7_m_c := 'true'; S7_param := 'false'} : INT; // Eingänge der Wire Breaks TEMPn_WB : ARRAY[0..199] OF BOOL; END_VAR VAR_OUTPUT // Wire Break MSG TEMPn_WB_MSG : ARRAY[0..199] OF BOOL := FALSE; // RESET CHECK MSG RES_CHK_TEMPn_WB_MSG : ARRAY[0..199] OF BOOL := FALSE; END_VAR VAR_TEMP RESET_MERKER : BOOL; END_VAR VAR RESET_FLANKEN_MERKER : BOOL := TRUE; I_FOR : INT := 0; END_VAR // RESET******************************************************************************************** IF RESET = true AND RESET_FLANKEN_MERKER = false THEN RESET_MERKER := TRUE; END_IF; RESET_FLANKEN_MERKER := RESET; IF RESET_MERKER = true THEN RESET_MERKER := FALSE; // ERROR to FALSE FOR I_FOR := 0 TO n_WB BY 1 DO IF TEMPn_WB[I_FOR] = false THEN TEMPn_WB_MSG[I_FOR] := FALSE; END_IF; END_FOR; // RESET CHECK to TRUE FOR I_FOR := 0 TO n_WB BY 1 DO IF TEMPn_WB_MSG[I_FOR] = true THEN RES_CHK_TEMPn_WB_MSG[I_FOR] := TRUE; END_IF; END_FOR; END_IF; //*************************************************************************************************** // Wire Break MSG to TRUE *************************************************************************** FOR I_FOR := 0 TO n_WB BY 1 DO IF TEMPn_WB[I_FOR] = true THEN IF TEMPn_WB_MSG[I_FOR] = false THEN TEMPn_WB_MSG[I_FOR] := TRUE; RES_CHK_TEMPn_WB_MSG[I_FOR] := FALSE; END_IF; END_IF; END_FOR; //*************************************************************************************************** END_FUNCTION_BLOCK
... na , hier haben wir doch schon den Fehler ...
Du übergibst ein ARRAY[0..2] und fragst aber ein ARRAY[0..199] ab. Das geht nicht. Du müßtest hier dann auch ein ARRAY[0..199] übergeben - was aber m.E. nicht problematisch wäre ...
Gruß
LL
Ich habe es soweit geändert und ich kriege keine Fehlermeldung mehr.
Durch den n_WB im FB1 will ich damit erreichen, das im FB900 die FOR-Schleife nur bis 0..2 wiederholt.
Ist das so OK?
LG
EINEN GROßEN DANK an alle die sich hier die Mühe geben, um andere Menschen zu HELFEN!
Larry Laffer ich hätte gerne eine Rufnummer von dir, da ich denke, dass ich dieses Problem mit der per Tele besprechen kann.
... das mit dem n_WB als Bereichs-Vorgabe ist OK - ich mache das auch schon mal so. Es sollte auch so funktionieren, wie du es gemacht hast.
Die Sache mit der Telefon-Nummer gefällt mir nicht so gut - nicht das ich nicht bereit bin, dir auch weiterhin zu helfen - ich denke nur, dass auch andere vielleicht von dieser Sache partizipieren können / wollen.
Gruß
LL
Bookmarks