In TIA Bausteinausgänge über Index ansprechen

Hab es jetzt so umgesetzt wie vorgeschlagen. Hier mal worum es überhaupt geht. Ein Baustein der nacheinander eine MPI Verbindung zu maximal 10 Stationen aufbaut und dort Daten liest und schreibt.

Code:
IF #stationen[#Station].MPI <> 0 THEN
    IF #"W/R" THEN
        #tANY_1 := p#DB1.DBx0.0 byte 1;
        #atANY_1."DB-Nr" := #stationen[#Station]."Master-In-DBNr";
        #tInt := TEST_DB(DB_NUMBER := #stationen[#Station]."Master-In-DBNr", DB_LENGTH => #atANY_1.Len, WRITE_PROT => #tBool);
        IF #tInt = 0 THEN
            #tANY_2 := p#DB1.DBx0.0 byte 1;
            #atANY_2."DB-Nr" := #stationen[#Station]."Slave-In-DBNr";
            #atANY_2.Len := #atANY_1.Len;
            #tInt := X_PUT(REQ := TRUE, CONT := FALSE, DEST_ID := #stationen[#Station].MPI, VAR_ADDR := #tANY_2, SD := #tANY_1, BUSY => #busy);
        END_IF;
        IF #busy THEN
            RETURN;
        ELSE
            #"W/R" := NOT #"W/R";
            #ComStörungSchreiben := #tInt;
        END_IF;
    ELSE
        #tANY_1 := p#DB1.DBx0.0 byte 1;
        #atANY_1."DB-Nr" := #stationen[#Station]."Master-Out-DBNr";
        #tInt := TEST_DB(DB_NUMBER := #stationen[#Station]."Master-Out-DBNr", DB_LENGTH => #atANY_1.Len, WRITE_PROT => #tBool);
        IF #tInt = 0 THEN
            #tANY_2 := p#DB1.DBx0.0 byte 1;
            #atANY_2."DB-Nr" := #stationen[0]."Slave-Out-DBNr";
            #atANY_2.Len := #atANY_1.Len;
            #tInt := X_GET(REQ := TRUE, CONT := FALSE, DEST_ID := #stationen[#Station].MPI, VAR_ADDR := #tANY_1, BUSY => #busy, RD => #tANY_2);
        END_IF;
        IF #busy THEN
            RETURN;
        ELSE
            #"W/R" := NOT #"W/R";
            #ComStörungLesen := #tInt;
        END_IF;
    END_IF;
    #ComStör[#Station] := (#ComStörungLesen < 0) OR (#ComStörungSchreiben < 0);
ELSE
    #ComStör[#Station] := false;
END_IF;

IF #Station = 9 THEN
    #Station := 0;
ELSE
    #Station := #Station + 1;
END_IF;
#ComStörungS1 := #ComStör[0];
#ComStörungS2 := #ComStör[1];
#ComStörungS3 := #ComStör[2];
#ComStörungS4 := #ComStör[3];
#ComStörungS5 := #ComStör[4];
#ComStörungS6 := #ComStör[5];
#ComStörungS7 := #ComStör[6];
#ComStörungS8 := #ComStör[7];
#ComStörungS9 := #ComStör[8];
#ComStörungS10 := #ComStör[9];
Hmm, irgendwie gibts da keinen einzigen Kommentar in dem Code...
Aber das Ende ist sicher so, wie Jesper das gemeint hat.
 
Na was ein Glück dass ich die Anlage selbst Projektiere, Programmiere und betreibe. Meinem Chef ist das ziemlich egal was ich da mache. Liegt vielleicht daran das er es sowieso nicht versteht. Wichtig ist, dass es am Ende funktioniert. Ich denke auch in SCL ist es jetzt nicht soo schwer nachzuvollziehen was da passiert, auch ohne Kommentare.
Ob es funktioniert werd ich dann morgen an Testaufbau ergründen. Von der Programmsteuerung sieht es im Simulator aber erstmal ganz OK aus.
 
Naja, Du fragst doch hier unter Programmierstrategien, wie man etwas eleganter programmieren könnte...
Und grundsätzlich kannst Du ja auch mal krank sein oder kündigen, dann muss nen anderer da durchsteigen. Von daher wären Kommentare hilfreich. Und warum soll jemand da etwas nachvollziehen müssen, wenn Du auch einfach drüber schreiben könntest, was die nachfolgenden Zeilen machen 🙄
Ansonsten ist PUT immer mit Vorsicht zu genießen, weil wenn bei Deinem Code irgendwas nicht so passt, dann schreibst Du in irgendeine SPS irgendwas irgendwo rein...
 
Zuletzt bearbeitet:
Die Ausgänge sind mit DB-Bit's für ein HMI beschaltet. Ich würde die Zustände beim beobachten im FUP gerne direkt sehen. Daher die einzelnen Ausgänge.
 
Die Ausgänge sind mit DB-Bit's für ein HMI beschaltet. Ich würde die Zustände beim beobachten im FUP gerne direkt sehen. Daher die einzelnen Ausgänge.
:unsure:
Beobachten der Einzelbits geht ja auch im DB und muss man auch nur mal temporär.
Ich sehe da jetzt noch nicht den wirklichen Vorteil gegenüber einer Arrayübergabe an den DB.
 
Was dann wieder meine Theorie aus #13 bestätigt.
:)
Auf jeden Fall tut es jetzt das was es soll. Danke für eure Unterstützung!
 
Zurück
Oben