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 (*MemToVar(EN :=true , DW_MEM_ADDR :=CRC_ADR , W_MEM_LEN :=CRC_LEN , STR_FILENAME :='OPCDA1' , STR_VARNAME :='VALCRC' );*) p1:=&VALCRC; p2:=&CRC_IN; v2v(DEST :=p1 , SRC :=p2 , LENGTH :=CRC_LEN , IQM :=0 ); CRC16Lo := 255; CRC16Hi := 255; CL := 1; CH := 160; For i := 0 To (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