FUNCTION_BLOCK BS_GETCRC16 VAR_EXTERNAL END_VAR VAR_INPUT (*CRC_ADR :dword;*) CRC_IN : array[0..200] of byte; CRC_LEN :INT; END_VAR VAR_OUTPUT CRC16H :byte; CRC16L :byte; END_VAR VAR (*CRC计算用定义*) CRC16Lo,CRC16Hi : Byte; CL,CH : Byte; SaveHi,SaveLo : Byte; Flag: Int; i : int; j : int; k : int; VALCRC : array[0..100] of byte; v2v : NW_MemCopy; p1,p2 : pointer; (* MemToVar : AdvMemToVar; VarToMem : AdvVarToMem; *) END_VAR (*Automatically declared*) VAR_EXTERNAL END_VAR (** {* **) (** **) (** ʱ ¼ä£º20200924 **) (** °æ ±¾£º1.0 **) (** ×÷ ÕߣºÒ¦Á¢ **) (** Ãû ³Æ£ºCRCУÑé **) (** ˵ Ã÷£º **) (** ±¸ ×¢£º **) (** **) (** INPUT: **) (** CRC_IN : array[0..200] of byte; modbus·¢ËÍÐòÁÐ **) (** **) (** CRC_LEN :INT; ·¢ËÍÐòÁÐÊý¾Ý³¤¶È **) (** **) (** **) (** OUTPUT: **) (** CRC16H :byte; **) (** CRC16L :byte; **) (** *} **) (** **) (** **) (** **) (** {*MemToVar(EN :=true , DW_MEM_ADDR :=CRC_ADR , W_MEM_LEN :=CRC_LEN , STR_FILENAME :='OPCDA1' , STR_VARNAME :='VALCRC' );*} **) (** **) (** p1:=&VALCRC; **) (* assign - Stmt *) LD &VALCRC ST p1 (** p2:=&CRC_IN; **) (* assign - Stmt *) LD &CRC_IN ST p2 (** v2v(DEST :=p1 , SRC :=p2 , LENGTH :=CRC_LEN , IQM :=0 ); **) (* call - Stmt *) CAL v2v ( DEST := p1, SRC := p2, LENGTH := CRC_LEN, IQM := 0 ) (** CRC16Lo := 255; **) (* assign - Stmt *) LD 255 ST CRC16Lo (** CRC16Hi := 255; **) (* assign - Stmt *) LD 255 ST CRC16Hi (** CL := 1; **) (* assign - Stmt *) LD 1 ST CL (** CH := 160; **) (* assign - Stmt *) LD 160 ST CH (** **) (** For i := 0 To (CRC_LEN-1) by 1 do **) (* for - Init *) LD 0 ST i EQ( CRC_LEN SUB 1 ) JMPC ODK_FOR_STMTS_000000000000001 (* for - Cond *) ODK_FOR_000000000000001: LD 0 GT( CRC_LEN SUB 1 ) JMPC ODK_FOR_DOWN_000000000000001 LD 0 GT 1 JMPC ODK_END_FOR_000000000000001 LD CRC_LEN SUB 1 LT i JMPC ODK_END_FOR_000000000000001 JMP ODK_FOR_STMTS_000000000000001 ODK_FOR_DOWN_000000000000001: LD CRC_LEN SUB 1 GT i JMPC ODK_END_FOR_000000000000001 LD 0 LT 1 JMPC ODK_END_FOR_000000000000001 (* for - Stmts *) ODK_FOR_STMTS_000000000000001: (** CRC16Lo := CRC16Lo Xor VALCRC[i]; **) (* assign - Stmt *) LD CRC16Lo XOR VALCRC[i] ST CRC16Lo (** For Flag := 0 To 7 by 1 do **) (* for - Init *) LD 0 ST Flag EQ 7 JMPC ODK_FOR_STMTS_000000000000002 (* for - Cond *) ODK_FOR_000000000000002: LD 0 GT 7 JMPC ODK_FOR_DOWN_000000000000002 LD 0 GT 1 JMPC ODK_END_FOR_000000000000002 LD 7 LT Flag JMPC ODK_END_FOR_000000000000002 JMP ODK_FOR_STMTS_000000000000002 ODK_FOR_DOWN_000000000000002: LD 7 GT Flag JMPC ODK_END_FOR_000000000000002 LD 0 LT 1 JMPC ODK_END_FOR_000000000000002 (* for - Stmts *) ODK_FOR_STMTS_000000000000002: (** SaveHi := CRC16Hi; **) (* assign - Stmt *) LD CRC16Hi ST SaveHi (** SaveLo := CRC16Lo; **) (* assign - Stmt *) LD CRC16Lo ST SaveLo (** CRC16Hi := shr(CRC16Hi,1); **) (* assign - Stmt *) LD CRC16Hi shr 1 ST CRC16Hi (** CRC16Lo := shr(CRC16Lo,1); **) (* assign - Stmt *) LD CRC16Lo shr 1 ST CRC16Lo (** **) (** If ((SaveHi And 1) = 1) Then **) (* if - Cond *) LD SaveHi AND 1 EQ 1 JMPCN ODK_SKIP_000000000000003_000000000000001 (* then - Stmts *) (** CRC16Lo := CRC16Lo Or 128; **) (* assign - Stmt *) LD CRC16Lo OR 128 ST CRC16Lo JMP ODK_END_IF_000000000000003 (** End_If; **) (* if - End *) ODK_SKIP_000000000000003_000000000000001: ODK_END_IF_000000000000003: (** If ((SaveLo And 1) = 1) Then **) (* if - Cond *) LD SaveLo AND 1 EQ 1 JMPCN ODK_SKIP_000000000000004_000000000000001 (* then - Stmts *) (** CRC16Hi := CRC16Hi Xor CH; **) (* assign - Stmt *) LD CRC16Hi XOR CH ST CRC16Hi (** CRC16Lo := CRC16Lo Xor CL; **) (* assign - Stmt *) LD CRC16Lo XOR CL ST CRC16Lo JMP ODK_END_IF_000000000000004 (** End_If; **) (* if - End *) ODK_SKIP_000000000000004_000000000000001: ODK_END_IF_000000000000004: (* for - By *) LD 1 ADD Flag ST Flag (** end_for; **) JMP ODK_FOR_000000000000002 (* for - End *) ODK_END_FOR_000000000000002: (* for - By *) LD 1 ADD i ST i (** **) (** end_for; **) JMP ODK_FOR_000000000000001 (* for - End *) ODK_END_FOR_000000000000001: (** **) (** CRC16H:=CRC16Lo; **) (* assign - Stmt *) LD CRC16Lo ST CRC16H (** CRC16L:=CRC16Hi; **) (* assign - Stmt *) LD CRC16Hi ST CRC16L (** **) (** **) (** **) (** **) (** **) (** **) (** **) END_FUNCTION_BLOCK