SCL Von einem Datenspeicher (struct) in einen Ausgangsbereich kopieren mit Pointer

FloSch

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

ich versuche seit geraumer Zeit eine Datenstruktur auf ein Ausgangsbereich zu kopieren.
Leider werden diese Daten nicht auf den Ausgangsbereich geschrieben und ich kann mir nicht recht erklären warum.
Hier mein Code:

Code:
FUNCTION_BLOCK scanner 

...
...
...

VAR       
outputstorage1     : STRUCT 
     //Ctrl Bits     
      plc_o1      : BOOL;                   // PLC Out 08 ?
      plc_o2      : BOOL;                   // PLC Out 08 ?
      plc_o3      : BOOL;                   // PLC Out 08 ?
      plc_o4      : BOOL;                   // PLC Out 08 ?
      dista1      : BOOL;                   // Distanceconfiguration 1
      dista2      : BOOL;                   // Distanceconfiguration 2
      dista3      : BOOL;                   // Distanceconfiguration 3
      dista4      : BOOL;                   // Distanceconfiguration 4
      start       : BOOL;                   // Objecttrigger for the barcodescanner
      sidle       : BOOL;                   // Sensor idle
      teach1      : BOOL;                   // Controller Teach-in 1
      teach2      : BOOL;                   // Controller Teach-in 1
      extout1     : BOOL;                   // Status External Output 1 (Fieldbus)
      extout2     : BOOL;                   // Status External Output 2 (Fieldbus) 
      result1     : BOOL;                   // Status Result 1 (Barcodescanner)
      result2     : BOOL;                   // Status Result 1 (Barcodescanner)
  END_STRUCT ;  
  
    outputstorage2     : STRUCT     
     //Outputbytes (HS)  
      binout      : BYTE;                   // Binary Outputs
      serial      : BYTE;                   // Serial number recieve counter back
      transc      : BYTE;                   // Transmitcounter
      tlength     : WORD;                   // Total length of protocol 
      transd1     : BYTE;                   // TransmitData Byte1
      transd2     : BYTE;                   // TransmitData Byte2
      transd3     : BYTE;                   // TransmitData Byte3
  END_STRUCT ;  
END_VAR

Var_Temp

// Outputbitmanipulation of the Any-Pointer  
  outputp              : ANY;
  outputbits AT outputp : STRUCT 
   datatype         : WORD;    // Define ANY DataType eg. 16#1002; to work with bits
   repeatf          : INT;     // Repeatingfactor
   source           : INT;     // Source Area eg. EB 10
   pntr             : DWORD;   // Byte pointer eg 16#8100_0000; for Inputs
  END_STRUCT;

BEGIN

// Initialize Outputsbits   
    outputbits.datatype := 16#1002;                               //Bytes
    outputbits.repeatf  := 16#2;   
    outputbits.pntr     := 16#8200_0000;                         //Inputs
    outputbits.source   := 16#30;
    ret := BLKMOV(SRCBLK :=  outputstorage1 ,DSTBLK := outputp    ); 

...
...
...

Ich habe jetzt nicht den ganzen Code kopiert, deswegen soltle klar sein, das meine outputstorage1 Daten enthält.
Die Ausgänge liegen innerhalb des Prozessabildes.

Was mich sehr wundert ist auch, dass es überhaubt kein Problem ist die Daten zb. per BLKMOV in einen DB zu kopieren aber nicht auf die Ausgänge...

Wäre toll wenn jemand von euch eine Lösung hätte.

Danke im vorraus.
Florian
 
From the code it looks like the output is on Profibus. Then use SFC15.....something like below

tiStatus := DPWR_DAT
( //Write Consistent Data to I/O area
LADDR := int_to_word(PQAD),
RECORD := tbyHandshake
);
if (tiStatus <> ciNoError) then
YF := true;
return;
end_if;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Thank you for your answer, but I allready tried it with the SFC15. That is sadly not the solution for my problem...

The programm is for a barcodescanner that is connected via Profinet...
 
Well, if your output is two byte (word consistent) SFC15 will work. We use that all the time....
RECORD := outputstorage1 on SFC 15 is evaluated to an ANY pointer by SCL... and that will work....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe den Code nicht so ganz, aber SCL bildet für den BlockMove vollkommen eigenständig den ANY-Pointer. Also lass das doch mal mit dem ANY und trage dafür den Namen der Struktur an den SFC-Aufruf an.
 
Ich denke dass das Hauptproblem is die aktueller Laenge im DP Outputbereich. Fals das bereich ist, lass mal sagen 16 byte, dann muss auch das VAR Structur 16 Byte lang sein.......SFC20 functioniert jedenfalls nicht, habe ich probiert.....
 
OK good to know that SFC20 doesn´t work on Profibus/Profinet.
But I tried to use the SFC15 in this way:

ret := DPRD_DAT(LADDR := INT_TO_WORD(48) ,RECORD := outputstorage1 );

but it does not worked.
I could solve the problem with using the FunctionBlock SETIO_PART from the standard lib.
Actually I would prefer an FC but it looks like that the SFC15 does not work for me, or I make a mistake?
 
Ohje ich könnte im Dreieck springen...
Wer hätte es gedacht ersetzt man DPRD_DAT mit DPWR_DAT und schon geht es ;)

Vielen Dank!
 
Ja, mann sieht sich blind auf die SCL zeilen..... Ich benuetze das selbe methode fuer alle DP gereate, ABB, Siemens und wer weiss was.... Schoene loesung mit interner daten im VAR bereich und dann flush mit SFC 15/14, benuetzen wir immer....
 
Ja, mann sieht sich einfach blind auf die SCL zeilen..... SFC15/16 ist schoen, SPS geht nich in stop fals man IO falsch parametriert, wir setzen immer SFC14/15 ein.... (oder SFC20 wenn er geht).
 
Zurück
Oben