Wenn Du indirekt/indiziert auf eine nicht existierende FB-Array-Instanz zugreifst, dann merkt das das SPS-Programm erst zur Laufzeit. Ein Compiler kann Dich nicht warnen.
Natürlich. Das ist aber bei Arrays immer der Fall und bei einem Arrayloop für FBs genau gleich schlimm wie überall sonst auch. Allerdings wäre das mit den Zyklischen Loops nur um zyklisch durch ein paar FBs zu zirkeln ja recht unproblematisch da so ein Array ja üblicherweise nur einmal angefasst wird, nämlich beim Erstellen.
Da hab ich wesentlich fiesere Möglichkeiten im Programm da Pointer falsch zu setzen. Aber auch die sieht man ja sofort wenn da Grenzen überschritten werden wenn der Baustein geladen wurde.
Das kann Dir aber genauso beim Bezug auf die Instanzen passieren, vor allem, wenn die Instanzen keine "sprechenden" Namen mehr haben.
Wenn man das Programm sozusagen Nummerisch aufbauen kann. dann ist die Nummer der Name. Mich interessiert normalerweise nicht die BMK nummer der Klappe sondern ich weiss das Brandklappe 20 sich in Brandsektor 30 befindet und von Rauchmelder 30 ausgelöst wird.
Dafür ist nun vermutlich die erzeugte Codegröße und die Zykluszeit dreimal so groß.
Wieso sollte die Codegrösse grösser werden wenn die Instanz nachher per For Schleife abgearbeitet wird? Die Codegrösse müsste ja eher 200 mal kleiner sein als wenn man jede Instanz einzeln deklariert und aufruft.
Also das für 200 klappen
Code:
CALL #Klp01
LS_PAR :="LRU_N_KLP".ABL[1]
AumaIN :="Nord_RU_KLP_LST->AS".Ab[1]
WD :="AS Röhre Nord"._DBX_1012_5
Global_BF_Bedienart:="AS Röhre Nord"._DBW_22_0
Gesamt_Oeffnung :=#Gesamt_Oeffnung_Z1
Venti_An :=#VentiZone1
Venti_Klein :=
AumaOut :="Nord_RU_KLP_AS->LST".AbL[1]
Tuere :=
Klp_Fahr :="Brandarrays".Klp[1]
Zonen_Oeffnung :=#Zonen_Oeffnung_Z1
Tuere_Bedienart :="LRU_N_KLP".Tuere[1].BA
CALL #Klp02
LS_PAR :="LRU_N_KLP".ABL[2]
AumaIN :="Nord_RU_KLP_LST->AS".Ab[2]
WD :="AS Röhre Nord"._DBX_1012_5
Global_BF_Bedienart:="AS Röhre Nord"._DBW_22_0
Gesamt_Oeffnung :=#Gesamt_Oeffnung_Z1
Venti_An :=#VentiZone1
Venti_Klein :=
AumaOut :="Nord_RU_KLP_AS->LST".AbL[2]
Tuere :=
Klp_Fahr :="Brandarrays".Klp[2]
Zonen_Oeffnung :=#Zonen_Oeffnung_Z1
Tuere_Bedienart :="LRU_N_KLP".Tuere[2].BA
CALL #Klp03
LS_PAR :="LRU_N_KLP".ABL[3]
AumaIN :="Nord_RU_KLP_LST->AS".Ab[3]
WD :="AS Röhre Nord"._DBX_1012_5
Global_BF_Bedienart:="AS Röhre Nord"._DBW_22_0
Gesamt_Oeffnung :=#Gesamt_Oeffnung_Z1
Venti_An :=#VentiZone1
Venti_Klein :=
AumaOut :="Nord_RU_KLP_AS->LST".AbL[3]
Tuere :=
Klp_Fahr :="Brandarrays".Klp[3]
Zonen_Oeffnung :=#Zonen_Oeffnung_Z1
Tuere_Bedienart :="LRU_N_KLP".Tuere[3].BA
Braucht doch sicher mehr Speicher auf der CPU wie dieses
Code:
For #index 1 to 200 do
CALL #Klp[index]
LS_PAR :="LRU_N_KLP".ABL[index]
AumaIN :="Nord_RU_KLP_LST->AS".Ab[index]
WD :="AS Röhre Nord"._DBX_1012_5
Global_BF_Bedienart:="AS Röhre Nord"._DBW_22_0
Gesamt_Oeffnung :=#Gesamt_Oeffnung_Z1
Venti_An :=#VentiZone1
Venti_Klein :=
AumaOut :="Nord_RU_KLP_AS->LST".AbL[index]
Tuere :=
Klp_Fahr :="Brandarrays".Klp[index]
Zonen_Oeffnung :=#Zonen_Oeffnung_Z1
Tuere_Bedienart :="LRU_N_KLP".Tuere[index].BA
end_for;
Wie versorgst Du die FB-Array-Instanzen mit Übergabeparametern? Die müssten dann ja wohl auch alle als Array vorliegen?
Natürlich. Aber das tun sie üblicherweise sowieso weil ich die Berechnung eh über Arrays mache ich erkenne einen Brand in einem Sektor der Nummerisch in einem Array mit allen Parametern abgelegt ist. von diesem Ort kann ich dann rechnerisch ableiten welche Klappen um wieviel öffnen müssen um die richtige Strömung zu bekommen.
Auch Windmessung und Rauchmelder liegen in einem Array
Das meiste ermittle ich rechnerisch. Also Brandzone nr soundsoviel bringt bei der windgeschwindigkeit klappe soundso bis soundso pluss ggf ersatzklappe links oder rechts davon. Ventilator nr soviel kommt dann auch.
dazu gibts dann einfach noch einige Sonderfälle die direkt ausprogrammiert sind z.b. an Sektorengrenzen wo die klappengruppe nicht weitergeschoben wird sondern in sektor 30 bleibt bis sektor 33 erreicht wird und dann erst in sek 33 aufgehen.
mfG René