Any Übergeben an FB

xvitali

Level-2
Beiträge
28
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein FB Baustein geschrieben der durch SFC14 Daten einlesen soll von KEB Umrichter Aber er will nicht funktionieren! Vielleicht sieht einer den Fehler auf Anhieb.
Code:
FUNCTION_BLOCK FB 122
TITLE =
VERSION : 0.1
VAR_INPUT
  NR_ACHS_DB : INT ;    //Achs-DB
  AchsDB : BLOCK_DB ;    
  LADDR : INT ;    //Übergabe-Adresse
  WR_PZD : ANY ;    //Any-Zeiger auf zu schreibende Prozessdaten
  RD_PZD : ANY ;    //Any-Zeiger auf zu lesende Prozessdaten
  Reset : BOOL ;    
END_VAR
END_VAR
VAR
  Sy50 : STRUCT     
   END_STRUCT ;    
  Sy41 : STRUCT     
  END_STRUCT ;    
 END_VAR
VAR_TEMP
  wrz : ANY ;    //Anyzeiger Write Prozessdaten
  rdz : ANY ;    //Anyzeiger Read Prozessdaten
  hexadr : WORD ;    //E/A Anfangsadresse Parameterdaten
  hexadr2 : WORD ;    //E/A Anfangsadresse Prozessdaten
  hilf_zsw : BYTE ;    
  fill : BYTE ;    
END_VAR
BEGIN
NETWORK
TITLE =berechnung LADDR

      L     #LADDR; // EA-Adresse  int-Format 
      T     #hexadr; // daten im hexformat
NETWORK
TITLE =
      TAR1  ; 
      T     #ar1; // AR1 retten
      TAR2  ; 
      T     #ar2; // AR2 retten

      LAR1  P##rdz; 
      L     W#16#1002; // type byte
      T     LW [AR1,P#0.0]; 
      L     8; // Anzahl Bytes
      T     LW [AR1,P#2.0]; 
      L     DINO; // Quell-DB NR
      T     LW [AR1,P#4.0]; 
      L     P##RD_PZD; // Anfang der Quelle
      TAR2  ; // Ar2 in Akku -AdressOffset Multiinstanz
      UD    DW#16#FFFFFF; // Bereichscodierung ausblenden
      +D    ; // Offset dazuaddieren
      T     LD [AR1,P#6.0]; 
      LAR2  #ar2; // Adressregister wiederherstellen
      LAR1  #ar1; 

      CALL "DPRD_DAT" (
           LADDR                    := #hexadr,
           RET_VAL                  := #ret1,
           RECORD                   := #rdz);
 END_FUNCTION_BLOCK
 
@André
Was soll das genau werden?

@xvitali
Das hab ich bei irgendwem im Forum abgeschrieben:

Code:
      TAR2  #AR2BACKUP
      L     P##inany
      LAR2  
      L     #AR2BACKUP
      +AR2  
      L     P##tempany
      LAR1  
      L     D [AR2,P#0.0]
      T     D [AR1,P#0.0]
      L     D [AR2,P#4.0]
      T     D [AR1,P#4.0]
      L     W [AR2,P#8.0]
      T     W [AR1,P#8.0]
      LAR2  #AR2BACKUP

Sollte so gehen, zum Umräumen der Any!
Ansonsten siehe 4L.
 
erst lesen...

vor dem Antworten erst richtig durchlesen... Hab übersehen dass der Empfangsbereich durchgereicht werden soll und dachte er will direkt in TEMP reinschreiben.

André
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke
hir das ganze programm WR_PZD funktioniert aber RD_PZD nicht

Code:
FUNCTION_BLOCK FB 122
TITLE =
VERSION : 0.1
VAR_INPUT
  NR_ACHS_DB : INT ;    //Achs-DB
  LADDR : INT ;        //Übergabe-Adresse
  WR_PZD : ANY ;    //Any-Zeiger auf zu schreibende Prozessdaten
  RD_PZD : ANY ;    //Any-Zeiger auf zu lesende Prozessdaten
 END_VAR
VAR_OUTPUT
  FehlerNr : INT ;    
  RegFr : BOOL ;    
END_VAR
VAR_TEMP
  wrz : ANY ;    //Anyzeiger Write Prozessdaten
  rdz : ANY ;    //Anyzeiger Read Prozessdaten
  ar2 : DINT ;    //gesichertes Ar2
  ar1 : DINT ;    //gesichertes Ar1
  hexadr : WORD ;    //E/A Anfangsadresse Parameterdaten
  ret1 : INT ;    //Returnvalue SFC
  dbnr : INT ;    //Achs DB Nr.
 END_VAR
BEGIN
NETWORK
TITLE =berechnung LADDR

      L     #LADDR; // EA-Adresse  int-Format 
      T     #hexadr; // daten im hexformat

NETWORK
TITLE =
      TAR1  ; 
      T     #ar1; // AR1 retten
      TAR2  ; 
      T     #ar2; // AR2 retten

      LAR1  P##rdz; 
      L     W#16#1002; // type byte
      T     LW [AR1,P#0.0]; 
      L     8; // Anzahl Bytes
      T     LW [AR1,P#2.0]; 
      L     DINO; // Quell-DB NR
      T     LW [AR1,P#4.0]; 
      L     P##RD_PZD; // Anfang der Quelle
      TAR2  ; // Ar2 in Akku -AdressOffset Multiinstanz
      UD    DW#16#FFFFFF; // Bereichscodierung ausblenden
      +D    ; // Offset dazuaddieren
      T     LD [AR1,P#6.0]; 
      LAR2  #ar2; // Adressregister wiederherstellen
      LAR1  #ar1; 

      CALL "DPRD_DAT" (
           LADDR                    := #hexadr,
           RET_VAL                  := #ret1,
           RECORD                   := #rdz);
NETWORK
TITLE =

      TAR1  ; 
      T     #ar1; // AR1 retten
      TAR2  ; 
      T     #ar2; // AR2 retten

      UD    DW#16#FFFFFF; // Bereichscodierung ausblenden
      L     P##WR_PZD; // Adresse input any in Akku
      +D    ; // akku zum ar2 addieren
      LAR2  ; // Ar2 mit akku1 laden
      LAR1  P##wrz; // Adresse temp any in Ar1
      L     4; // 2 Schleifendurchläufe
loop: L     W [AR2,P#0.0]; // 8 Byte übertragen
      T     LW [AR1,P#0.0]; // Any übergeben
      +AR1  P#2.0; // ar1 um 4 Byte erhöhen
      +AR2  P#2.0; // ar2 um 4 Byte erhöhen
      TAK   ; 
      LOOP  loop; 
      LAR2  #ar2; // Adressregister wiederherstellen
      LAR1  #ar1; 

      CALL "DPWR_DAT" (
           LADDR                    := #hexadr,
           RECORD                   := #wrz,
           RET_VAL                  := #ret1);
 END_FUNCTION_BLOCK
Ich habe mehrere KEB Module und will über SFC14 und SFC15 Daten Lesen und Schreiben

Code:
      CALL  #KEB_M1
       NR_ACHS_DB   :=122
       LADDR            :=324
       WR_PZD         :="KEB_DB".Mot4.WR_PZD
       RD_PZD          :="KEB_DB".Mot4.RD_PZD
 
Danke, Danke,
sieht mir alles etwas suspekt aus. Was willst du mit DINO im Pointer für die SFC14?
Ja das Stimmt ist äußerst suspekt.

Jetzt sehe ich meine Fehler. Habe den Baustein abgeändert und so funktioniert es

Code:
FUNCTION_BLOCK FB 122
TITLE =
VERSION : 0.1

VAR_INPUT
  LADDR : INT ;     //Übergabe-Adresse
  WR_PZD : ANY ;    //Any-Zeiger auf zu schreibende Prozessdaten
  RD_PZD : ANY ;    //Any-Zeiger auf zu lesende Prozessdaten
END_VAR
VAR_TEMP
  wrz : ANY ;    //Anyzeiger Write Prozessdaten
  rdz : ANY ;    //Anyzeiger Read Prozessdaten
  hexadr : WORD ;    //E/A Anfangsadresse Parameterdaten
  ret1 : INT ;    //Returnvalue SFC
  ar2 : DINT ;    //gesichertes Ar2
  ar1 : DINT ;    //gesichertes Ar1
END_VAR
BEGIN
NETWORK
TITLE =berechnung LADDR

      L     #LADDR; // EA-Adresse  int-Format 
      T     #hexadr; // daten im hexformat
NETWORK
TITLE =

// AR2 retten
      TAR1  ; 
      T     #ar1; // AR1 retten
      TAR2  ; 
      T     #ar2; // AR2 retten
      L     P##WR_PZD; // Anfang der Quelle
      TAR2  ; // Ar2 in Akku -AdressOffset Multiinstanz
      UD    DW#16#FFFFFF; // Bereichscodierung ausblenden
      +D    ; // Offset dazuaddieren
      LAR1  ; 
      L     W [AR1,P#0.0]; // type 
      T     LW     0; 
      L     W [AR1,P#2.0]; // Anzahl Bytes
      T     LW     2; 
      L     W [AR1,P#4.0]; // Quell-DB NR
      T     LW     4; 
      L     D [AR1,P#6.0]; // Anfang der Quelle
      T     LD     6; 
      LAR2  #ar2; // Adressregister wiederherstellen
      LAR1  #ar1; 

      CALL "DPWR_DAT" (
           LADDR                    := #hexadr,
           RECORD                   := #wrz,
           RET_VAL                  := #ret1);
NETWORK
TITLE =
      TAR1  ; 
      T     #ar1;             // AR1 retten
      TAR2  ; 
      T     #ar2;             // AR2 retten
      L     P##RD_PZD;        // Anfang der Quelle
      TAR2  ;                 // Ar2 in Akku -AdressOffset Multiinstanz
      UD    DW#16#FFFFFF;    // Bereichscodierung ausblenden
      +D    ;                 // Offset dazuaddieren
      LAR1  ; 
      L     W [AR1,P#0.0]; // type byte
      T     LW    10; 
      L     W [AR1,P#2.0]; // Anzahl Bytes
      T     LW    12; 
      L     W [AR1,P#4.0]; // Quell-DB NR
      T     LW    14; 
      L     D [AR1,P#6.0]; // Anfang der Quelle
      T     LD    16; 
      LAR2  #ar2;            // Adressregister wiederherstellen
      LAR1  #ar1; 

      CALL "DPRD_DAT" (
           LADDR                    := #hexadr,
           RET_VAL                  := #ret1,
           RECORD                   := #rdz);

NETWORK
TITLE =
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@xvitali

Was ich nicht so schön finde, ist die Benutztung von LW...
Wenn du da bei Temp mal was einfügst, mußt du das nacheditieren. Die Nutzung des AR2 in dem Code meines 1. Beitrages ist da ok.
Bereichscodierung ausblenden, muß das eigentlich sein, wenn man doch die Adresse des Any komplett auf die Temp übertragen will?
 
Zurück
Oben