IF RUN THEN
    CRCPloy:= 16#A001;
    LSBNoZero:= FALSE;
    RCRC:= 16#FFFF;
    
    IF((DataLength MOD 2)<>0) THEN
        flag:= TRUE;
        DataLengthWord:= DataLength/2+1;
    ELSE
        flag:= FALSE;
        DataLengthWord:= DataLength/2;
    END_IF;
    
    FOR loop_I:= 0 TO DataLengthWord-1 DO
        HiByte:= SHR((CRCData[loop_I] AND 16#FF00),8);
        LoByte:= CRCData[loop_I] AND 16#FF;
        RCRC:= RCRC XOR HiByte;
        FOR shiftCount:= 0 TO 7 DO
            Temp:= RCRC AND 16#0001;
            IF WORD_TO_INT(Temp)<>0 THEN
                LSBNoZero:= TRUE;
            ELSE
                LSBNoZero:= FALSE;
            END_IF;
            RCRC:= SHR(RCRC,1);
            IF LSBNoZero THEN
                RCRC:= RCRC XOR CRCPloy;
            END_IF;
        END_FOR;
        IF(loop_I=(DataLengthWord-1)) AND (flag=TRUE) THEN
            CRCLo:= SHR((RCRC AND 16#FF00),8);
            CRCHi:= RCRC AND 16#FF;
            RETURN;
        END_IF;
        RCRC:= RCRC XOR LoByte;
        FOR shiftCount:= 0 TO 7 DO
            Temp:= RCRC AND 16#0001;
            IF WORD_TO_INT(Temp)<>0 THEN
                LSBNoZero:= TRUE;
            ELSE
                LSBNoZero:=FALSE;
            END_IF;
            RCRC:= SHR(RCRC,1);
            IF LSBNoZero THEN
                RCRC:= RCRC XOR CRCPloy;
            END_IF;
        END_FOR;
    END_FOR;
    CRCLo:= SHR((RCRC AND 16#FF00),8);
    CRCHi:= RCRC AND 16#FF;
END_IF;