Peripheriebereich in SCL kopieren

rr_zx

Level-2
Beiträge
86
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Ich möchte im SCL einem Peripheriebereich in die stat eines FB kopieren und umgekehrt.
z.B. vom EB300 möchte ich 6 Bytes in die lokalen Stat-daten kopieren. Und von den Stat-Daten wieder 10 Bytes in das AB300.
In den Stat-Daten habe ich einen Any-Pointer.
Ich dachte, dass könnte man über einen Block-Move lösen?
Ich möchte meine Profibusbasuteine in SCL-umschreibem. Bis jetzt sind die Bausteine in AWL und dort habe ich das über Pointer gelöst.

Viele Grüsse
Ralph
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wenn du es in AWL bislang über Pointer gelößt hast dann verstehe ich dass so, dass du eine Art Schleife hast in der du die PEW's (oder PED's) quasi "Stück für Stück" vom Einen in den Anderen kopierst - ist das so ?
Wenn ja, dann sähe dein Weg in SCL im Grunde genauso aus - du baust dir einen Index-Pointer mit dem du auf die Adressen in einer Schleife zugreifst.

Gruß
Larry
 
Hallo

Das mit dem SFC14/15 sollte bei Profibus/Profinet funktionieren. Jedoch habe ich bei einer Zählerkarte (direkt an einer 151-8 CPU angeschlossen) immer einen Fehler bekommen, dass die Länge nicht stimmt.
Ich möchte am Baustein einen IN-Parameter definieren mit der Peripherieadresse (integer).
Früher habe ich das so gelöst:

Code:
//Statuswort lesen 
      L     #Adresse                    //Pointer für Adresse machen
      L     L#8
      *D    
      LAR1  
//ganzer Lesebereich in Temp. Daten schreiben
      L     PEW [AR1,P#0.0]
      T     #StatusSteuerWord
      L     PED [AR1,P#2.0]
      T     #Daten_1
      L     PED [AR1,P#6.0]
      T     #Daten_2
      L     PED [AR1,P#10.0]
      T     #Daten_3


//Pointer für Stat machen und ganzer Bereich schreiben   
      L     P##ek_in_drive
      LAR1  
      L     #StatusSteuerWord
      T     DIW [AR1,P#0.0]
      L     #Daten_1
      T     DID [AR1,P#2.0]
      L     #Daten_2
      T     DID [AR1,P#6.0]
      L     #Daten_3
      T     DID [AR1,P#10.0]

Als Zwischenlösung habe ich einen Any-Pointer im SCL verwendet und verwendeten Peripheriewörter in das Prozessabblid gelegt.
Mit folgendem Code:

Code:
(* Werte von SSI Geber einlesen                          *)
(*********************************************************)

#AnyPointerDatenModul.Syntax_ID       := b#16#10;
#AnyPointerDatenModul.Datentyp        := b#16#2;
#AnyPointerDatenModul.Count           := w#16#8;
#AnyPointerDatenModul.DB_Nummer       := w#16#0;
#AnyPointerDatenModul.Byte_Pointer    := SHL(IN := INT_TO_DWORD(#Adresse_Mess_System), N :=3) OR 16#8100_0000;

#Ret :=  BLKMOV(SRCBLK := #"AnyPointerDatenModul-AT", DSTBLK => #SSI_Daten.Eing_daten);

Ich möchte nur nicht immer das Prozessabblid erweitern.

Viele Grüsse
Ralph
 
Hallo Ralph,

..Ich möchte am Baustein einen IN-Parameter definieren mit der Peripherieadresse (integer)...

du kannst indiziert auf deine PEW-Adressen zugreifen.


Sinnfreier Code:
Code:
FUNCTION "PEW_RD_DAT": VOID

VAR_INPUT
  PEW_ADRESSE                       : INT;                    // Anfangsadresse PEW-Bereich
END_VAR

VAR_TEMP
  X,Y,Z                             : BYTE;
  INDEX_PEW                         : INT;
END_VAR

BEGIN
    INDEX_PEW := PEW_ADRESSE;
    X := PEB[INDEX_PEW];
    Y := PEB[INDEX_PEW + 1];
    Z := PEB[INDEX_PEW + 2];
     // oder wie auch immer (Schleife?)
END_FUNCTION


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wir machen das immer mit einer Struct:

Code:
Empfangspuffer :STRUCT
        MeinWort_1   :WORD;
        MeinWort_2   :WORD;
        MeinWort_3   :WORD;
END_STRUCT;

Code:
        Hardware_IO_Adresse := INT_TO_WORD(E_Meine_IO_Addresse);
        
        Rueckgabewert := DPRD_DAT(LADDR := Hardware_IO_Adresse
                                            ,RECORD := Empfangspuffer );
 
Zurück
Oben