In: Array ???

husox81

Level-1
Beiträge
57
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Db

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).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :
Code:
TEST1 (RESET := RESET , 
       n_WB := 2  ,   
     TEMPn_WB :=  WBn ) ; 

WBn_MSG := TEST1.TEMPn_WB_MSG ; 
RESn := TEST1.RES_CHK_TEMPn_WB_MSG ;
Ich weiß jetzt allerdings nicht, ob ich die richtigen Array's an der richtigen Stelle plaziert habe ;)

Gruß
LL
 
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)
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    137 KB · Aufrufe: 48
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich vermutet hier den Fehler im Moment bei der Benutzung des FB900.
Kannst du den Baustein vielleicht auch mal hier einstellen ?

Gruß
LL

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)
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Was mich noch interessieren würde ist, warum ich hier im FB1 die selbe Struktur schreiben muss, obwohl ich einen Wert (n_WB) mit übergebe?

Gibt es auch eine möglichkeit, in dem das Programm automatisch diesen n_WB erkennt und weitergibt?

LG
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du mußt die gleiche Struktur mit gleicher Dimensionierung übergeben. Ob das immer so richtig ist, sei dahingestellt. Berücksichttige bitte an dieser Stelle, dass hier ja in Wirklichkeit ein Bereichs-Pointer übergeben wird - das setzt natürlich voraus, dass Quell-Bereich und Ziel-Bereich identisch sind.
Eine Möglichkeit, sich davon (ein bißchen) zu lösen stellt der AT-Befehl dar. Mit diesem Befehl hast du die Möglichkeit (in deinem Programm) einen Speicherbereich vollkommen anders zu betrachten (z.B. übergibst du ein WORD und siehst es dir aber als ARRAY [0..15] of BOOL an).

Wie ich dir schon geschrieben habe findest du auch in meinen Scripten ein Gegenstück zu deinem "n_WB". Ich habe da auch noch kein wirklich "schickere" Variante gefunden.

Gruß
LL
 
Zurück
Oben