Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.31 KB | None | 0 0
  1. PROGRAM CRC32
  2.  
  3.  
  4. VAR_EXTERNAL
  5. (* LICZBA PODANA PRZEZ UZYTKOWNIKA *)
  6. wynik_CRC : DWORD; (* WYNIK KONCOWY CRC32 *)
  7. start : BOOL;
  8.  
  9. wejscie : UINT;
  10. wejscie2 : UINT;
  11. wejscie3 : UINT;
  12. wejscie4 : UINT;
  13. wejscie5 : UINT;
  14. dlugosc : INT;
  15.  
  16. UINTwejscie : UINT;
  17. temp : UDINT;
  18. temp2 : UDINT;
  19. tempDL : INT;
  20. temp4 : UDINT;
  21. temp3 : UDINT;
  22. temp5 : UDINT;
  23.  
  24.  
  25.  
  26. END_VAR
  27.  
  28. VAR
  29. i : int := 0; (* DO OBSLUGI GLOWNEJ PETLI *)
  30. j : int; (* DO OBSLUGI PETLI FOR *)
  31. k : int := 0;
  32. crc : DWORD; (* DO CIAGLEGO OBLICZANIA CRC *)
  33. bajt : DWORD; (* DO OPEROWANIA NA ZNAKU W PETLI *)
  34. obliczana : DWORD; (* DO ZAMIANY BITOW NA ZNAK ASCII *)
  35.  
  36. obliczana2 : DWORD;
  37. obliczana3 : DWORD;
  38. obliczana4 : DWORD;
  39. obliczana5 : DWORD;
  40.  
  41. UINT_na_STR32 : str32; (* DO KONWERSJI NA DWORD *)
  42. UINT_na_STR32_2 : str32; (* DO KONWERSJI NA DWORD *)
  43. DWORD_na_UDINT : UDINT;
  44.  
  45. xor_crc_bajt : DWORD; (* PRZECHOWUJE WYNIK XOR(crc,bajt) *)
  46. warunek_if : DINT; (* DO ZAPISANIA WYNIKU XOR(crc,bajt) I KONWERSJI NA DINT *)
  47.  
  48. F1: ARRAY [1..5] OF UDINT := [3];
  49. dziesiec : UDINT := 10;
  50. UDINTwejscie : UDINT;
  51. konwersja : UDINT;
  52.  
  53.  
  54. END_VAR
  55.  
  56. konwersja := TO_UD(wejscie);
  57. F1[1] := konwersja;
  58. konwersja := TO_UD(wejscie2);
  59. F1[2] := konwersja;
  60. konwersja := TO_UD(wejscie3);
  61. F1[3] := konwersja;
  62. konwersja := TO_UD(wejscie4);
  63. F1[4] := konwersja;
  64. konwersja := TO_UD(wejscie5);
  65. F1[5] := konwersja;
  66.  
  67.  
  68. IF start THEN
  69.  
  70. temp4 := F1[4];
  71. temp5 := F1[5];
  72. temp3 := F1[3];
  73. temp2 := F1[2];
  74. temp := F1[1];
  75. tempDL := dlugosc;
  76.  
  77.  
  78. (* INICJALIZUJE ZMIENNE PETLI FOR ORAZ CRC *)
  79. j := 0;
  80. crc := 4294967295;
  81.  
  82. FOR j := 1 TO dlugosc BY 1 DO
  83. (* KONWERTUJE UINT NA STR32 A POTEM NA DWORD *)
  84. UINT_na_STR32 := TO_STR32(F1[j]);
  85. obliczana := TO_DW(UINT_na_STR32);
  86.  
  87.  
  88.  
  89. (* ZAMIANA LICZBY NA ASCII *)
  90. CASE obliczana OF
  91. 1: obliczana := 49;
  92. 2: obliczana := 50;
  93. 3: obliczana := 51;
  94. 4: obliczana := 52;
  95. 5: obliczana := 53;
  96. 6: obliczana := 54;
  97. 7: obliczana := 55;
  98. 8: obliczana := 56;
  99. 9: obliczana := 57;
  100. 0: obliczana := 48;
  101. END_CASE;
  102. DWORD_na_UDINT := TO_UD(obliczana);
  103. F1[j] := DWORD_na_UDINT;
  104. (* KONIEC ZAMIANY ZNAKOW *)
  105. END_FOR;
  106.  
  107. FOR k := 1 TO dlugosc BY 1 DO
  108. (* ODWRACANIE BITOW, NIE ZNASZ NIE OCENIAJ, LAWIEJ SIE NIE DA :) *)
  109. bajt := TO_DW(F1[k]);
  110.  
  111. bajt := (SHL(bajt AND 16#55555555)) OR (SHR(bajt) AND 16#55555555);
  112. bajt := SHL(SHL(bajt AND 16#33333333)) OR ( SHR(SHR(bajt)) AND 16#33333333 );
  113. bajt := SHL(SHL(SHL(SHL(bajt AND 16#0F0F0F0F)))) OR ( SHR(SHR(SHR(SHR(bajt)))) AND 16#0F0F0F0F);
  114. bajt := ( SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(bajt)))))))))))))))))))))))) ) OR
  115. ( SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(bajt AND 16#FF00)))))))) ) OR
  116. ( SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(bajt)))))))) AND 16#FF00 ) OR
  117. ( SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(bajt)))))))))))))))))))))))) );
  118. (* KONIEC ODWRACANIE BITOW *)
  119.  
  120. (* WYKONUJE OPERACJE W PETLI NA ZNAKU *)
  121. FOR j := 0 TO 7 BY 1 DO
  122.  
  123. xor_crc_bajt := XOR(crc,bajt); (* OBLICZAM XOR CRC I ZNAKU *)
  124. warunek_if := TO_DI(xor_crc_bajt); (* KONWERSJA UINT DO DINT *)
  125.  
  126. IF warunek_if < 0 THEN (* SPRAWDZAM CZY (int)(xor(crc,bajt) JEST < 0) *)
  127. crc := XOR(SHL(crc),16#04C11DB7); (* PRZESUNIECIE XOR W LEWO i xor(crc,16#...) *)
  128. ELSE
  129. crc := SHL(crc); (* PRZESUWAM CRC W LEWO *)
  130. END_IF;
  131.  
  132. bajt := SHL(bajt); (* PRZESUWAM ZNAK W LEWO *)
  133. END_FOR;
  134. (*KONIEC PETLI FOR *)
  135. END_FOR;
  136.  
  137. (* NEGACJA CRC *)
  138. crc := NOT crc;
  139.  
  140. (* ODWRACNIE BITOW CRC *)
  141. crc := (SHL(crc AND 16#55555555)) OR (SHR(crc) AND 16#55555555);
  142. crc := SHL(SHL(crc AND 16#33333333)) OR ( SHR(SHR(crc)) AND 16#33333333 );
  143. crc := SHL(SHL(SHL(SHL(crc AND 16#0F0F0F0F)))) OR ( SHR(SHR(SHR(SHR(crc)))) AND 16#0F0F0F0F);
  144. crc := ( SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(crc)))))))))))))))))))))))) ) OR
  145. ( SHL(SHL(SHL(SHL(SHL(SHL(SHL(SHL(crc AND 16#FF00)))))))) ) OR
  146. ( SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(crc)))))))) AND 16#FF00 ) OR
  147. ( SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(SHR(crc)))))))))))))))))))))))) );
  148. (* KONIEC ODWRACANIA BITOW CRC *)
  149.  
  150. (* ZAPISUJE CRC DO ZMIENNEJ WYNIKOWEJ EXTERNAL *)
  151. wynik_CRC := crc;
  152. ELSE;
  153. END_IF;
  154. END_PROGRAM
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement