unit Modbus_User; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, OoMisc, AdPort; type TForm_User = class(TForm) ApdComPort1: TApdComPort; Edit_TX: TEdit; Btn_CRC: TButton; Btn_Send: TButton; Label_TX: TLabel; Label_RX: TLabel; Edit_RX: TEdit; procedure FormShow(Sender: TObject); function Make_CRCvalue(Data: array of byte; nByte:word):Word; procedure Btn_SendClick(Sender: TObject); procedure Btn_CRCClick(Sender: TObject); procedure ApdComPort1TriggerAvail(CP: TObject; Count: Word); private { Private declarations } public { Public declarations } end; var Form_User: TForm_User; Const CRC_Table: ARRAY[0..255] OF WORD = ($0000,$C0C1,$C181,$0140,$C301,$03C0,$0280,$C241,$C601,$06C0,$0780, $C741,$0500,$C5C1,$C481,$0440,$CC01,$0CC0,$0D80,$CD41,$0F00,$CFC1, $CE81,$0E40,$0A00,$CAC1,$CB81,$0B40,$C901,$09C0,$0880,$C841,$D801, $18C0,$1980,$D941,$1B00,$DBC1,$DA81,$1A40,$1E00,$DEC1,$DF81,$1F40, $DD01,$1DC0,$1C80,$DC41,$1400,$D4C1,$D581,$1540,$D701,$17C0,$1680, $D641,$D201,$12C0,$1380,$D341,$1100,$D1C1,$D081,$1040,$F001,$30C0, $3180,$F141,$3300,$F3C1,$F281,$3240,$3600,$F6C1,$F781,$3740,$F501, $35C0,$3480,$F441,$3C00,$FCC1,$FD81,$3D40,$FF01,$3FC0,$3E80,$FE41, $FA01,$3AC0,$3B80,$FB41,$3900,$F9C1,$F881,$3840,$2800,$E8C1,$E981, $2940,$EB01,$2BC0,$2A80,$EA41,$EE01,$2EC0,$2F80,$EF41,$2D00,$EDC1, $EC81,$2C40,$E401,$24C0,$2580,$E541,$2700,$E7C1,$E681,$2640,$2200, $E2C1,$E381,$2340,$E101,$21C0,$2080,$E041,$A001,$60C0,$6180,$A141, $6300,$A3C1,$A281,$6240,$6600,$A6C1,$A781,$6740,$A501,$65C0,$6480, $A441,$6C00,$ACC1,$AD81,$6D40,$AF01,$6FC0,$6E80,$AE41,$AA01,$6AC0, $6B80,$AB41,$6900,$A9C1,$A881,$6840,$7800,$B8C1,$B981,$7940,$BB01, $7BC0,$7A80,$BA41,$BE01,$7EC0,$7F80,$BF41,$7D00,$BDC1,$BC81,$7C40, $B401,$74C0,$7580,$B541,$7700,$B7C1,$B681,$7640,$7200,$B2C1,$B381, $7340,$B101,$71C0,$7080,$B041,$5000,$90C1,$9181,$5140,$9301,$53C0, $5280,$9241,$9601,$56C0,$5780,$9741,$5500,$95C1,$9481,$5440,$9C01, $5CC0,$5D80,$9D41,$5F00,$9FC1,$9E81,$5E40,$5A00,$9AC1,$9B81,$5B40, $9901,$59C0,$5880,$9841,$8801,$48C0,$4980,$8941,$4B00,$8BC1,$8A81, $4A40,$4E00,$8EC1,$8F81,$4F40,$8D01,$4DC0,$4C80,$8C41,$4400,$84C1, $8581,$4540,$8701,$47C0,$4680,$8641,$8201,$42C0,$4380,$8341,$4100, $81C1,$8081,$4040); implementation {$R *.dfm} //°¢ ÄÞÆ÷³ÍÆ®µéÀÇ ¼³¸í ±¸¼º ¹× APDComportÀÇ Ãʱ⠼³Á¤. procedure TForm_User.FormShow(Sender: TObject); begin Form_User.Caption:='OTIS-LG ¼­º¸ µå¶óÀ̺ê Modbus Å×½ºÆ®¿ë »ùÇà ÇÁ·Î±×·¥'; Label_TX.Font.Color:=clyellow; Label_TX.Caption:='¼Û½Å µ¥ÀÌŸ'; Edit_TX.Color:=clyellow; Edit_TX.Font.Color:=clblack; Edit_TX.Text:='¼Û½Å µ¥ÀÌŸ(16Áø¼ö Çü½Ä)'; Label_RX.Font.Color:=clblue; Label_RX.Caption:='¼ö½Å µ¥ÀÌŸ'; Edit_RX.Color:=clblue; Edit_RX.Font.Color:=clwhite; Edit_RX.text:='¼ö½Å µ¥ÀÌŸ(16Áø¼ö Çü½Ä)'; Btn_CRC.Caption:='CRC°ª ÀÛ¼º'; Btn_Send.Caption:='µ¥ÀÌŸ Àü¼Û'; Apdcomport1.ComNumber:=1;//»ç¿ëÇÏ´Â ÄÄÇ»ÅÍÀÇ ½Ã¸®¾ó Æ÷Æ® ¹øÈ£ Apdcomport1.Baud:=9600;//Åë½Å ¼Óµµ end; //Table¿¡ ÀÇÇÑ CRC°ª »ý¼º ÇÔ¼ö function TForm_User.Make_CRCvalue(Data: array of byte; nByte: word): Word; var CRCValue:Word; i:integer; begin CRCvalue:=$FFFF; For i := 1 to nByte do CRCvalue := Hi(CRCvalue) XOR CRC_Table[ Data[i-1] XOR Lo(CRCvalue) ]; Result:=CRCvalue; end; //¼Û½ÅÇÒ DATAÀÇ CRC°ªÀ» °è»êÇÏ¿© ÷°¡. procedure TForm_User.Btn_CRCClick(Sender: TObject); var i,j:integer; CRC_Data_Len:integer;//CRC °è»ê¿¡ »ç¿ëµÉ µ¥ÀÌŸ ±æÀÌ CRC_Data_Array:array[1..30]of byte;//CRC °è»ê¿¡ »ç¿ëµÉ µ¥ÀÌŸ Result_CRC:Word;//°è»êµÈ CRC°ª begin CRC_Data_Len:=round(length(Edit_TX.Text)/2); For i:=1 to CRC_Data_Len do begin j:=i*2-1; CRC_Data_Array[i]:=byte(strtoint('$'+Edit_TX.Text[j]+Edit_TX.Text[j+1])); end; Result_CRC:=Make_CRCValue(CRC_Data_Array,CRC_Data_Len); Edit_TX.Text:=Edit_TX.Text+inttohex(Lo(Result_CRC),2)+inttohex(Hi(Result_CRC),2); end; //µ¥ÀÌŸ ¼Û½Å procedure TForm_User.Btn_SendClick(Sender: TObject); var i,j:integer; TX_Data_Size:integer;//¼Û½ÅÇÒ µ¥ÀÌŸ ±æÀÌ TX_Data_Array:array[1..32]of byte;//¼Û½ÅÇÒ µ¥ÀÌŸ begin Edit_RX.Text:=''; TX_Data_Size:=round(length(Edit_TX.Text)/2); For i:=1 to TX_Data_Size do begin j:=i*2-1; TX_Data_Array[i]:=byte(strtoint('$'+Edit_TX.Text[j]+Edit_TX.Text[j+1])); end; Apdcomport1.PutBlock(TX_Data_Array,TX_Data_Size); end; //µ¥ÀÌŸ ¼ö½Å procedure TForm_User.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var i:integer; RX_Char:char;//¼ö½ÅµÈ °ª RX_Array:array[1..200]of string;//¼ö½ÅµÈ µ¥ÀÌŸ begin for i:=1 to count do begin RX_Char:=Apdcomport1.GetChar; RX_Array[i]:=inttohex(byte(RX_Char),2); Edit_RX.Text:=Edit_RX.Text+RX_Array[i]; end; end; end.