TIA String verschieben IN/OUT per SCL an 300er

gerdh

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

Ich muss ein Programm aus einer 1500er CPU in eine 300er "backporten".
Soweit gehts ganz gut, aber beim String verschieben hapterty teilweise noch etwas.
die 1500er hat ja die Funktion S_MOVE. Diese habe ich quasi in der 300er mit einem SCL Baustein gemacht
Code:
#Target := #Source;
Das Funktioniert eigentlich bis auf dem Fall das wenn ich den Baustein mit INOUTs "füttere"
Sprich o.g. Funktion der SOURCE ist eine INOUT vom übergewordneten Baustein und das TARGET auch.
Ich habe schon Souce und Target als alles mögliche definiert... aber da sagt er jedesmal falscher Datentyp.

Gruss Gerd
 
Moin,
hast du mal probiert die INOUTs vorher in Local-Strings umzukopieren: Also
Code:
tempTarget := Target und tempSource := Source
und sie dann an deine Funktion zu übergeben.
Damit müsste es eigentlich gehen.
 
Wenn Du etwas exakter angeben würdest was genau Du machen willst, dann könnte man genauere Erklärungen liefern.
"#Target := #Source;" geht schon - manchmal. :cool:

So nur kurz der Hintergrund zur Ursache des von uns vermuteten Problems: wenn zusammengesetzte Datentypen per Referenz übergeben werden, dann können sie nicht direkt an Bausteinaufrufe durchgereicht werden, sondern müssen in lokale Variablen umkopiert werden und dann die Kopien weiterreichen.

Und was meinst Du mit "hapern"? Gibt es eine Fehlermeldung vom Compiler oder funktioniert das Kopieren zur Laufzeit nicht?

Harald
 
Achso - jetzt hab ich es verstanden. Du hast einen FUP/KOP Baustein mit einer irgendwie gearteten InOut-Schnittstelle und willst dort Strings rangieren. Und da es den S_Move nicht gibt, hast du dir eine SCL Funktion geschrieben, die einen String umkopieren kann. Soweit richtig?
 
Hi ! Ja....
Ich habe eine Funktion gemacht (einen FC nennem wir ihn FCx) der mir per SCL Strings verschiebt
diesen Rufe ich in einem FB auf der Strings deklariert hat (an den OUTS und an den INOUTs)
Jetzt rufe ich diese Funktion (FCx) auf (wie in Post 1 beschrieben) dann will ich am Target einen String ausgaben der im FB als INOUT definiert ist, und das geht nicht weil Angeblich falscher Datentyp.
Die String die auf OUT deklariert sind gehen.
Ich hab auch schon im FC (FCx) Sourch und Target auf INOUT deklariert (auch alle anderen Optionen probiert) , aber immer das selbe Ergebnis.. sobald der String am Target oder Source ein INOUT vom aufrudenden FB ist , krieg ich den roten Text mit flascher Datentyp...

Gruss Gerd
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dazu hat Harald dir schon die Antwort gegeben - das geht so leider nicht.
So nur kurz der Hintergrund zur Ursache des von uns vermuteten Problems: wenn zusammengesetzte Datentypen per Referenz übergeben werden, dann können sie nicht direkt an Bausteinaufrufe durchgereicht werden, sondern müssen in lokale Variablen umkopiert werden und dann die Kopien weiterreichen.

Deine InOut ist ein Pointer (Referenz) auf einen Speicherbereich. Du musst aber an deine eigentliche String-Variable heran und dafür bietet dir KOP/FUP leider auf der 300er keine Funktion. Da bleiben dir nun zwei Möglichkeiten:
1. Trenne die Schnittstelle auf und ändere sie auf Input und Output oder übergebe zumindest die benötigten Strings einzeln als Input.
2. Schreiben deinen ganzen Baustein gleich als SCL-Baustein.
Mehr fällt mir da auf die Schnelle auch gerade nicht ein.
 
Wie PN/DP schrieb, mußt du den String vor der Übergabe umkopieren.
Das habt ihr ja vorher auch mit der Funktion S_Move gemacht.
Die gibt es in Step7 Classic nicht, aber so wie ich das sehe, sollte z.B. auch die Funktion LEFT (IEC-Library FC20) dazu fähig sein:

Beschreibung


Die Funktion FC 20 liefert die ersten L Zeichen einer Zeichenkette. Ist L größer als die aktuelle Länge der STRING*Variable, wird der Eingangswert zurückgeliefert. Bei L = 0 und bei einem Leerstring als Eingangswert wird ein Leerstring zurückgeliefert. Ist L negativ wird ein Leerstring ausgegeben und das BIE*Bit auf "0" gesetzt.


Parameter Deklaration Datentyp Speicherbereich Beschreibung
IN INPUT STRING D, L Eingangsvariable im Format STRING
L INPUT INT E, A, M, D, L, Konst. Länge der linken Zeichenkette
RET_VAL OUTPUT STRING D, L Ausgangsvariable im Format STRING
Der Parameter IN und der Rückgabewert können nur mit einer symbolisch definierten Variable belegt werden.

So könntest du den INOUT am Anfang auf eine temp umkopieren und am Ende mußt du ihn wieder Zurückkopieren.
Achtung, Temp-String mußt du u.U. erst selbst initialisieren, also mit einem Wert vorgelegen.
Einen Test wäre es zumindest wert.
 
Zurück
Oben