Array in Array schreiben

Mir würde es bereits reichen wenn ich den Inhalt in der IF abfrage einfach direkt übermitteln kann.
also einfach GVL_Gr00Alarm.stAlarm.stControl.arbFatalError[].bActive schreibe.
allerdings muss ich irgendwie dann das z wo fürs hochzählen ist in das Array packen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Theoretisch müsste ich GVL_Gr00Alarm.stAlarm.stControl.arbFatalError[z].bActive als String übergeben und dies dann in Programmiertext umändern. Glaub aber kaum das dass geht.
 
Ich mache die If und For abfrage nun bevor ich in den FB gehe. Anders konnte ich es nicht lösen und es ist verkraftbar.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, um Deine Ausführungen zu verstehen, braucht man eine gute Glaskugel, aber ich versuchs mal mit meiner:

Code:
pGVL : POINTER TO ST_AlarmRef;

pGVL := ADR([COLOR=#333333]GVL_Gr00Alarm);

pGVL^.[COLOR=#333333]stAlarm.stControl.arbFatalError[z].bActive := True;[/COLOR][/COLOR]

so in etwa?
 
Nein, es handelt sich um eine IF Abfrage stAlarm.stControl.arbFatalError[z].bActive := True; . Ich wollte stControl und .arbFatalError stückeln. Sprich sowas wie stAlarm.InputA.InputB[Z]......
Und von außen wollte ich InputA und inputB zuweisen mit z.B stControl und arbFatalError. Wollte nur nicht gehen :D. Das mit reference hab ich nicht ausprobiert
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles gut ich habs jetzt sowieso anders gelöst und bin mit der Lösung zufrieden. Nächstesmal nehm ich mir auch mehr Zeit um genauer das Thema zu erläutern. Für mich ist es natürlich selbstverständlich aber als Außenstehender ist es natürlich schwieriger nachzuvollziehen. Aufjedenfall danke euch beiden
 
Alles gut ich habs jetzt sowieso anders gelöst und bin mit der Lösung zufrieden. Nächstesmal nehm ich mir auch mehr Zeit um genauer das Thema zu erläutern.

... nur den Leuten hier im Forum gegenüber ist es nicht fair, weil sie sich Zeit nehmen und versuchen, Dein Problem zu verstehen. Je ungenauer Du beschreibst, desto mehr Zeit muß man investieren ...

Aber schön, daß Du es zu Deiner Zufriedenheit gelöst hast.
 
... nur den Leuten hier im Forum gegenüber ist es nicht fair, weil sie sich Zeit nehmen und versuchen, Dein Problem zu verstehen. Je ungenauer Du beschreibst, desto mehr Zeit muß man investieren ...

Aber schön, daß Du es zu Deiner Zufriedenheit gelöst hast.

Da gebe ich dir recht, deswegen meinte ich auch das es das nächstemal nicht mehr so vorkommt. Falls dich das Thema noch interessiert bin ich auch gerne bereit dir das so genau wie möglich zu erklären. Mir ist bewusst das gerade du viel Zeit genommen hast. Dafür bin ich dir auch wirklich dankbar. Manchmal ist es auch einfacher einfach den Code dazu zu zeigen. Dann kann man auch mehr damit anfangen.
Kurz und informativ gesagt:
Ich habe eine IF Abfrage in einem FB Baustein.
Vor dieser if Abfrage ist eine For Schleife mit int z
For z:=0 to 100 by 1 do

IF gvl_alarm.stAlarm.stControl.arbFatalError[z].bActive = true THEN
...

Diese IF Abfrage möchte ich allerdings von Außen verändern können.
Anstatt

IF GVL_Alarm.stAlarm.stControl.arbFatalError[z].bActive = true THEN

Soll dann z.B

IF GVL_Alarm.stAlarm.stControl.arbMessage[z].bActive = true THEN

Stehen. Die Frage war ob sowas überhaupt geht mit einem FB
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du brauchst doch nur eine boolesche Eingangsvariable, die legst Du von außen an.

Wenn Du innerhalb des FB das z noch verändern willst, geht es wieder nur über den Pointer als Eingangsvariable. Dort legst Du dann die Adresse des ersten Elementes an. Wie schon zuvor im Code gezeigt.
 
Sprich eine boolesche eingangsvariable als Array ?
Ich kann da leider trotzdem nicht folgen. Z wird nicht verändert dieser bleibt gleich.
Kannst du mir mal ein Beispiel machen was du als var Input deklarierst und mit was du es fütterst?
 
Zuletzt bearbeitet:
Code:
If xxx then
     FB_Beispiel.myBool := GVL_Alarm.stAlarm.stControl.arbFatalError[z].bActive;
else
     FB_Beispiel.myBool := GVL_Alarm.stAlarm.stControl.arbMessage[z].bActive;
end_if

FB_Beispiel();


##############

Function_Block FB_Beispiel
Var_Input
     myBool : Bool;
End_Var

If myBool then
......
End_If

End_Functionblock
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achso das meinst du. Die Sache ist es gibt nicht nur 2 Kombinationen sondern 16 pro Gruppe. Ich habe jetzt aktuell 2 Gruppen das wären 32 Kombinationen. Dann war es garnicht verkehrt das ich die for Schleife und die if Abfrage aus dem FB genommen habe und diese dann außerhalb des fbs benutzt habe. Der Aufwand wäre bei deiner Methode gleich wie den wo ich gemacht habe.
Dann weiß ich jetzt zumindest das es nicht anders geht. Danke dir !
 
Vor dieser if Abfrage ist eine For Schleife mit int z
Ich fürchte, Du meinst damit in Wirklichkeit, die If-Abfrage befindet sich NACH dem SchleifenKopf, ABER IN der For-Schleife VOR dem End_For und nicht dahinter.
Das schliesse ich daraus, dass in der Abfrage ein ArrayElement mit der ZählVariable z der For-Schleife indiziert wird.

Je nach dem, wie viele verschiedene Abfragen Du in der For-Schleife realisieren möchtest, könntest Du in der Schleife mit CASE eine (einzige) der verschiedenen AbfrageVarianten "von aussen" über die Variable auswählen, die in der CASE-Selektion "die Weichen stellt".

Du sprichst von Kombinationen. Du könntest mehrere CASE-Selektionen kombinieren und eine Variable pro Selektion "von aussen" vorgeben.
 
Der aufwand wäre dann aber gleich. ob ich es erst vorbereite oder gleich schreibe, da schenkt sich dann nix.
Ich hab es so gelöst:
Die erste Zeile passe ich somit immer neu an. Die Inputs beim FB natürlich auch.

Code:
FOR z := 0  TO GR00Auto.nErrorMaxIdx BY 1 DOIF GVL_Gr01Alarm.stAlarm.stAuto.arbError[z].bActive = TRUE AND NOT nGR01AutoErrMeldAkt[z] = TRUE THEN
FBGr01AutoErrorActive(
    z:= z, 
    MaxIdx:= Gr01Auto.nErrorMaxIdx , 
    BaseIdentNo:= Gr01Auto.dnErrorBaseIdentNo , 
    sText:=sTextGR01AutoError , 
    sTextMeldeart:=sTextMeldeart , 
    TextIDMeldeart:=1000 , 
    MeldAkt:=nGR01AutoErrMeldAkt,
    IniForMeldetext := 20 ,
    IniForMeldetextSpeicher:= 1000 );
END_IF
END_FOR
z := 0;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leicht abgewandelt ...
Code:
FOR z := 0  TO GR00Auto.nErrorMaxIdx BY 1 DO // 'BY 1' ist überflüssig
//  IF GVL_Gr01Alarm.stAlarm.stAuto.arbError[z].bActive = TRUE AND NOT nGR01AutoErrMeldAkt[z] = TRUE THEN // '= TRUE' ist überflüssig
    IF GVL_Gr01Alarm.stAlarm.stAuto.arbError[z].bActive AND NOT nGR01AutoErrMeldAkt[z] THEN 
        FBGr01AutoErrorActive(
            z                       := z,                    // sieht zumindest komisch aus
            MaxIdx                  := Gr01Auto.nErrorMaxIdx , 
            BaseIdentNo             := Gr01Auto.dnErrorBaseIdentNo , 
            sText                   := sTextGR01AutoError , 
            sTextMeldeart           := sTextMeldeart , 
            TextIDMeldeart=         := 1000 , 
            MeldAkt                 := nGR01AutoErrMeldAkt,
            IniForMeldetext         := 20 ,
            IniForMeldetextSpeicher := 1000 );
    END_IF
END_FOR
z := 0; // ist überflüssig, wenn Du z danach nicht mehr abfragst (wenn doch, warum/wozu?)
 
Zuletzt bearbeitet:
Da ich das Programmieren hauptsächlich mit Java und C gelernt habe mache ich manche Dinge automatisch auch wenn es nicht nötig ist.
Das z:= 0; kann in der tat weg.
das z selber habe ich so sowieso noch nie gemacht aber es funktioniert und mehr wollte ich nicht. Hätte ich natürlich auch anders benennen können. Wie hättest du es benannt?
 
Wie hättest du es benannt?
Haha, gute Frage! Kann ich nicht wirklich per PatentRezept beantworten. :oops:
Bin eigentlich nicht in SCL aktiv, sondern eher in VBA und habe da für SCL eher unpassende Gewohnheiten.
Meine WunschVorstellung
- Namen so kurz und so verständlich, wie möglich ... ein Widerspruch in sich und ein ewiger Kampf zwischen pro und kontra! ;)
- vorangestellte Kennung für die "Typen" INPUT, IN_OUT, OUTPUT, TEMP, STATIC (i, io, o, t, s)
- dann Kennung für DatenTyp, z.B. b für BOOL, i für INT, d für DINT, r für REAL und (zu) viele andere ... wird auch schon schnell wieder kompliziert.
- bei Arrays gerne auch ein a.
- in VBA habe ich häufig Strings, die eigentlich eine Liste darstellen und deshalb mit l (kleinem L) beginnen.

Wenn man in fremder SW herumwuselt, sich lieber dem vorgegeben System (falls vorhanden/erkennbar) anpassen, als persönliche Vorlieben durchzusetzen.

Gruss, Heinileini
 
Zuletzt bearbeitet:
Zurück
Oben