Blame | Last modification | View Log | Download
FUNCTION_BLOCK FB 10TITLE = FactoryLink H1 EncodeKNOW_HOW_PROTECTAUTHOR : DLinkFAMILY : S7_H1NAME : ENCODEVERSION: 1.0VAR_INPUTS5 : BOOL; // Trigger to start a WRITE operationEND_VARVARRecv_Buf : STRUCT // Receive buffer for a partners "Write" ReplyDest : BYTE; // DestinationDtype : BYTE; // Destination typeDBno : BYTE; // DB numberAddress : BYTE; // Address (0 - 255)Bit : BYTE; // Bit numberChange : BYTE; // Change markerV_low : WORD; // Value low partV_high : WORD; // Value high partReserved : DWORD;END_STRUCT;END_VARVAR_TEMPDest_Ptr : ANY; // Pointer to the internal data buf with user dataAdr : DWORD;I_double : DWORD;I_bit : BOOL;I_byte : BYTE;EN_STATUS : BOOL; // Used only for EN, ENO operationInt_Var : INT; // Temporary integer valueOffset : INT;END_VARBEGINNETWORKTITLE =SET ;SAVE ;= #EN_STATUS; // Save if any uses the EN, ENO statusSET ; // 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 destinationL #Recv_Buf.Dest;<>I ;JC D_DB;L DW#16#8300_0000; // Initialise address registerT #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 openL DW#16#8400_0000; // Initialise address registerT #Adr;AN #S5;JC CONT;L #Offset;SLW 1;T #Offset;L 82; // Data byte right typeL #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 byteT #Recv_Buf.Dtype;JU CONT;LEFT: L 76; // Data type byte left<>I ;JC BIT; // Evaluate if type is bitL 66; // Data byte changed to type byteT #Recv_Buf.Dtype;JU CONT;BIT: L 70; // Data byte right typeL #Recv_Buf.Dtype;<>I ;JC CONT; // No specials for S5L #Recv_Buf.Bit;L 8; // Check bit number<I ;JC ADD;-I ;T #Recv_Buf.Bit; // Set bit number within byteJU CONT;ADD: L #Offset;L +1;+I ;T #Offset;JU CONT;D_QB: L 65; // Ouput destinationL #Recv_Buf.Dest;<>I ;JC D_IB;L DW#16#8200_0000; // Initialise address registerT #Adr;JU CONT;D_IB: L 69; // Input destination<>I ;JC ERR;L DW#16#8100_0000; // Initialise address registerT #Adr;JU CONT;ERR: NOP 0;JU RDY;CONT: L #Offset; // Add addressSLW 3;T LW 12;L #Adr;LAR1 ;//// Evaluate destination type//L 70; // Flag typeL #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 typeL #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 ENOA #EN_STATUS;SAVE ;END_FUNCTION_BLOCK