TIA For Schleife mit Variablennamen

--alex--

Level-2
Beiträge
107
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich muss für insgesamt 300 Ventilatoren eine Sammelstörmeldung generieren.

Jeder Ventilator hat 3 Einzelmeldungen welche über digitale Inputs kommen.

LK1_Fan1_LS
LK1_Fan1_TK
LK1_Fan1_BB

LK geht von LK1 bis LK100
Fan geht von Fan1 bis Fan3

Die Einzelmeldung sollte in etwa so aussehen:
Code:
IF   LK1_Fan1_LS OR
      LK1_Fan1_TK OR NOT
      LK1_Fan1_BB
THEN
      LK1_Fan1_St := TRUE;
ELSE
      LK1_Fan1_St := FALSE;
END_IF;

Da ich das jetzt nicht 300mal schreiben möchte, hätte ich das gerne mit 2 FOR Schleifen gelöst, habe aber keine Ahnung ob ich die Zähler in die Namen integrieren kann.
In etwa so:


Code:
FOR #i := 1 TO 100 DO
FOR #j := 1 TO 3 DO
IF   LK[#i]_Fan[#j]_LS OR
      LK[#i]_Fan[#j]_TK OR NOT
      LK[#i]_Fan[#j]_BB
THEN
      LK[#i]_Fan[#j]_St := TRUE;
ELSE
      LK[#i]_Fan[#j]_St := FALSE;
END_IF;
END_FOR;
END_FOR;


Die Sammelstörmeldungen habe ich in ein Array gepackt.
Da die DI´s leider chaotisch über die ganze Anlage verstreut sind, möchte ich das auch nicht wirklich in ein Array kopieren.



Hat jemand eine Idee wie man das lösen kann?

Danke
Alex
 
Hallo Alex,

so wird das nicht funktionieren.
Was Du machen kannst: Statt Deiner Einzelvariablen ein großes Array anzulegen. Und dann legst Du unter Anwenderkonstanten für jedes Ventil einen Index an. Somit ist dann später das Programm lesbar und Du kannst aber trotzdem über Indizes mit FOR auf alle Variablen zugreifen:

Code:
Anwenderkonstante in PLC-Variablen:
idx_Fan1 : INT := 1

Code:
Einzelzugriff:

IF   LK1_LS[idx_Fan1] OR
      LK1_TK[idx_Fan1] OR NOT
      LK1_BB[idx_Fan1]
THEN
      LK1_St[idx_Fan1] := TRUE;
ELSE
      LK1_St[idx_Fan1] := FALSE;
END_IF;


Code:
Schleifenzugriff:
FOR #j := 1 TO 100 DO
IF   LK1_LS[#j] OR
      LK_TK[#j] OR NOT
      LK_BB[#j]
THEN
      LK_St[#j] := TRUE;
ELSE
      LK_St[#j] := FALSE;
END_IF;
END_FOR;

Wenn DU noch mehrere Variablen davon hast, wie das in Deiner Schleife ja aussieht, kannst Du die entsprechenden Variablen in mehreren Dimensionen anlegen:

LK_LS: Array [1..MaxLKs][1..MaxFans] of BOOL;

und kannst dann damit die FOR-Schleife realisieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo JSEngineering

Das würde aber bedeuten dass ich meine 900 digitalen Eingänge (100x3x3) in ein Array verschieben muss.
Genau das wollte ich mir eigentlich sparen.
Oder habe ich da was falsch verstanden?
 
ach so, das sind direkt Eingänge...
Sind die denn auf den Eingangskarten/Adressen strukturiert, so daß die hintereinander liegen?

Das "in Array schieben" könnte man aber einmal über Excel machen. Du hast ja schon einmal die Symbole angelegt, bestimmt auch irgendwie über Massenparametrierung. Dann ist das auch kein Problem, die "mal eben" in das Array zu schieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die die Eingänge/Ausgänge immer zusammenhängend sind und in der selben Reihenfolge sind kannst du die E/A mit mit je einem DT deklarieren.
Wenn Du dann einen Standard FB machst, denn du 100x mit den DTs aufrufst, kannst Du darin entweder komplett die Logik abwickeln oder du legts dann die EA in ein/mehrere Arrays (unterschiedliche Nr. an FB-Aufruf). Diese Arrays kannst Du dann ja immer in Schleifen benutzen.
Das wäre mein Losungsansatz. Das ist mit Referenz noch nachvollziehbar und trotzdem recht flexibel.
Klar, Tipparbeit ist das aber auch noch.
 
Hab´s jetzt so gelöst dass ich die Auswertung tatsächlich 100x durchlaufen lasse.
Ist zwar keine schöne Lösung.
Da es sich aber nicht um unsere Anlage handelt und der Kunde eher auf die Kosten schaut, war das das Einfachste.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Einzelmeldung sollte in etwa so aussehen:
Code:
IF   LK1_Fan1_LS OR
      LK1_Fan1_TK OR NOT
      LK1_Fan1_BB
THEN
      LK1_Fan1_St := TRUE;
ELSE
      LK1_Fan1_St := FALSE;
END_IF;
Wenn Du TippArbeit scheust, warum verkürzt Du dann nicht wenigstens auf die mit-ohne-IF-Variante:
Code:
LK1_Fan1_St := LK1_Fan1_LS OR LK1_Fan1_TK OR NOT LK1_Fan1_BB ;
oder
Code:
LK1_Fan1_St := LK1_Fan1_LS 
            OR LK1_Fan1_TK 
        OR NOT LK1_Fan1_BB ;
 
Zurück
Oben