Array an FC übergeben und löschen (SCL)

Isha

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

Ich möchte ein Array an einen FC übergeben und löschen.
Die Länge des Array kann unterschiedlich sein.
Die Übergabe an den FC mache ich mit einem Any-Pointer. Danach lese ich im FC die Länge des Arrays in Bytes aus.
Dies funktioniert soweit.

Code:
[COLOR=black][FONT=Courier New]FUNCTION FC1: VOID[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]//********************************************************// [/FONT][/COLOR]
[COLOR=black][FONT=Courier New]//    Array-Variable löschen                              //[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]//********************************************************// [/FONT][/COLOR]
 
[COLOR=black][FONT=Courier New]VAR_IN_OUT[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]DelArray :ANY;       // Arrayelement das gelöscht werden soll[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]END_VAR[/FONT][/COLOR]
 
[COLOR=black][FONT=Courier New]VAR_TEMP[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]i:INT;[/FONT][/COLOR]
[FONT=Courier New]NumberOfElements:INT; [/FONT]
[COLOR=black][FONT=Courier New]pAny : ANY;[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]MyAny AT pAny : STRUCT[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]        ID  : BYTE;[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]        TYP : BYTE;[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]        NUM : INT;[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]        DBN : INT;[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]        PTR : DWORD;[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]    END_STRUCT;[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]END_VAR[/FONT][/COLOR]
 
 
[COLOR=black][FONT=Courier New]BEGIN [/FONT][/COLOR]
 
[COLOR=black][FONT=Courier New]pAny := DelArray;[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]NumberOfElements := Myany.NUM; // immer als Anzahl BYTE[/FONT][/COLOR]
 
[FONT=Courier New]// !!!!! Nun sollen die Daten gelöscht werden !!!!!![/FONT]
 
[COLOR=black][FONT=Courier New]END_FUNCTION[/FONT][/COLOR]

Nun habe ich den Pointer und die Länge. Somit kann ich eine FOR..NEXT Schlaufe machen und die Daten byteweise löschen.
Nur weiss ich nun nicht wie ich auf die Daten zugreifen kann um diese zu löschen.
Hat jemand eine Idee?

Gruss
Isha
 
Hallo,
wenn du es wirklich so und selber machen willst, dann müßtest du jetzt den ANY-Pointer zerlegen und daraus die Adress-Zugriffe zu erstellen.
Es gäbe allerdings auch die Möglichkeit den Siemens-SFC "Fill" dafür zu verwenden - der würde das auch machen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich möchte ein Array an einen FC übergeben und löschen.
Die Länge des Array kann unterschiedlich sein.
Die Übergabe an den FC mache ich mit einem Any-Pointer. Danach lese ich im FC die Länge des Arrays in Bytes aus.
Dies funktioniert soweit.
Hallo Isha,

wenn Du das schon als Any-Poniter übergibst, bräuchtest doch nur den Fill-Baustein SFC21 aufrufen.

Edit: Larry war schneller
 
Zuletzt bearbeitet:
Das mit dem FILL Baustein scheint einfach zu sein.
Nur wie geht das??????????

Den ANY von der Schnittstelle akzeptiert der Baustein nicht.

Gruss
Isha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Willst du von deinem eigenen FC den SFC aufrufen ?
Wenn ja, dann mußt du den ANY in dem FC noch einmal abbilden (im TEMP-Bereich) und den dann übergeben. Besser wäre, den SFC statt deines FC's zu verwenden ...

Gruß
LL
 
Ich habe es nun in AWL gemacht.

Code:
FUNCTION "DelArray" : VOID
TITLE =
VERSION : 0.0
 
VAR_INPUT
  DelArray : ANY ; //Arrayelement das gelöscht werden soll
END_VAR
VAR_TEMP
  Array_tmp : ANY ; 
  Ret_Val_FILL : INT ; 
  Null : BYTE ; 
END_VAR
BEGIN
NETWORK
TITLE =Array löschen
//     
//
      L     P##DelArray; 
      TAR2  ; 
      SLD   8; 
      SRD   8; 
      +D    ; 
      LAR1  ; 
      L     D [AR1,P#0.0]; 
      T     LD     0; 
      L     D [AR1,P#4.0]; 
      T     LD     4; 
      L     W [AR1,P#8.0]; 
      T     LW     8; 
      L     0; 
      T     #Null; 
      CALL "FILL" (
           BVAL                     := #Null,
           RET_VAL                  := #Ret_Val_FILL,
           BLK                      := #Array_tmp);
END_FUNCTION

Funktioniert perfekt.
Vielen Dank für die Hilfe.

Gruss
Isha
 
Zurück
Oben