Put/Get SFB14/SFB15 in FB verwenden: Adr_1 und RD_1 als Parameter übergeben

Aksels

Level-2
Beiträge
257
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Liebe Mitleser,

ich möchte (für eine S7-400) mir einen Get und einen Put Funktionsbaustein bauen, den ich Multiinstanz-mäßig aufrufen kann und komplett von Außen beschicke, nicht so wie das Siemens Beispiel, bei dem man Adr_1 und RD_1 im Baustein ändern muss und dem Get direkt einen DB zuordnet.
Ich bekomme aber die Adressen/Pointer nicht von Extern rein.

Ich lege eine IN/OUT Variable im FB vom Typ ANY mit dem Namen Adr1 an und lege diese mit #Adr1 an den Sfb14 Get Baustein und bekomme die Meldung: "Unzulässige Parameter-Versorgung für Addr_1".

Irgendwas verstehe ich hier nicht.

Gruß,
Aksels
 
Hallo,
Pointer können nicht "durchgereicht" werden ...

Du mußt dir in deinem Baustein im TEMP-Bereich einen ANY anlegen und den Inhalt des IN-Any's auf diesen draufkopieren. Den TEMP-Any kannst du nun weiterverwenden ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Verrückt!

Ok, das wusste ich nicht.
Und wie kopiere ich Pointer?
Suche ergab nur, wie ich mit SFB20 die Daten, auf die der Pointer zeigt kopiere. Das meinst Du ja aber nicht, richtig?

Mit
L P##I_Adr
T #T_Adr

gehts schonmal nicht.....

Gruß,
Aksels
 
Es geht weiter:

Ok, vielen Dank.
Ich habe mir die Pointer angelesen.
Meine beiden Bausteine sind umgestellt.
Sie funktionieren aber leider nur beim ersten Aufruf.
Der zweite geht schief. Es kommt aus dem Senden- und dem Empfangenbaustein immer ein Error raus.
Die DatenPointer habe ich schon mehrfach überprüft. Sie stimmen. Im alten Programm liefen sie ja auch.

Wär mal jemand so nett drüberzuschauen?

Vielleicht ist es ja ein offensichtlicher Fehler?


Gruß,
Aksels

Code:
FUNCTION_BLOCK "FB_S7Verb_Data_Get"
TITLE =
VERSION : 0.1
 
VAR_INPUT
  INIT_COM : BOOL ; 
  I_Adr : ANY ; 
  I_ID : WORD ; 
  I_Start : BOOL ; 
END_VAR
VAR_OUTPUT
  O_NDR : BOOL ; 
  O_Error : BOOL ; 
END_VAR
VAR
  PLC1_COM : STRUCT  
   GET_REQ : BOOL ; 
   GET_BUSY : BOOL ; 
   GET_NDR : BOOL ; 
   GET_ERROR : BOOL ; 
   GET_COM_START : BOOL ; //Pos flank
   GET_STATUS : WORD ; 
   GET_STAT_SAVE : WORD ; 
  END_STRUCT ; 
  S_Fl_1 : BOOL ; 
  STAT1 : BOOL ; 
  S_Get_1 : "GET"; 
END_VAR
VAR_TEMP
  T_Adr : ANY ; 
END_VAR
BEGIN
NETWORK
TITLE =
      L     P##I_Adr; 
      LAR1  ; 
      L     W [AR1,P#0.0]; 
      T     LW     0; 
      L     W [AR1,P#2.0]; 
      T     LW     2; 
      L     W [AR1,P#4.0]; 
      T     LW     4; 
      L     D [AR1,P#6.0]; 
      T     LD     6; 
NETWORK
TITLE =Clear GET request to start initial communication
      U     #INIT_COM; 
      R     #PLC1_COM.GET_REQ; 
NETWORK
TITLE =Invoke GET function
      U     #PLC1_COM.GET_REQ; 
      =     L     10.0; 
      BLD   103; 
      CALL #S_Get_1 (
           REQ                      := L     10.0,
           ID                       := #I_ID,
           NDR                      := #PLC1_COM.GET_NDR,
           ERROR                    := #PLC1_COM.GET_ERROR,
           STATUS                   := #PLC1_COM.GET_STATUS,
           ADDR_1                   := #T_Adr,
           RD_1                     := #T_Adr);
      NOP   0; 
NETWORK
TITLE =M_Kom_Dosier_Stoer_Kein
//Start GET function with the rising edge of the clock marker if the GET function 
//is not busy
//The REQ input parameter of the GET function is triggered with a rising edge as 
//long as the GET function is not completed!
//
      U     #I_Start; 
      FP    #S_Fl_1; 
      S     #PLC1_COM.GET_REQ; 
      U(    ; 
      O     #PLC1_COM.GET_ERROR; 
      O     #PLC1_COM.GET_NDR; 
      )     ; 
      R     #PLC1_COM.GET_REQ; 
      NOP   0; 
NETWORK
TITLE =Evaluate STATUS information of the GET function
//If ERROR occured then save STATUS!
//
      U     #PLC1_COM.GET_ERROR; 
      SPBNB _001; 
      L     #PLC1_COM.GET_STATUS; 
      T     #PLC1_COM.GET_STAT_SAVE; 
_001: NOP   0; 
NETWORK
TITLE =
      U     #PLC1_COM.GET_NDR; 
      =     #O_NDR; 
NETWORK
TITLE =
      U     #PLC1_COM.GET_ERROR; 
      =     #O_Error; 
END_FUNCTION_BLOCK
FUNCTION_BLOCK "FB_S7Verb_Data_Put"
TITLE =
VERSION : 0.1
 
VAR_INPUT
  INIT_COM : BOOL ; 
  I_Adr : ANY ; 
  I_ID : WORD ; 
  I_Start : BOOL ; 
END_VAR
VAR_OUTPUT
  O_NDR : BOOL ; 
  O_Error : BOOL ; 
END_VAR
VAR
  PLC1_COM : STRUCT  
   PUT_REQ : BOOL ; 
   PUT_BUSY : BOOL ; 
   PUT_DONE : BOOL ; 
   PUT_ERROR : BOOL ; 
   PUT_COM_START : BOOL ; 
   PUT_STATUS : WORD ; 
   PUT_STAT_SAVE : WORD ; 
  END_STRUCT ; 
  S_Fl_1 : BOOL ; 
  S_Put_1 : "PUT"; 
END_VAR
VAR_TEMP
  T_Adr : ANY ; 
END_VAR
BEGIN
NETWORK
TITLE =
 
      L     P##I_Adr; 
      LAR1  ; 
      L     W [AR1,P#0.0]; 
      T     LW     0; 
      L     W [AR1,P#2.0]; 
      T     LW     2; 
      L     W [AR1,P#4.0]; 
      T     LW     4; 
      L     D [AR1,P#6.0]; 
      T     LD     6; 
NETWORK
TITLE =Clear PUT request to start initial communication
      U     #INIT_COM; 
      R     #PLC1_COM.PUT_REQ; 
NETWORK
TITLE =Invoke PUT function
      U     #PLC1_COM.PUT_REQ; 
      =     L     10.0; 
      BLD   103; 
      CALL #S_Put_1 (
           REQ                      := L     10.0,
           ID                       := #I_ID,
           DONE                     := #PLC1_COM.PUT_DONE,
           ERROR                    := #PLC1_COM.PUT_ERROR,
           STATUS                   := #PLC1_COM.PUT_STATUS,
           ADDR_1                   := #T_Adr,
           SD_1                     := #T_Adr);
      NOP   0; 
NETWORK
TITLE =
//Start PUT function with the rising edge of the clock marker if the PUT function 
//is not busy.
//The REQ input parameter of the PUT function is triggered with a rising edge as 
//long as the PUT function is not completed!
//
      U     #I_Start; 
      FP    #S_Fl_1; 
      S     #PLC1_COM.PUT_REQ; 
      U(    ; 
      O     #PLC1_COM.PUT_ERROR; 
      O     #PLC1_COM.PUT_DONE; 
      )     ; 
      R     #PLC1_COM.PUT_REQ; 
      NOP   0; 
NETWORK
TITLE =Evaluate STATUS information of the PUT function
//If ERROR occured then save STATUS!
      U     #PLC1_COM.PUT_ERROR; 
      SPBNB _001; 
      L     #PLC1_COM.PUT_STATUS; 
      T     #PLC1_COM.PUT_STAT_SAVE; 
_001: NOP   0; 
NETWORK
TITLE =
      U     #PLC1_COM.PUT_DONE; 
      =     #O_NDR; 
NETWORK
TITLE =
      U     #PLC1_COM.PUT_ERROR; 
      =     #O_Error; 
END_FUNCTION_BLOCK
FUNCTION_BLOCK "FB_Com"
TITLE =
VERSION : 0.1
 
VAR
  S_Get_PuWe : "FB_S7Verb_Data_Get"; 
  S_Put_PuWe : "FB_S7Verb_Data_Put"; 
  S_Get_Dosier : "FB_S7Verb_Data_Get"; 
  S_Put_Dosier : "FB_S7Verb_Data_Put"; 
  S_Zae : INT ; 
END_VAR
VAR_TEMP
  T_NDR : BOOL ; 
  T_Error : BOOL ; 
END_VAR
BEGIN
NETWORK
TITLE =
NETWORK
TITLE =
      U     "M_Com_Restart"; 
      =     L      1.0; 
      BLD   103; 
      U(    ; 
      L     #S_Zae; 
      L     0; 
      ==I   ; 
      )     ; 
      UN    "E_Quitt_Opt"; 
      =     L      1.1; 
      BLD   103; 
      CALL #S_Get_PuWe (
           INIT_COM                 := L      1.0,
           I_Adr                    := P#DB203.DBX0.0 BYTE 38,
           I_ID                     := W#16#1,
           I_Start                  := L      1.1,
           O_NDR                    := #T_NDR,
           O_Error                  := #T_Error);
      NOP   0; 
NETWORK
TITLE =
      U(    ; 
      O     #T_NDR; 
      O     #T_Error; 
      )     ; 
      U(    ; 
      L     #S_Zae; 
      L     0; 
      ==I   ; 
      )     ; 
      SPBNB _001; 
      L     #S_Zae; 
      L     1; 
      +I    ; 
      T     #S_Zae; 
_001: NOP   0; 
NETWORK
TITLE =
      U     "M_Com_Restart"; 
      =     L      1.0; 
      BLD   103; 
      U(    ; 
      L     #S_Zae; 
      L     1; 
      ==I   ; 
      )     ; 
      UN    "E_Quitt_Opt"; 
      =     L      1.1; 
      BLD   103; 
      CALL #S_Put_PuWe (
           INIT_COM                 := L      1.0,
           I_Adr                    := P#DB202.DBX0.0 BYTE 18,
           I_ID                     := W#16#1,
           I_Start                  := L      1.1,
           O_NDR                    := #T_NDR,
           O_Error                  := #T_Error);
      NOP   0; 
NETWORK
TITLE =
      U(    ; 
      O     #T_NDR; 
      O     #T_Error; 
      )     ; 
      U(    ; 
      L     #S_Zae; 
      L     1; 
      ==I   ; 
      )     ; 
      SPBNB _002; 
      L     #S_Zae; 
      L     3; 
      +I    ; 
      T     #S_Zae; 
_002: NOP   0; 
NETWORK
TITLE =
      U     "M_Com_Restart"; 
      =     L      1.0; 
      BLD   103; 
      U(    ; 
      L     #S_Zae; 
      L     2; 
      ==I   ; 
      )     ; 
      UN    "E_Quitt_Opt"; 
      =     L      1.1; 
      BLD   103; 
      CALL #S_Get_Dosier (
           INIT_COM                 := L      1.0,
           I_Adr                    := P#DB205.DBX0.0 BYTE 20,
           I_ID                     := W#16#2,
           I_Start                  := L      1.1,
           O_NDR                    := #T_NDR,
           O_Error                  := #T_Error);
      NOP   0; 
NETWORK
TITLE =
      U(    ; 
      O     #T_NDR; 
      O     #T_Error; 
      )     ; 
      U(    ; 
      L     #S_Zae; 
      L     2; 
      ==I   ; 
      )     ; 
      SPBNB _003; 
      L     #S_Zae; 
      L     1; 
      +I    ; 
      T     #S_Zae; 
_003: NOP   0; 
NETWORK
TITLE =
      U     "M_Com_Restart"; 
      =     L      1.0; 
      BLD   103; 
      U(    ; 
      L     #S_Zae; 
      L     3; 
      ==I   ; 
      )     ; 
      UN    "E_Quitt_Opt"; 
      =     L      1.1; 
      BLD   103; 
      CALL #S_Put_Dosier (
           INIT_COM                 := L      1.0,
           I_Adr                    := "DB_Senden_Dosierung".DB_Phosphat,
           I_ID                     := W#16#2,
           I_Start                  := L      1.1,
           O_NDR                    := #T_NDR,
           O_Error                  := #T_Error);
      NOP   0; 
NETWORK
TITLE =
      U(    ; 
      O     #T_NDR; 
      O     #T_Error; 
      )     ; 
      U(    ; 
      L     #S_Zae; 
      L     3; 
      ==I   ; 
      )     ; 
      SPBNB _004; 
      L     #S_Zae; 
      L     1; 
      +I    ; 
      T     #S_Zae; 
_004: NOP   0; 
NETWORK
TITLE =
      U(    ; 
      O(    ; 
      L     #S_Zae; 
      L     3; 
      >I    ; 
      )     ; 
      O     "M_Com_Restart"; 
      O     "E_Quitt_Opt"; 
      )     ; 
      SPBNB _005; 
      L     0; 
      T     #S_Zae; 
_005: NOP   0; 
NETWORK
TITLE =
      U     "M_Com_Restart"; 
      R     "M_Com_Restart"; 
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
was heißt "beim ersten Aufruf" ?

Ist dieser Baustein wieder als Instanz in einen anderen FB eingelagert ?
Oder rufst du ihn mit gleichem I-DB nochmals auf ?
 
So:

Hier der Aufruf. Der erste Put und der erste Get gehen. Die beiden zweiten nicht.
Die beiden Zweiten geben immer Error true aus.

Wenn ich mir das so überlege..... kann das mit AR2 zu tun haben?

Gruß,
Aksels

Code:
FUNCTION_BLOCK "FB_Com"
TITLE =
VERSION : 0.1


VAR
  S_Get_PuWe : "FB_S7Verb_Data_Get";    
  S_Put_PuWe : "FB_S7Verb_Data_Put";    
  S_Get_Dosier : "FB_S7Verb_Data_Get";    
  S_Put_Dosier : "FB_S7Verb_Data_Put";    
  S_Zae : INT ;    
END_VAR
VAR_TEMP
  T_NDR : BOOL ;    
  T_Error : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =

NETWORK
TITLE =

      U     "M_Com_Restart"; 
      =     L      1.0; 
      BLD   103; 
      U(    ; 
      L     #S_Zae; 
      L     0; 
      ==I   ; 
      )     ; 
      UN    "E_Quitt_Opt"; 
      =     L      1.1; 
      BLD   103; 
      CALL #S_Get_PuWe (
           INIT_COM                 := L      1.0,
           I_Adr                    := P#DB203.DBX0.0 BYTE 38,
           I_ID                     := W#16#1,
           I_Start                  := L      1.1,
           O_NDR                    := #T_NDR,
           O_Error                  := #T_Error);
      NOP   0; 
NETWORK
TITLE =

      U(    ; 
      O     #T_NDR; 
      O     #T_Error; 
      )     ; 
      U(    ; 
      L     #S_Zae; 
      L     0; 
      ==I   ; 
      )     ; 
      SPBNB _001; 
      L     #S_Zae; 
      L     1; 
      +I    ; 
      T     #S_Zae; 
_001: NOP   0; 
NETWORK
TITLE =

      U     "M_Com_Restart"; 
      =     L      1.0; 
      BLD   103; 
      U(    ; 
      L     #S_Zae; 
      L     1; 
      ==I   ; 
      )     ; 
      UN    "E_Quitt_Opt"; 
      =     L      1.1; 
      BLD   103; 
      CALL #S_Put_PuWe (
           INIT_COM                 := L      1.0,
           I_Adr                    := P#DB202.DBX0.0 BYTE 18,
           I_ID                     := W#16#1,
           I_Start                  := L      1.1,
           O_NDR                    := #T_NDR,
           O_Error                  := #T_Error);
      NOP   0; 
NETWORK
TITLE =

      U(    ; 
      O     #T_NDR; 
      O     #T_Error; 
      )     ; 
      U(    ; 
      L     #S_Zae; 
      L     1; 
      ==I   ; 
      )     ; 
      SPBNB _002; 
      L     #S_Zae; 
      L     1; 
      +I    ; 
      T     #S_Zae; 
_002: NOP   0; 
NETWORK
TITLE =

      U     "M_Com_Restart"; 
      =     L      1.0; 
      BLD   103; 
      U(    ; 
      L     #S_Zae; 
      L     2; 
      ==I   ; 
      )     ; 
      UN    "E_Quitt_Opt"; 
      =     L      1.1; 
      BLD   103; 
      CALL #S_Get_Dosier (
           INIT_COM                 := L      1.0,
           I_Adr                    := P#DB205.DBX0.0 BYTE 20,
           I_ID                     := W#16#2,
           I_Start                  := L      1.1,
           O_NDR                    := #T_NDR,
           O_Error                  := #T_Error);
      NOP   0; 
NETWORK
TITLE =

      U(    ; 
      O     #T_NDR; 
      O     #T_Error; 
      )     ; 
      U(    ; 
      L     #S_Zae; 
      L     2; 
      ==I   ; 
      )     ; 
      SPBNB _003; 
      L     #S_Zae; 
      L     1; 
      +I    ; 
      T     #S_Zae; 
_003: NOP   0; 
NETWORK
TITLE =

      U     "M_Com_Restart"; 
      =     L      1.0; 
      BLD   103; 
      U(    ; 
      L     #S_Zae; 
      L     3; 
      ==I   ; 
      )     ; 
      UN    "E_Quitt_Opt"; 
      =     L      1.1; 
      BLD   103; 
      CALL #S_Put_Dosier (
           INIT_COM                 := L      1.0,
           I_Adr                    := "DB_Senden_Dosierung".DB_Phosphat,
           I_ID                     := W#16#2,
           I_Start                  := L      1.1,
           O_NDR                    := #T_NDR,
           O_Error                  := #T_Error);
      NOP   0; 
NETWORK
TITLE =

      U(    ; 
      O     #T_NDR; 
      O     #T_Error; 
      )     ; 
      U(    ; 
      L     #S_Zae; 
      L     3; 
      ==I   ; 
      )     ; 
      SPBNB _004; 
      L     #S_Zae; 
      L     1; 
      +I    ; 
      T     #S_Zae; 
_004: NOP   0; 
NETWORK
TITLE =

      U(    ; 
      O(    ; 
      L     #S_Zae; 
      L     3; 
      >I    ; 
      )     ; 
      O     "M_Com_Restart"; 
      O     "E_Quitt_Opt"; 
      )     ; 
      SPBNB _005; 
      L     0; 
      T     #S_Zae; 
_005: NOP   0; 
NETWORK
TITLE =

      U     "M_Com_Restart"; 
      R     "M_Com_Restart"; 
END_FUNCTION_BLOCK
 
Hallo,
ich habe das schon länger nicht mehr gemacht ... aber ich habe es so in Erinnerung, das immer nur ein PUT oder SEND in GLEICHZEITIG Aktion sein darf - gleiches würde dann auch für GET oder RECEIVE gelten.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe das schon länger nicht mehr gemacht ... aber ich habe es so in Erinnerung, das immer nur ein PUT oder SEND in GLEICHZEITIG Aktion sein darf - gleiches würde dann auch für GET oder RECEIVE gelten.

Gruß
Larry

Auf die Schnelle, ohne mir jetzt den obigen Code im Detail angesehen zu haben: Nutzt man zwei verschiedene Verbindungen (Verbindungs-IDs) dann sollten IMHO schon zwei gleichzeitige PUT (bzw. GET) möglich sein. Lasse mich aber gerne eines besseren belehren.

Gruß,
Flinn
 
Habs rausgefunden.

Danke an alle für's Mitdenken.

Es lag an AR2. Anbei der geänderte Code. Bitte weiterverwenden!
Es basiert auf dem Siemens Beispiel, kann nun aber mehrfach aufgerufen werden. Der Übertragene Baustein muss in beiden SPSen die gleiche Nummer haben.

Im FB_Com wird übrigens ein Zähler weitergezählt. Es ist also immer nur ein Baustein aktiv.

Code:
FUNCTION_BLOCK "FB_S7Verb_Data_Get"
TITLE =
VERSION : 0.1


VAR_INPUT
  INIT_COM : BOOL ;    
  I_Adr : ANY ;    
  I_ID : WORD ;    
  I_Start : BOOL ;    
END_VAR
VAR_OUTPUT
  O_NDR : BOOL ;    
  O_Error : BOOL ;    
END_VAR
VAR
  PLC1_COM : STRUCT     
   GET_REQ : BOOL ;    
   GET_BUSY : BOOL ;    
   GET_NDR : BOOL ;    
   GET_ERROR : BOOL ;    
   GET_COM_START : BOOL ;    //Pos flank
   GET_STATUS : WORD ;    
   GET_STAT_SAVE : WORD ;    
  END_STRUCT ;    
  S_Fl_1 : BOOL ;    
  STAT1 : BOOL ;    
  S_Get_1 : "GET";    
END_VAR
VAR_TEMP
  T_Adr : ANY ;    
END_VAR
BEGIN
NETWORK
TITLE =

      TAR2  ; 
      UD    DW#16#FFFFFF; 
      L     P##I_Adr; 
      +D    ; 
      LAR1  ; 


      L     W [AR1,P#0.0]; 
      T     LW     0; 

      L     W [AR1,P#2.0]; 
      T     LW     2; 

      L     W [AR1,P#4.0]; 
      T     LW     4; 

      L     D [AR1,P#6.0]; 
      T     LD     6; 

NETWORK
TITLE =Clear GET request to start initial communication

      U     #INIT_COM; 
      R     #PLC1_COM.GET_REQ; 
NETWORK
TITLE =Invoke GET function

      U     #PLC1_COM.GET_REQ; 
      =     L     10.0; 
      BLD   103; 
      CALL #S_Get_1 (
           REQ                      := L     10.0,
           ID                       := #I_ID,
           NDR                      := #PLC1_COM.GET_NDR,
           ERROR                    := #PLC1_COM.GET_ERROR,
           STATUS                   := #PLC1_COM.GET_STATUS,
           ADDR_1                   := #T_Adr,
           RD_1                     := #T_Adr);

      NOP   0; 
NETWORK
TITLE =M_Kom_Dosier_Stoer_Kein
//Start GET function with the rising edge of the clock marker if the GET function 
//is not busy
//The REQ input parameter of the GET function is triggered with a rising edge as 
//long as the GET function is not completed!
//
      U     #I_Start; 
      FP    #S_Fl_1; 
      S     #PLC1_COM.GET_REQ; 
      U(    ; 
      O     #PLC1_COM.GET_ERROR; 
      O     #PLC1_COM.GET_NDR; 
      )     ; 
      R     #PLC1_COM.GET_REQ; 
      NOP   0; 
NETWORK
TITLE =Evaluate STATUS information of the GET function
//If ERROR occured then save STATUS!
//
      U     #PLC1_COM.GET_ERROR; 
      SPBNB _001; 
      L     #PLC1_COM.GET_STATUS; 
      T     #PLC1_COM.GET_STAT_SAVE; 
_001: NOP   0; 
NETWORK
TITLE =

      U     #PLC1_COM.GET_NDR; 
      =     #O_NDR; 
NETWORK
TITLE =

      U     #PLC1_COM.GET_ERROR; 
      =     #O_Error; 
END_FUNCTION_BLOCK




FUNCTION_BLOCK "FB_S7Verb_Data_Put"
TITLE =
VERSION : 0.1


VAR_INPUT
  INIT_COM : BOOL ;    
  I_Adr : ANY ;    
  I_ID : WORD ;    
  I_Start : BOOL ;    
END_VAR
VAR_OUTPUT
  O_NDR : BOOL ;    
  O_Error : BOOL ;    
END_VAR
VAR
  PLC1_COM : STRUCT     
   PUT_REQ : BOOL ;    
   PUT_BUSY : BOOL ;    
   PUT_DONE : BOOL ;    
   PUT_ERROR : BOOL ;    
   PUT_COM_START : BOOL ;    
   PUT_STATUS : WORD ;    
   PUT_STAT_SAVE : WORD ;    
  END_STRUCT ;    
  S_Fl_1 : BOOL ;    
  S_Put_1 : "PUT";    
END_VAR
VAR_TEMP
  T_Adr : ANY ;    
END_VAR
BEGIN
NETWORK
TITLE =

      TAR2  ; 
      UD    DW#16#FFFFFF; 
      L     P##I_Adr; 
      +D    ; 
      LAR1  ; 

      L     W [AR1,P#0.0]; 
      T     LW     0; 

      L     W [AR1,P#2.0]; 
      T     LW     2; 

      L     W [AR1,P#4.0]; 
      T     LW     4; 

      L     D [AR1,P#6.0]; 
      T     LD     6; 




NETWORK
TITLE =Clear PUT request to start initial communication

      U     #INIT_COM; 
      R     #PLC1_COM.PUT_REQ; 
NETWORK
TITLE =Invoke PUT function

      U     #PLC1_COM.PUT_REQ; 
      =     L     10.0; 
      BLD   103; 
      CALL #S_Put_1 (
           REQ                      := L     10.0,
           ID                       := #I_ID,
           DONE                     := #PLC1_COM.PUT_DONE,
           ERROR                    := #PLC1_COM.PUT_ERROR,
           STATUS                   := #PLC1_COM.PUT_STATUS,
           ADDR_1                   := #T_Adr,
           SD_1                     := #T_Adr);

      NOP   0; 
NETWORK
TITLE =
//Start PUT function with the rising edge of the clock marker if the PUT function 
//is not busy.
//The REQ input parameter of the PUT function is triggered with a rising edge as 
//long as the PUT function is not completed!
//
      U     #I_Start; 
      FP    #S_Fl_1; 
      S     #PLC1_COM.PUT_REQ; 
      U(    ; 
      O     #PLC1_COM.PUT_ERROR; 
      O     #PLC1_COM.PUT_DONE; 
      )     ; 
      R     #PLC1_COM.PUT_REQ; 
      NOP   0; 
NETWORK
TITLE =Evaluate STATUS information of the PUT function
//If ERROR occured then save STATUS!
      U     #PLC1_COM.PUT_ERROR; 
      SPBNB _001; 
      L     #PLC1_COM.PUT_STATUS; 
      T     #PLC1_COM.PUT_STAT_SAVE; 
_001: NOP   0; 
NETWORK
TITLE =

      U     #PLC1_COM.PUT_DONE; 
      =     #O_NDR; 
NETWORK
TITLE =

      U     #PLC1_COM.PUT_ERROR; 
      =     #O_Error; 
END_FUNCTION_BLOCK
 
Zurück
Oben