TIA SCL ARRAY bearbeiten

gerdh

Level-2
Beiträge
107
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo !

In Sachen SCL bin ich blutiger Anlänger und hab schon ne weile lesen hinter mir aber irgendwie ist das fuer mich noch ein böhmisches Dorf
Ich habe 2 Arrays , einen Merker und einen struct der dem ein Element aus Array 2 entspricht
Array 1 => 1-255 Bit
Array 2 => 1-255 Struct

Jetzt befuelle ich den Array 2 ... (von extern)
nun setze ich im array 1 z.B. die Bits 10 20 30 und 40
Jetzt möchte ich das beim Durchlauf immer
1. der Merker gesetzt wird
2. Das entsprechende Arrayelement in diesen Struct geschoben wird sprich wenn das 10 Bit sitz soll das array element 10 in den struct geschoben werden....
Danach die Reihe nicht mehr weiter bearbeiten....

Wie stelle ich das an ? mit einer FOR schleife ?

Gruss Gerd
 
Zuletzt bearbeitet:
Moin,
die FOR-Schleife hört sich schon gut an. Allerdings verstehe ich nicht ganz was du mit Bits 10 20 30 und 40 meinst, wenn du doch ein Byte-Array und ein Struct-Array hast? :confused:
 
Zuletzt bearbeitet:
Ah - OK.
Ich würde dir empfehlen, die FOR-Schleife von innen nach außen zu entwickeln. Also erstmal prüfen ob das Bit im Bit-Array gesetzt ist:
Code:
IF myBitArray[x] Then
    ; // hier soll bei einem Treffer was passieren
End_IF;
Im nächsten Schritt dann festlegen was beim Treffer passieren soll:
Code:
myStructArray[x].myBit := myBitArray[x]; // Kopieren des Bit-Array-Eintrags an Stelle x in das Struct-Array an Stelle x
Und dann zum Schluss halt noch das Schleifchen drum ;)
 
Kleiner Nachtrag: Wenn du die Schleife bei einem Treffer (und nach dem Kopieren deiner Daten) verlassen willst, dann nimmst du das Keywort EXIT; ins IF mit hinein. Bedenke aber, dass die Schleife im nächsten Zyklus wieder von vorne beginnt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo !

Ich denke wir redenaneinander vorbei....
wie oben beschrieben.... wenn x Bits vom Array gesetzt sind.... im Bit Arra das erste gesette suchen den entsprechenden Pedant vom Struct Index in ein anderes struct schieben und fertig.... nicht weiter nach Bits suchen (Spich egal wieviel gesetzt sind.... das erste Zählt und den Struct brauche ich....)

Zu deinem Code oben..
das [x] in der ersten Zeile.... muss da wirklich ein x rein ? ? woher kriege ich dann die index nummer damit ich weiss welche Nummer aus dem Struct arry ich nehmen muss ?

Gruss Gerd
 
Moin gerdh,

also also die Syntax einer FOR-Schleife ist:

Code:
FOR #i:= 1 TO 10 DO
    something;
END_FOR;

wobei i der Zählerindex, 1 der Minimalwert von i und 10 der Maximalwert von i ist.

Howard hat x geschrieben. Er meint den Zählerindex (in meinem Beispiel das i).

VG

MFreiberger
 
...
wie oben beschrieben.... wenn x Bits vom Array gesetzt sind.... im Bit Arra das erste gesette suchen den entsprechenden Pedant vom Struct Index in ein anderes struct schieben und fertig.... nicht weiter nach Bits suchen (Spich egal wieviel gesetzt sind.... das erste Zählt und den Struct brauche ich....)
siehe hierzu meinen Post #5 - zum Abbrechen EXIT;

Zu deinem Code oben..
das [x] in der ersten Zeile.... muss da wirklich ein x rein ? ? woher kriege ich dann die index nummer damit ich weiss welche Nummer aus dem Struct arry ich nehmen muss ?
x kannst du nennen wie du möchtest. Das ist die Laufvariable der Schleife. Eine For-Schleife sieht so aus:
Code:
[COLOR=#0000ff]For [/COLOR]Laufvariable := Anfangswert [COLOR=#0000ff]To [/COLOR]Endwert [COLOR=#0000ff]Do[/COLOR]
    ;
[COLOR=#0000ff]End_For[/COLOR];
Im Schleifenkopf weist du also deiner Laufvariable einen Startwert zu (entweder eine Konstante Zahl oder eine Variable) und gibst den Endwert an (ebenfalls eine Konstante Zahl oder eine Variable).
Diese Laufvariable nimmst du als Index für deine Array-Zugriffe.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So jetzt bin ich schon einen schritt weiter.... (ich habe schon mal ein paar bash scripte gemacht mit den schleifen.. :)
Warum hat keine gesagt das man i irgendwoe definieren muss ? :) beim bash ist das einfach da :)
So siehts aktuell aus
Code:
FOR
    #i := 1 TO 128 DO
    IF #TRIGGER[#i] THEN
        MOVE_BLK_VARIANT(SRC := #TELEGRAM, COUNT := 1, SRC_INDEX := #i, DEST_INDEX := 0, DEST => #Send_Telegram);
        #Send_Request := TRUE;
        EXIT;
    END_IF;
END_FOR;

Nur der verda***** MOVE_BLK_VARIANT ist noch ROT untermalt.....

OK ich weiss auch warum irgendwie stoert er sich am DEST.... die Definition muesste aber passen

Send_Telegram "Telegramm"
TELEGRAM Array[1..128] of "Telegramm"
TELEGRAM[1] "Telegramm"

Gruss Gerd
 
Zuletzt bearbeitet:
Der MOVE_BLK_VARIANT will dir einen Return-Wert zurückgeben. Du musst also einen Integer Anlegen (bspw returnMoveBlkVar) und dann:
Code:
returnMoveBlkVar :=  MOVE_BLK_VARIANT(SRC := #TELEGRAM, COUNT := 1, SRC_INDEX := #i, DEST_INDEX := 0, DEST => #Send_Telegram);
 
Moin gerdh,

Warum hat keine gesagt das man i irgendwoe definieren muss ?

Weil klar sein sollte, das JEDE Variable erst einmal definiert werden muss. Und das es kein Schlüsselwort ist ja schon dadurch klar geworden, dass Howard ein x, ich ein i und Howard sogar noch 'Laufvariable' angegeben hat.8)

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi !

Ok manchmal versteh ich Siemens nicht... warum wird der nicht mit angelegt wenn ich das Ding reinziehe, umal ich ihn ja explizit brauche...
BTW: Zumindest iss nix mehr rot :)
Code:
FOR
    #i := 1 TO 128 DO
    IF #TRIGGER[#i] THEN
        #RET_VAL := MOVE_BLK_VARIANT(SRC := #TELEGRAM, COUNT := 1, SRC_INDEX := #i, DEST_INDEX := 0, DEST => #Send_Telegram);
        #Send_Request := TRUE;
        EXIT; 
    END_IF;
END_FOR;

Und wieder was gelernt :)
Wie gesagt beim Bash script muss ich i nirgends definieren.. ich darf nur nicht im gleichen script 2x das selbe verwenden...

Gruss Gerd
 
Moin Gerdh,

Bash script kenne ich nicht. Vielleicht ist es da eine Schlüsselvariable?
Bei SIEMENS, VBS, VBA, ANSI-C, etc. muss man i definieren und kann i dann auch mehrmals in einem Script verwenden (ist halt eine lokale Variable). Nur halt nicht in geschachtelten Schleifen...

VG

MFreiberger
 
Wie gesagt beim Bash script muss ich i nirgends definieren..
Bash script kenne ich auch nicht, aber es scheint, der Name "bash" ist nicht zufällig so gewählt oder vielleicht sogar ein Spitzname für im "HauRuckModus zusammengekloppte" Scripte.
In VBA kann man wählen, ob man Variablen vorab deklarieren muss ("Option Explicit") oder nicht.
 
Hi !

WIe meinst du das ?
Ich hatte es in einem Post vorher beschrieben, es wird ein UDT aus einem Array in einen UDT kopiert

Quelle

=> TELEGRAM Array[1..128] of "Telegramm"
TELEGRAM[1] "Telegramm"

Ziel

=> Send_Telegram "Telegramm"

Gruss Gerd
 
Moin,

wenn die beiden arrays strukturen identisch sind wäre es sinnvoll das per UDT zu lösen
dann spart man sich den MoveBlkVariant und kann direkt kopieren :-)

genau das hatte Howard ja schon in #4 geschrieben.

Wie der MOVE_BLK_VARIANT verwendet wird wurde ja unabhängig von der gewünschten Funktion behandelt.

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
hatte es in einem Post vorher beschrieben, es wird ein UDT aus einem Array in einen UDT kopiert

Quelle

=> TELEGRAM Array[1..128] of "Telegramm"
TELEGRAM[1] "Telegramm"

Ziel

=> Send_Telegram "Telegramm"
d
Wenn Quell- und Zielvariable vom gleichen Typ sind, dann kann man in SCL immer mit:
Code:
myZielVar := myQuellVar;
zuweisen. Das unterscheidet sich von AWL, weil der Ladeoperator dort nur ein Doppelword laden kann. Deshalb braucht man zum kopieren von großen Daten in AWL die diversen Kopierfunktionen - in SCL i.d.R. nicht.
 
Hi !

WIe meinst du das ?
Ich hatte es in einem Post vorher beschrieben, es wird ein UDT aus einem Array in einen UDT kopiert

Quelle

=> TELEGRAM Array[1..128] of "Telegramm"
TELEGRAM[1] "Telegramm"

Ziel

=> Send_Telegram "Telegramm"

Gruss Gerd


sorry, das mit dem TELGRAMM und das das ja ein UDT sein muss, habe ich übersehen, überall im Text wurde immer STRUCT erwähnt, deswegen der post.....
 
Hi !

Kein Ding :)

also kann ich den Blockmove rausmachen und
Code:
   #Send_Telegram := #TELEGRAM[#i];
reinmachen

Gruss Gerd
 
Zurück
Oben