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 (*MemToVar(EN :=true , DW_MEM_ADDR :=CRC_ADR , W_MEM_LEN :=CRC_LEN , STR_FILENAME :='OPCDA1' , STR_VARNAME :='VALCRC' );*) CRC16Lo := 255; CRC16Hi := 255; CL := 1; CH := 160; For i := 0 To (word_to_int(CRC_LEN)-1) by 1 do CRC16Lo := CRC16Lo Xor VALCRC[i]; For Flag := 0 To 7 by 1 do SaveHi := CRC16Hi; SaveLo := CRC16Lo; CRC16Hi := shr(CRC16Hi,1); CRC16Lo := shr(CRC16Lo,1); If ((SaveHi And 1) = 1) Then CRC16Lo := CRC16Lo Or 128; End_If; If ((SaveLo And 1) = 1) Then CRC16Hi := CRC16Hi Xor CH; CRC16Lo := CRC16Lo Xor CL; End_If; end_for; end_for; CRC16H:=CRC16Lo; CRC16L:=CRC16Hi; END_FUNCTION_BLOCK