1. °³¹ß/½ÇÇà Ç÷§Æû
(1) OS : Windows 7
(2) °³¹ßÅø : Delphi 2010
(3) »ç¿ë Database :
2. °³¹ß ÁßÀÎ ÇÁ·Î±×·¥
3. Áú¹® ³»¿ë
¾È³çÇϼ¼¿ä.
°í¹Î°í¹Î ÇÏ´Ù°¡ Àß ¾ÈµÇ¼ Áú¹® µå¸³´Ï´Ù.
MODBUS RTU ÇÁ·Î±×·¥À» ÇÏ°í Àִµ¥¿ä.
ÀÏ´Ü ±¹¹øÀº 04, 04: INPUT REGISTER, ½ÃÀÛ¹øÁö 0, ±æÀÌ 1 ÀÔ´Ï´Ù.
//----- CRC-16 Check -------------------------------------------
function GetCRC16(msg: PChar; iLength: Integer): Word;
var
i, j : integer ;
crc, Tembyte : Word ;
begin
crc := $FFFF ;
for i := 0 to iLength-1 do
begin
crc := (crc XOR integer(msg[i])) ;
for j:= 0 to 7 do
begin
Tembyte :=(crc and $FF) ;
if (Tembyte mod $02) > 0 then
crc := (crc shr 1) XOR $A001
else
crc := (crc shr 1) ;
end;
end;
result := crc ;
end;
//----- CRC-16 CHECK -------------------------------------------
procedure TFMain.CRC16_Check;
var
Len : Integer ;
lcCRC : PChar ;
lWCRC : Word ;
begin
Len := Length(grCOM.Comm) ; //-- grCOM.Comm = String Çü
lcCRC := PChar(grCOM.Comm) ;
lWCRC := GetCRC16(lcCRC, Len) ;
gbCRCHi := lWCRC and $FF ; //-- gbCRCHi = Byte Çü (CRC »óÀ§´Ü)
gbCRCLo := lWCRC shr 8 ; //-- gbCRCLoi = Byte Çü (CRC ÇÏÀ§´Ü)
end;
grCOM.Comm := #4#4#0#0#0#1 ; ÀÌ·¸°Ô µË´Ï´Ù.
ÀÌ°ÍÀ» function GetCRC16À» Çϸé 40753(9F31) °ªÀÌ ¸®ÅϵǼ ¿É´Ï´Ù.
ÀÌ°ÍÀ» ´Ù½Ã »óÀ§´Ü°ú ÇÏÀ§´ÜÀ¸·Î ±¸ºÐÇϱâ À§ÇÏ¿© gbCRCHi := lWCRC and $FF, gbCRCLo := lWCRC shr 8 ¿Í °°ÀÌ ÇÏ¿´½À´Ï´Ù.
±×·¯¸é gbCRCHi := 49 (Hex:31), gbCRCLo := 159 (Hex:9F)°¡ µË´Ï´Ù.
±×¸®°í, grCOM.Comm := grCOM.Comm + Char(gbCRCHi) + Char(gbCRCLo) ; Çؼ ¹®ÀÚ¸¦ ÇÕÃÄ ÁÖ¾ú´Âµ¥.
Á¦°¡ ¿øÇÑ°Ç
grCOM.Comm := #4#4#0#0#0#1#$31#$9F ; Àε¥
°á°ú¸¦ º¸¸é
grCOM.Comm := #4#4#0#0#0#1#$31#$009F ; À¸·Î ³ª¿É´Ï´Ù.
¿Ö Byte Çü 159(9F)À» CharÇüÀ¸·Î º¯È¯Çϸé #$009F °¡ µÉ±î¿ä??? (ÀÌÀ¯ Á» ¾Ë°í ½Í¾î¿ä)
¶Ç, CharÇüÀ¸·Î #$9F °¡ µÇ°Ô ÇÏ´Â ¹æ¹ýÀ» ¾Ë°í ½Í½À´Ï´Ù.