FUNCTION_BLOCK GETCRC16 VAR_EXTERNAL VALCRC : array[0..100] of byte; END_VAR VAR_INPUT CRC_ADR :dword; CRC_LEN :word; 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; (* MemToVar : AdvMemToVar; VarToMem : AdvVarToMem; *) END_VAR (*Automatically declared*) VAR_EXTERNAL END_VAR (** {*MemToVar(EN :=true , DW_MEM_ADDR :=CRC_ADR , W_MEM_LEN :=CRC_LEN , STR_FILENAME :='OPCDA1' , STR_VARNAME :='VALCRC' );*} **) (** 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 (word_to_int(CRC_LEN)-1) by 1 do **) (* for - Init *) LD 0 ST i EQ( CRC_LEN word_to_int SUB 1 ) JMPC ODK_FOR_STMTS_000000000000001 (* for - Cond *) ODK_FOR_000000000000001: LD 0 GT( CRC_LEN word_to_int SUB 1 ) JMPC ODK_FOR_DOWN_000000000000001 LD 0 GT 1 JMPC ODK_END_FOR_000000000000001 LD CRC_LEN word_to_int SUB 1 LT i JMPC ODK_END_FOR_000000000000001 JMP ODK_FOR_STMTS_000000000000001 ODK_FOR_DOWN_000000000000001: LD CRC_LEN word_to_int 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