String in Any wandeln im SCL

Masticore666

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jungs ,

hey hat einer ne Ahnung wie man einen String in ein Any wandeln kann ??

ich brauche das um über ein Array of String die Eingänge bzw Augänge des BLKMOV SFC20 (sind vom Format ANY) durch eine Schleife zu beschreiben.
Und somit einen Reihe von DB´s kopieren kann ohne viel Schreibarbeit zu haben sind nähmlich später 120 Stück zu erwarten.

Hier mal der CODE :

FUNCTION_BLOCK FB21
VAR_TEMP
// temporäre Variablen
END_VAR
VAR
// statische Variablen
DB_Array : ARRAY[1..3] OF STRING[9]:= 'DB1','DB2','DB3';
DB_Array_INIT : ARRAY[1..3] OF STRING[9]:= 'DB11','DB12','DB13';
i:INT :=1;
end:INT:=3;

END_VAR
REPEAT
// Anweisungsteil

SFC_ERR := BLKMOV(SRCBLK := DB_Array// IN: ANY , HIER DAS PROB DAS DER EINGANG NOCH STRING IST !!!
,DSTBLK := DB_Array_INIT // OUT: ANY ,HIER DAS PROB DAS DER EINGANG NOCH STRING IST !!!
); // INT

i := i+1;


UNTIL i=end
END_REPEAT;


END_FUNCTION_BLOCK


Merci, für die folgende HILFE ;)
 
Hallo,
leider habe ich nicht verstanden, was du tun willst.
Ach ja ... und warum (wenn du einen ANY erstellen willst) bedienst du dich des Formates STRING ?
Vielleicht führst du die Sache doch etwas besser aus ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Steht eigentlich alles oben drin ,

Also ich habe 120 DB´s die ich kopieren will , das wollte ich mit dem SFC20 BLKMOV machen.

Nun müsste ich 120 mal den FC aufrufen und die jeweiligen DB´s zuordnen.

um mir die 120 aufrufe zu sparen will ich über eine Schleife ein Array haben das mir den FC immer mit dem jeweiligen DB´s fülht wie auch oben im CODE -Auszug zusehn.

Problem ist das ich kein Array of Any im SCL Editor erstellen kann und somit nur ein Array of String habe diese mit meinen zu kopierten DB´s fühle und nun brauche ich einen Umwandler der mir die Strings in das Fomrat Any umwandelt damit ich die Eingänge des FC´s Fühlen beschreiben kann
 
Steht eigentlich alles oben drin ,

Also ich habe 120 DB´s die ich kopieren will , das wollte ich mit dem SFC20 BLKMOV machen.

Nun müsste ich 120 mal den FC aufrufen und die jeweiligen DB´s zuordnen.

um mir die 120 aufrufe zu sparen will ich über eine Schleife ein Array haben das mir den FC immer mit dem jeweiligen DB´s fülht wie auch oben im CODE -Auszug zusehn.

Problem ist das ich kein Array of Any im SCL Editor erstellen kann und somit nur ein Array of String habe diese mit meinen zu kopierten DB´s fühle und nun brauche ich einen Umwandler der mir die Strings in das Fomrat Any umwandelt damit ich die Eingänge des FC´s Fühlen beschreiben kann

Na ja, dann hast du dein Anliegen vielleicht zu gut getarnt. ;)

Sieh dir mal diesen Beitrag an: http://www.sps-forum.de/showthread.php?t=4462&highlight=Blk_move

Da haben wir mal über den SFC20 gesprochen. Den genutzten "Wrapper" für den SFC20 kann man auch nutzen um eben nicht direkt mit Any arbeiten zu müssen.
 
mh....
also ganz schlau werd ich daraus nicht, bin auch kein AWL spezialist, wie gesagt brauch ich was in SCL und immer noch eine Wandlungs möglichkeit wie ich einen STRING z.B. 'DB1' in den TYP 'Any' umwandel kann um somit den SFC20 zu füttern.

:|
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ja, dann hast du dein Anliegen vielleicht zu gut getarnt. ;)

Also dann nochmal :
Warum ist deine Quelle ein String ? Woher kommt der ?
Es läßt sich alles andere (z.B. auch eine Schleifen-Variable) viel besser in einen ANY-Pointer umbasteln. Es gibt dafür keine fertige Routine - man kann sich aber u.A. nach der genannten Anleitung ganz gut einen selbst erstellen. Ansonsten gibt es da auch noch einen schönen Beitrag in der FAQ.
Sind alle DB's gleich groß ?
Möchtest du immer den ganzen DB verschieben oder nur einen Teil daraus ?
Warum überhaupt 120 DB's ?

Gruß
Larry
 
Warum soll das denn unbedingt ein String sein???

Der "Wrapper" im o.g. Beitrag verlangt die DB-Nummer als Int, die Länge in Byte und das Startbyte, ab dem umkopiert werden soll. Daraus wird dann intern der Any für den SFC20 erstellt. Du brauchst also in SCl nur den "Wrapper"-FC aufzurufen und an die Inputs die entsprechenden Daten als INT anzutragen.

PS: Ach so, noch was, Vorsicht vor all zu langen Schleifen in der SPS, das führt schnell zum Supergau in der Zykluszeit!
 
Hallo Masticore666,

wenn Du nicht 120 Aufrufe der SFC20 ausprogrammieren willst, dann mußt Du für SRCBLK und DSTBLK Any-Variablen
benutzen. Any-Variablen können nur in TEMP (oder als Übergabeparameter) erstellt werden, müssen also zur Laufzeit
erzeugt werden (so wie im Link von Ralle und in einem FAQ hier im Forum beschrieben).
Du kommst also nicht darum herum, das Erzeugen der Any-Pointer zu verstehen.

Zum Erzeugen eines Any-Pointers reicht es nicht, nur die DB-Nummer anzugeben. Es wird auch die DB-(Bereichs-)Länge
benötigt. Mit Deinen DB-Namen als STRING kommst Du da sowieso nicht weit.
Mache Dir doch ein Array of Struct {DBNr INT, DBLen INT} und baue aus diesen numerischen Angaben die Any-Pointer
zusammen. Ich würde das nicht in SCL machen, sondern in AWL. In AWL wäre es zusätzlich möglich, die DB-Länge zur
Laufzeit zu ermitteln (L DBLG), so daß DBLen im Array ggf. entfallen könnte.

Nochwas:
Eine SPS ist kein Datenverarbeitungs-PC, der sich beliebig lange mit dem Kopieren von Daten beschäftigen kann.
Eine Schleife zum kopieren von 120 DB ist kein guter Ansatz. Die Aufgabe muß auf viele SPS-Zyklen aufgeteilt
werden. Ich würde einen Aufgaben-Zähler benutzen und je nach DB-Größe je OB1-Zyklus nur 1 bis 4 DB kopieren.
Im nächsten Zyklus dann die nächsten DB, danach die nächsten ... solange, bis alle DB kopiert sind.

Wie groß sind Deine 120 DB? Sind die alle gleich lang? Wozu und wie oft mußt Du die 120 DB kopieren?
Beschreibe mal mehr von Deiner Aufgabe, vielleicht gibt es ja einen besseren Weg.

Harald
 
Zurück
Oben