Subversion Repositories factorylink.iso-tp4

Rev

Blame | Last modification | View Log | Download

FUNCTION_BLOCK FB 10
TITLE = FactoryLink H1 Encode
KNOW_HOW_PROTECT
AUTHOR : DLink
FAMILY : S7_H1
NAME   : ENCODE
VERSION: 1.0

VAR_INPUT
  S5          : BOOL;                  // Trigger to start a WRITE operation
END_VAR

VAR
  Recv_Buf    : STRUCT                 // Receive buffer for a partners "Write" Reply
   Dest       : BYTE;                  // Destination
   Dtype      : BYTE;                  // Destination type
   DBno       : BYTE;                  // DB number
   Address    : BYTE;                  // Address (0 - 255)
   Bit        : BYTE;                  // Bit number
   Change     : BYTE;                  // Change marker
   V_low      : WORD;                  // Value low part
   V_high     : WORD;                  // Value high part
   Reserved   : DWORD;
  END_STRUCT;  
END_VAR

VAR_TEMP
  Dest_Ptr    : ANY;                   // Pointer to the internal data buf with user data
  Adr         : DWORD;
  I_double    : DWORD;
  I_bit       : BOOL;
  I_byte      : BYTE;
  EN_STATUS   : BOOL;                  // Used only for EN, ENO operation
  Int_Var     : INT;                   // Temporary integer value
  Offset      : INT;
END_VAR


BEGIN
NETWORK
TITLE =

      SET   ; 
      SAVE  ; 
      =     #EN_STATUS;                // Save if any uses the EN, ENO status
      SET   ;                          // Make sure all info bits are zero
//
// Check if there is something to do      
//
      L     #Recv_Buf.Change;
      L     0;
      ==I   ;
      JC    RDY;
      T     #Recv_Buf.Change;
//
// Evaluate encode write
//

      L     #Recv_Buf.Address;
      T     #Offset;
//
// Evaluate destination type
//
      L     77;                        // Flag byte destination
      L     #Recv_Buf.Dest;
      <>I   ;
      JC    D_DB;
      L     DW#16#8300_0000;           // Initialise address register
      T     #Adr;
      JU    CONT;
D_DB: L     68;                        // DB destination
      <>I   ;
      JC    D_QB;
      L     #Recv_Buf.DBno;
      T     #Int_Var;
      OPN   DB[#Int_Var];              // DB is now open
      L     DW#16#8400_0000;           // Initialise address register
      T     #Adr;
      AN    #S5;
      JC    CONT;
      L     #Offset;
      SLW   1;
      T     #Offset;
      L     82;                        // Data byte right type
      L     #Recv_Buf.Dtype;
      <>I   ;
      JC    LEFT;
      L     #Offset;
      L     +1;
      +I    ;
      T     #Offset;
      L     #Recv_Buf.V_low;
      SLW   8;
      T     #Recv_Buf.V_low;
      L     66;                        // Data byte changed to type byte
      T     #Recv_Buf.Dtype;
      JU    CONT;
LEFT: L     76;                        // Data type byte left
      <>I   ;
      JC    BIT;                       // Evaluate if type is bit
      L     66;                        // Data byte changed to type byte
      T     #Recv_Buf.Dtype;
      JU    CONT;
BIT:  L     70;                        // Data byte right type
      L     #Recv_Buf.Dtype;
      <>I   ;
      JC    CONT;                      // No specials for S5
      L     #Recv_Buf.Bit;  
      L     8;                         // Check bit number
      <I    ;
      JC    ADD;
      -I    ;
      T     #Recv_Buf.Bit;             // Set bit number within byte
      JU    CONT;
ADD:  L     #Offset;
      L     +1;
      +I    ;
      T     #Offset;
      JU    CONT;
D_QB: L     65;                        // Ouput destination
      L     #Recv_Buf.Dest;
      <>I   ;
      JC    D_IB;
      L     DW#16#8200_0000;           // Initialise address register
      T     #Adr;
      JU    CONT;
D_IB: L     69;                        // Input destination
      <>I   ;
      JC    ERR;
      L     DW#16#8100_0000;           // Initialise address register
      T     #Adr;
      JU    CONT;
ERR:  NOP   0;
      JU    RDY;
CONT: L     #Offset;                   // Add address
      SLW   3;
      T     LW    12;
      L     #Adr;
      LAR1  ;
//
// Evaluate destination type
//
      L     70;                        // Flag type
      L     #Recv_Buf.Dtype;
      <>I   ;
      JC    T_B;
      L     7;
      L     #Recv_Buf.Bit;  
      <I    ;
      JC    ERR;
      L     #Adr;
      +D    ;
      T     #Adr;
      LAR1  ;
      L     #Recv_Buf.V_low;
      L     0;
      <>I   ;      
      =     [AR1,P#0.0];
      JU    RDY;
T_B:  L     66;                        // Byte type
      <>I   ;
      JC    T_W;
      L     #Recv_Buf.V_low;
      SRW   8;
      T     B[AR1,P#0.0];
      JU    RDY;
T_W:  L     87;                        // Word type
      L     #Recv_Buf.Dtype;
      <>I   ;
      JC    T_D;
      L     #Recv_Buf.V_low;
      T     W[AR1,P#0.0];
      JU    RDY;
T_D:  L     68;                        // Double type
      <>I   ;
      JC    RDY;
      L     #Recv_Buf.V_low;
      T     LW    14;
      L     #Recv_Buf.V_high;
      T     LW    16;
      L     #I_double;
      T     D[AR1,P#0.0];
RDY:  CLR   ;                          // restore the EN status to ENO  
      A     #EN_STATUS; 
      SAVE  ; 
END_FUNCTION_BLOCK