Step 7 Datenpakete flexibel kopieren über Startadresse + Länge

ThomasMaulwurf

Level-1
Beiträge
41
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich sitzte jetzt seit Stunden hier am Forum und bekomme es nicht zurecht gebastelt (mangelnde AWL- und Pointer-Erfahrung machen's leider auch nicht besser).

Ziel-FB:

- IN: Startadresse eines Datenpakets (E / A / M / DBX / PEW / PAW)
- IN: Länge des zu schiebenden Bereichs in Byte

- OUT: Frei wählbarer Datenbereich in DB / IDB

...ergo: Beginne bei irgendwo, nehme ab dort so und so viele Bytes, schreibe sie in ein Ziel-DB (gerade bei PEW sind ja gern WORD, BYTE etc. gemischt... die entsprechende Struktur muss man dann im Ziel-DB halt so anlegen, dass die Bytes korrekt verteilt werden)+ Crossreferenz-Fähigkeit

Probleme:


- Meine beiden "IN"s könnten evtl. von einem Zeiger abgedeckt werden - ist aber nicht gewünscht.
- SFC14 macht einen guten Job beim PEW (dank Harald http://www.sps-forum.de/simatic/77941-sfc14-laddr-mit-pew-beschalten.html ), aber die Bereichslänge bekomm ich nicht flexibel, außerdem möchte ich Slaves auch Modulübergreifend auslesen
- SFC20 will wiederum kein PEW fressen (Ansatz evtl. http://www.sps-forum.de/simatic/68389-eingangswort-ueber-pointer-einlesen-anfaengerfrage.html )
- Wie bekomme ich den OUT flexibel? Ich kann an RECORD / DSTBLK einen Zeiger angeben, aber scheinbar keinen aus herausführen

Ansatz:

- je nach Eingabe einen ANY-Pointer berechnen lassen ... nur: wie bringt man dem bei, dass er verschiedene Datentypen "erkennt"?

Ich werde noch eine Weile hier drüber brüten: http://www.sps-forum.de/faq/12923-any-zeiger-fuer-datentypen.html
... und AWL studieren.


In der Zwischenzeit wäre ich für Ideen, Input, etc. dankbar!

Gruß, Thomas
 
PEW genau so wie PAW braucht heutzutage bis auf ein paar ganz wenigen Sachen wo es wirklich rein um die Geschwindigkeit geht, kein Mensch mehr.

Im Grunde genommen finde ich dein Bemühungen sinnlos im Sinne von, das die Variante auf der S7-1200 gar nicht, und auf der 1500 nur mit erheblichen Performanceeinbussen funktionieren würde.

Aber das was du beschreibst ist in letzter Konsequenz der SFC20.

Mfg
Manuel
 
So. Ich habe endlich was gebastelt bekommen, was nach ersten Tests einen guten Job macht. Entspricht nicht 100%ig der Grundidee aber dient seinen Zwecken.

Gedanken dazu / Verbesserungsvorschläge gern gesehen - auch falls wem mögliche Probleme auffallen sollten!

Am Ende ist es ein abgewandelter SFC20, der vom DAU und ohne Wissen über Pointer beschaltet werden kann, der PEW lesen kann und dessen Beschaltung in den Querverweisen findbar sind.

Einzige Krux: man muss den IDB entsprechend der Quelle strukturieren, aber gut.

EDIT: nicht Multiinstanzfähig, soweit ich das verstehe - muss aber auch nicht.

Code:
//Retten
      TAR1  
      T     #t_ar1
      TAR2  
      T     #t_ar2



// Index
      L     1                          
      T     #index          


//Quell-Pointer erzeugen

      L     #Adr_Typ
      L     1
      ==I   
      SPB   LPEB

      L     #Adr_Typ
      L     2
      ==I   
      SPB   LDB

      L     #Adr_Typ
      L     4
      ==I   
      SPB   LMB

//====================================================================================================

LPEB: L     P##PEB_Adr                 
      LAR1                                      
      L     D [AR1,P#2.0]                
      LAR1                                     

doP:  NOP   0                       

      L     PEB [AR1,P#0.0]
      T     DIB [AR2,P#74.0]


//Datenlänge auf Index Addieren und schauen, ob angegebene Datensatzlänge erreicht wurde
      L     #index                    
      L     1                         
      +I                             
      T     #index             
      L     #Anzahl_Bytes         
      >I                              
      SPB   out                        

//Falls Ende noch nicht erreicht, errechne nächsten freien Speicherort
      L     8                          
      +AR1                            
      +AR2  
      SPA   doP                         

//====================================================================================================

LDB:  AUF   #DB_Nr

      L     P##DB_Adr
      LAR1  
      L     D [AR1,P#2.0]
      LAR1  


doDB: NOP   0                          

      L     DBB [AR1,P#0.0]
      T     DIB [AR2,P#74.0]


      L     #index
      L     1
      +I    
      T     #index
      L     #Anzahl_Bytes
      >I    
      SPB   out

      L     8
      +AR1  
      +AR2  
      SPA   doDB


//====================================================================================================

LMB:  L     P##MB_Adr
      LAR1  
      L     D [AR1,P#2.0]
      LAR1  

doM:  NOP   0                          

      L     MB [AR1,P#0.0]
      T     DIB [AR2,P#74.0]



      L     #index
      L     1
      +I    
      T     #index
      L     #Anzahl_Bytes
      >I    
      SPB   out


      L     8
      +AR1  
      +AR2  
      SPA   doM

//====================================================================================================

out:  NOP   0



//Zurückretten
      L     #t_ar1
      LAR1  
      L     #t_ar2
      LAR2

IN:
Adr_Typ = Byte
xyz_Adr = Pointer
DB_NR = Block_BD
Anzahl_Bytes = Int

STAT:
Wert1 (74.0)
Wert2 ...
... ...

TEMP:
t_ar1 = DWord
t_ar2 = DWord
index = Word
 
Zurück
Oben