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

Page 1 of 2 12 LastLast
Results 1 to 10 of 12

Thread: In: Array ???

  1. #1
    Join Date
    08.09.2008
    Posts
    57
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Default


    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
    Reply With Quote Reply With Quote In: Array ???  

  2. #2
    Join Date
    01.01.2008
    Posts
    104
    Danke
    43
    Erhielt 22 Danke für 19 Beiträge

    Default

    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).
    Gruß
    Da_Basco


    Ich kann über das Wasser laufen,
    weil ich weiß wo die Steine sind... (Rainald Grebe)

  3. #3
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    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

  4. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    husox81 (13.12.2008)

  5. #4
    Join Date
    08.09.2008
    Posts
    57
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Default

    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)
    Attached Images Attached Images
    Last edited by husox81; 13.12.2008 at 18:49.

  6. #5
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    Quote Originally Posted by Larry Laffer View Post
    ... du mußt also im FB1 ein ARRAY mit exakt der gleichen Struktur wie der IN-Parameter des FB900 hinterlegt haben
    Hallo,
    ich vermutet hier den Fehler im Moment bei der Benutzung des FB900.
    Kannst du den Baustein vielleicht auch mal hier einstellen ?

    Gruß
    LL

  7. #6
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default

    Quote Originally Posted by Larry Laffer View Post
    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)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  8. #7
    Join Date
    08.09.2008
    Posts
    57
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Default

    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

  9. #8
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    ... 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

  10. #9
    Join Date
    08.09.2008
    Posts
    57
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Default

    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.

  11. #10
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... 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

Similar Threads

  1. [TC2] ARRAY OF BOOL in ARRAY OF INT schieben
    By Stefan4863 in forum CODESYS und IEC61131
    Replies: 5
    Last Post: 06.02.2018, 16:13
  2. Replies: 18
    Last Post: 21.12.2016, 17:03
  3. Eindimensionales Array Beschreiben (Codesys 2.3, ARRAY OF BOOL)
    By KingHelmer in forum CODESYS und IEC61131
    Replies: 11
    Last Post: 21.11.2016, 13:14
  4. TIA Array of INT und Array of Bool == Summe bilden
    By zloyduh in forum Simatic
    Replies: 1
    Last Post: 11.11.2016, 17:35
  5. Aus einem ARRAY ausgewählte Werte in ein anderes ARRAY kopieren
    By lacosta19 in forum CODESYS und IEC61131
    Replies: 7
    Last Post: 06.08.2014, 15:42

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •