IF-Anweisung in CFC

tomrey

Well-known member
Beiträge
346
Punkte Reaktionen
30
Zuviel Werbung?
->Hier kostenlos registrieren
hi all,
ich möchte Statusmeldungen meiner rollosteuerung, die in byte vorliegen, in der visu als string ausgeben.
dazu habe ich eine string-variablenliste mit den texten definiert.
jetzt brauche ich z.b. eine if-then konstuktion. wie macht man das in cfc?
der baustein if und then hat jeweils nur einen ausgang...
wie muß ich den vergleich machen?
inhaltlich etwa so:
if bstatus=100, then move s100 to sstatus
aber jetzt in cfc???
dank+gruß
 

MasterOhh

Well-known member
Beiträge
1.582
Punkte Reaktionen
397
Ich arbeite eigentlich garnicht mit CFC...
Aber auch dem Bauch heraus würde ich sagen, dass du für jeden Vergleich einen "=" Block brauchst und einen "MOVE" Baustein mit "EN" Pin.
Das Ergebnis deines "=" Vergleichs legst du auf den "EN" Pin.
Dann sollte der MOVE Befehl nur ausgeführt werden, wenn das Vergleichsergebnis true ist.

Code:
bstatus -
           =            MOVE
100     -     - ------- -EN  

                   s100 -     - sstatus

In ST wäre das Ganze natürlich sehr viel einfacher mit einem Array zu lösen .......
 
OP
T

tomrey

Well-known member
Beiträge
346
Punkte Reaktionen
30
Zuviel Werbung?
->Hier kostenlos registrieren
Danke, hab's wie folgt hinbekommen:
ScreenShot001.jpg
aber da gibt es doch sicher ne elegantere Lösung (Tabellen o.ä) zumal in dieser Form die Wartung recht aufwändig ist.
Wie würdest du das mit array machen (hab damit noch keine Erfahrung...)
Dank+Gruß
 

MasterOhh

Well-known member
Beiträge
1.582
Punkte Reaktionen
397
Code:
Var
   Meldungen : Array[1..100] of String(80);
   Status : String(80);
   Index : Int;
end_var

Meldung[1] := 'bli';
Meldung[2] := 'bla';
Meldung[3] := 'blub';
....

Status := Meldungen[Index];

Das füllen des Arrays mit Text evtl. in eine Aktion auslagern und diese nur einmal im ersten Zyklus ausführen.
Alternativ kann das Array auch im Deklarationsteil mit den Werten initialisiert werden. Aber wenn du viele Meldungen hast wird es dann schwer immer den richtigen Index zu treffen.

PS
bStatus ist ein etwas unglücklicher Name für eine Byte Variable. Normalerweise ist b in der Notation ein Bool. Hatte mich da schon etwas gewundert.
Ich nehme z.B. immer n für alle natürlichen Zahlen und f für Gleitkomma. Aber das ist ja jedem selbst überlassen ;)
 
OP
T

tomrey

Well-known member
Beiträge
346
Punkte Reaktionen
30
Danke, das Anlegen hab ich damit, jetzt fehlt mir noch der Zugriff, also:
meine wenn-Bedingung, dann move WAS (array-Pos durchsuchen) nach sStatus.

Meine Bezeichner hab ich von Wago und Oscat. Da beginnen die bools mit x, bytes mit b und strings mit s.
Ich bin erst seit Herbst am Thema dran und habs jetzt so verinnerlicht. Kommst du gf. aus der Siemens-Welt? Da soll ja vieles anders sein..?
Schönen Gruß
 

Majestic_1987

Well-known member
Beiträge
270
Punkte Reaktionen
22
Zuviel Werbung?
->Hier kostenlos registrieren
Du kannst ein Array mit den Texten anlegen und dann nimmst du einfach nen MOVE-Block und an dessen Eingang schreibst du arrMeldetexte[Meldenummer].

In deinem Beispiel, wo diese offenbar bei 130 anfangen für die 1. Meldung könnte man auch schreiben arrMeldetexte[bStatus-130], sofern das Array als ARRAY[0..MAXMESSAGES] definiert wurde. Das geht in jeder Programmiersprache.
 
OP
T

tomrey

Well-known member
Beiträge
346
Punkte Reaktionen
30
Danke, das hab ich schon so verstanden, mein Problem ist aber, dass die Texte zu fest definierten Fehlercodes gehören.
Im Array ist aber ein fortlaufender Index..?
 

MasterOhh

Well-known member
Beiträge
1.582
Punkte Reaktionen
397
Dein Fehlercode ist doch ein Byte, oder? Da reicht dann ein Array[0..255]. An die entsprechenden stellen schreibst du dann deine Meldung rein.
z.B. für Fehlercode 55 wird dann im Array[55] der String abgelegt.

Blöd wird das nur wenn du viele Lücken hast. Da wird dann halt Speicherplatz verschwendet.

Du kannst aber auch ein 2 dimensionales Array anlegen. Quasi ein Wörterbuch. Eine Spalte enthält dann die Codes und die 2te die zugehörigen Meldungs-Strings.
Das ganze ratterst du dann in einer Schleife durch. Wieder sehr einfach in ST aber ich glaube in CFC nur umständlich über Sprungmarken zu lösen....
(Warum wolltest du es nochmal unbedingt in CFC lösen ? :rolleyes: )

Brauchst du das ganze für eine Visu? Wenn ja, welche verwendest du und kann die keine Melde/Alarmlisten?
 
OP
T

tomrey

Well-known member
Beiträge
346
Punkte Reaktionen
30
Zuviel Werbung?
->Hier kostenlos registrieren
Danke, ja es sind viele Lücken..
Also entweder 2-dim oder Melde/Alarmlisten
Ich verwende die in Wago/Codesys eingebaute Visu.
Da gibt es schon eine zentrale "Alarmkonfiguration" aber die "war noch nicht dran" ;-)
Das ist dann wohl der entscheidende Anstoss mich damit zu beschäftigen.
CFC weil ich sonst nichts kann...
Gruß
 
OP
T

tomrey

Well-known member
Beiträge
346
Punkte Reaktionen
30
Hab mich mit der eingebauten Alarmkonfiguration beschäftigt aber das passt wohl nicht zu meiner Anforderung.
In der zentralen Alarmkonf. müssen die Fehler-/Meldebedingungen definiert werden und ich habe diese im Programm bzw. den FBs.
Erscheint mir so übersichtlicher/näher am Thema.
Also bleibt das 2-dim Array. Wie ginge das in ST?
Ich glaube, man kann auch ST in CFC einbinden...
Gruß
 

Volker_81

Member
Beiträge
8
Punkte Reaktionen
0
Danke, hab's wie folgt hinbekommen:
Anhang anzeigen 19560
aber da gibt es doch sicher ne elegantere Lösung (Tabellen o.ä) zumal in dieser Form die Wartung recht aufwändig ist.
Wie würdest du das mit array machen (hab damit noch keine Erfahrung...)
Dank+Gru

Hallo!

Kann mir jemand das genauer mit der Lösung Array aufzeigen?
Wollte das in SoMachine/LogicBuilder Schneider umsetzen.
Danke!
 
Oben