blkmov in SCL

Felse

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

Ich habe folgendes Problem: ich habe in meinem Projekt mehrere Optionsmöglichkeiten zur Auswahl was den Aufbau der Maschine betrifft, diese will ich durch einen Tastendruck in einen zweiten DB "abspeichern" können. Ich will dafür die SFC20 blkmov nutzen, aber wie funzt das in SCL? Hab die SFC aufgerufen, weiß aber nicht genau welche Parameter da rein geschrieben werden müssen. Das hab ich bis jetzt.
Code:
IF speichern = true 
THEN BLKMOV(SRCBLK := test, // IN: ANY
     DSTBLK := test1  // OUT: ANY
                    );  // INT
END_IF;
speichern ist mein Taster
test ist mein Quell - DB
test1 ist mein Ziel - DB
Aber was kommt in die letzte Zeile, da bekomm ich beim Übersetzen immer "Ungültiger oder fehlender Funktionstyp", oder geht das so gar nicht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab ich mir gedacht, weil ich das aus awl so kenne, aber warum fehlt der hier, ich hab den SFC20 doch ganz normal aufgerufen (einfügen - Bausteinaufruf).
 
Code:
IF speichern = true
 
THEN BLKMOV(SRCBLK := test, // IN: ANY
       RET_VAL:= test2.Wert,
       DSTBLK := test1  // OUT: ANY
       );  // INT
END_IF;
Wert ist eine INT Variable im DB test2
Geht trotzdem nicht, gleiche Meldung in der letzten Zeile
 
Hallo Felse,

versuch mal in Deinem Bausteinordner den SFC 20 zu erzeugen, vllt. gehts dann.

Grüße
Gebs
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie in den anderen Thread schon beschrieben:

In SCL kann man einfach so schreiben:
PLC_data1.vals[2] := PLC_data2.vals[1] ;
oder sogar
PLC_data1.vals := PLC_data2.vals ;
oder eben
PLC_data1 := PLC_data2 ;

Der compiler kümmert sich dann um wie die Daten transferiert wird.
Wenn die Daten nur wenige sind, wird normale Lade+Transfer verwendet.
Wenn die Daten zu viel sind, wird ein SFC20 aufruf eingefügt.

Wenn Du wirklich SFC20 in SCL aufrufen willst, denn sieht das so aus:

Code:
FUNCTION Call_SFC20 : void
VAR_TEMP
 iRetval : INT ;
END_VAR
 
iRetval := BLKMOV(SRCBLK :=  PLC_data.vals[1]
       ,DSTBLK := PLC_data.vals[2]
       ); 
 
END_FUNCTION

edit: Habe das Beispiel etwas erweitert

noch ein edit: Wichtig ist, wenn Quelle und Ziel schon bekannt ist für den Compiler, dann shreibt man einfach datenx := dateny ;
Wenn die Daten nicht bekannt ist, weill sie als ANY Paremeter übergeben werden oder der ANY Pointer intern 'gebaut' wird, so braucht man BLKMOV in SCL code.
 
Zuletzt bearbeitet:
Mit dem SFC20-Aufruf geht das so:

Code:
FUNCTION_BLOCK FB111

VAR_INPUT
   INANY: ANY;
   OUTANY: ANY;   
END_VAR

VAR_TEMP
    // temporäre Variablen
  Retval: INT;
END_VAR
VAR
    // statische Variablen

END_VAR

Retval := BLKMOV(SRCBLK := INANY  // IN: ANY
       ,DSTBLK := OUTANY  // OUT: ANY
       ); // INT
 
    // Anweisungsteil
    ;
END_FUNCTION_BLOCK

Du kannst auch mal hier schauen:

http://www.sps-forum.de/showpost.php?p=25492&postcount=5

Der FC112 könnte vielleicht von dir eingesetzt werden, dann mußt du in SCL nicht die Any selber zusammenbauen, sondern rufst den FC112 auf, DB-Nummr, Start-DW und Länge dran, fertig.
 
@ ll Da hat sich Volker wirklich viel Arbeit gemacht, leider weiß jetzt auch nicht wirklich mehr, keine Ahnung was da jetzt zu tun ist.
 
Erstmal danke für die ganze Hilfe, wenn ich das jetzt testen möchte, müssten doch die Variablen (Aktualwerte) von test in test1 geschrieben werden, oder sehe ich das falsch, das einzige, was ich beobachten kann, ist das sich "Wert" auf -32768 ändert.
 
@ larry : doch die haben mir geholfen, das hatte ich geschrieben bevor ich die Beiträge aktualisiert hatte
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal danke für die ganze Hilfe, wenn ich das jetzt testen möchte, müssten doch die Variablen (Aktualwerte) von test in test1 geschrieben werden, oder sehe ich das falsch, das einzige, was ich beobachten kann, ist das sich "Wert" auf -32768 ändert.

Versuch es mal mit dem FC112, das erspart dir den Umgang mit den Any-Variablen.
 
Zurück
Oben