溫控器Modbus協(xié)議通訊設計樣例更新_第1頁
溫控器Modbus協(xié)議通訊設計樣例更新_第2頁
溫控器Modbus協(xié)議通訊設計樣例更新_第3頁
溫控器Modbus協(xié)議通訊設計樣例更新_第4頁
溫控器Modbus協(xié)議通訊設計樣例更新_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、DELPHI SPCOMM溫控器 Modbus 協(xié)議通訊設計 QQ:64782489陳建光 unit Unit1;-interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, SPComm, ExtCtrls,StrUtils;typeTForm1 = class(TFormMemo1: TMemo;Button1: TButton;Button2: TButton;Button3: TButton;ComboBox1: TComboBox;L

2、abel2: TLabel;GroupBox1: TGroupBox;Label3: TLabel;ComboBox2: TComboBox;Memo2: TMemo;GroupBox2: TGroupBox;Button4: TButton;Button5: TButton;Label5: TLabel;Button6: TButton;Label1: TLabel;Label6: TLabel;Label4: TLabel;Label7: TLabel;ComboBox3: TComboBox;ComboBox4: TComboBox;ComboBox5: TComboBox;Comm1:

3、 TComm;GroupBox3: TGroupBox;Panel1: TPanel;Panel2: TPanel;Label8: TLabel;Label9: TLabel;Label10: TLabel;Label11: TLabel;Label12: TLabel;Label13: TLabel;Label15: TLabel;Panel3: TPanel;Panel4: TPanel;Button7: TButton;Button9: TButton;Button10: TButton;Timer1: TTimer;Label14: TLabel;Panel5: TPanel;Labe

4、l16: TLabel;Edit1: TEdit;Label17: TLabel;Edit2: TEdit;Label18: TLabel;Edit3: TEdit;Label19: TLabel;Edit4: TEdit;Edit5: TEdit;Label20: TLabel;Label21: TLabel;Edit6: TEdit;Button8: TButton;Label22: TLabel;Edit7: TEdit;Button12: TButton;Edit8: TEdit;Label23: TLabel;Edit9: TEdit;Label25: TLabel;Panel6:

5、TPanel;Edit10: TEdit;Label24: TLabel;Edit11: TEdit;Label26: TLabel;Label27: TLabel;Button11: TButton;Button13: TButton;Timer2: TTimer;procedure SetComPort(;-procedure Button1Click(Sender: TObject;procedure Button2Click(Sender: TObject;procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer; Buff

6、erLength: Word;procedure Button3Click(Sender: TObject;procedure FormCreate(Sender: TObject;procedure Button4Click(Sender: TObject;procedure Button5Click(Sender: TObject;procedure Button6Click(Sender: TObject;-procedure Timer1Timer(Sender: TObject;procedure Button7Click(Sender: TObject;procedure Butt

7、on8Click(Sender: TObject;procedure Button9Click(Sender: TObject;procedure Button10Click(Sender: TObject;procedure Button11Click(Sender: TObject;procedure Button13Click(Sender: TObject;procedure Timer2Timer(Sender: TObject;/function CalCRC16(AData:array of Byte;AStart,AEnd:Integer:Word;/function retu

8、rnCRC16(vStr1:String:String;private Private declarations public Public declarations end;-varForm1: TForm1;viewstring:string; /定義全局字符串rbuf,sbuf:array of byte; /定義全局可變字節(jié)數(shù)組Cur_Qry_Str: array1.32 of string; /當前查詢字符串Btn_Qry_Str,Tmr_Qry_Str:array1.32 of string; /按鈕、定時器返回字符串數(shù)組Btn_Rtn_Str,Tmr_Rtn_Str:array1

9、.32 of string; /按鈕、定時器返回字符串數(shù)組cur_wd,Cur_wd_p,set_wd,Cur_Mode,Open_sta:array1.32 of integer; /設置當前溫度、設置溫度、開關狀態(tài)數(shù) 組implementation$R *.dfm/=此 處 用 于 自 動 獲 取 系 統(tǒng) 的 串 口 數(shù) 目 以 及 名 稱 , 調(diào) 用 api 函 數(shù) 實 現(xiàn) 相 關 功 能 =procedure EnumComPorts(Ports: TStrings;varKeyHandle: HKEY;ErrCode, Index: Integer;ValueName, Data:

10、string;ValueLen, DataLen, ValueType: DWORD;TmpPorts: TStringList;beginErrCode := RegOpenKeyEx(HKEY_LOCAL_MACHINE,'HARDW AREDEVICEMAPSERIALCOMM',0,KEY_READ,KeyHandle;if ErrCode <> ERROR_SUCCESS thenExit; / raise EComPort.Create(CError_RegError, ErrCode; TmpPorts := TStringList.Create;tr

11、yIndex := 0;repeatValueLen := 256;DataLen := 256;SetLength(ValueName, ValueLen;SetLength(Data, DataLen;ErrCode := RegEnumValue(KeyHandle,Index,PChar(ValueName,Cardinal(ValueLen,nil,ValueType,PByte(PChar(Data,DataLen;if ErrCode = ERROR_SUCCESS thenbeginSetLength(Data, DataLen;TmpPorts.Add(Data;Inc(In

12、dex;endelseif ErrCode <> ERROR_NO_MORE_ITEMS thenexit; /raise EComPort.Create(CError_RegError, ErrCode; until (ErrCode <> ERROR_SUCCESS ;TmpPorts.Sort;Ports.Assign(TmpPorts;finallyRegCloseKey(KeyHandle;TmpPorts.Free;end;end;/=替換字符串中的空格函數(shù) = function Trimplace(str: string: string;vartmp: s

13、tring;p : Integer;begintmp := Trim(str;while Pos(' ',tmp>0 dobeginp := Pos(' ',tmp;tmp := Copy(tmp,1,p-1+Copy(tmp,p+1,Length(tmp-p;end;Result := tmp;end;/字符串轉成 16進制代碼function strToHexStr(str:string:string;varc:char;ss:string;i:integer;beginwhile str<>'' do beginc:=st

14、r1;ss:=ss+format('%0x',ord(c;delete(str,1,1;end;strtohexStr:= ss;end;/16進制字符串轉換成字符串function HexStrToStr(const S:string:string;vart:Integer;ts:string;M,Code:Integer;begint:=1;Result:=''while t<=Length(S dowhile (t<=Length(S and (not (St in '0'.'9','A'.

15、9;F','a'.'f' doinc(t;if (t+1>Length(Sor(not (St+1 in '0'.'9','A'.'F','a'.'f' thents:='$'+Stelsets:='$'+St+St+1;V al(ts,M,Code;if Code=0 thenResult:=Result+Chr(M;inc(t,2;end;end;/替換字符串函數(shù)function replacing(s,source,

16、target:string:string;var site,StrLen:integer;beginsource在 S 中出現(xiàn)的位置 site:=pos(source,s;source的長度 StrLen:=length(source;刪除 source 字符串 delete(s,site,StrLen;插入 target 字符串到 S 中 insert(target,s,site;返回新串 replacing:=s;end;/××××××××××××××

17、××××××××××××/ CalCRC16用于計算 Modbus RTU的 CRC16/ 多項式公式為 X16+X15+X2+1/××××××××××××××××××××××××××function CalCRC16(

18、AData:array of Byte;AStart,AEnd:Integer:Word; constGENP=$A001; /多項式公式 X16+X15+X2+1(1100 0000 0000 0101 varcrc:Word;i:Integer;tmp:Byte;procedure CalOneByte(AByte:Byte; /計算 1個字節(jié)的校驗碼varj:Integer;begincrc:=crc xor AByte; /將數(shù)據(jù)與 CRC 寄存器的低 8位進行異或 for j:=0 to 7 do /對每一位進行校驗begintmp:=crc and 1; /取出最低位crc:=cr

19、c shr 1; /寄存器向右移一位crc:=crc and $7FFF; /將最高位置 0if tmp=1 then /檢測移出的位,如果為 1,那么與多項式異或crc:=crc xor GENP;crc:=crc and $FFFF;end;end;begincrc:=$FFFF; /將余數(shù)設定為 FFFFfor i:=AStart to AEnd do /對每一個字節(jié)進行校驗CalOneByte(ADatai;Result:=crc;end;function returnCRC16(vStr1:String:String;varData:array0.255 of Byte;i,j,Co

20、unt:Integer;Res:Word;ResStr:string;szData:string;beginszData:=Trimplace(vStr1; /讀入欲校驗的字符串Count:=round(Length(Trimplace(vStr1/2; /讀入需要計算的字符串長度i:=1;j:=0;for j:=0 to Count-1 dobeginif (i mod 2=0 then /每 2個字符放入一個字節(jié)中i:=i+1;if i>=Length(szData thenexit;Dataj:=StrToInt('$'+copy(szData,i,2; /取出字符

21、并轉換為 16進制數(shù)i:=i+1;end;/showmessage(inttostr(Count-1;Res:=CalCRC16(Data,Low(Data,Count-1;ResStr:=IntToHex(Res,4;Result:=RightStr(ResStr,2+' '+LeftStr(ResStr,2; /兩個字節(jié)對調(diào) *end;/=設置串口 = procedure TForm1.SetComPort(;begin/獲取計算機中的串口列表,并設置當前設備的串口號EnumComPorts(ComboBox1.Items;begintryComm1.CommName:=C

22、omboBox1.Text;Comm1.BaudRate:=StrtoInt(ComboBox2.Text; /設置串口的當前波特率Comm1.StopComm; /打開之前先關閉串口 Comm1.StartComm; /Label1.Caption:='串口狀態(tài):'+ComboBox1.Text+'串口已打開 'exceptLabel1.Caption := '狀態(tài):'+ComboBox1.Text+'串口打開失敗 'end;endelsebeginLabel1.Caption:='串口狀態(tài):'+ComboBox

23、1.Text+'串口已關閉 'end;end;/=打開串口 = procedure TForm1.Button1Click(Sender: TObject;begintryComm1.BaudRate:=StrtoInt(ComboBox2.Text; /設置串口的當前波特率Comm1.CommName:=ComboBox1.Text;if ComboBox3.Text='Even(偶 ' then /設置奇偶校驗Comm1.Parity:=Even;if ComboBox3.Text='Mark(標記 ' thenComm1.Parity:=M

24、ark;if ComboBox3.Text='None(無 ' thenComm1.Parity:=None;if ComboBox3.Text='Odd(奇 ' thenComm1.Parity:=Odd;if ComboBox3.Text='Space(空格 ' thenComm1.Parity:=Space;if ComboBox4.Text='5' then /設置數(shù)據(jù)位Comm1.ByteSize:=_5; /設置數(shù)據(jù)位if ComboBox4.Text='6' thenComm1.ByteSize:=_

25、6; /設置數(shù)據(jù)位if ComboBox4.Text='7' thenComm1.ByteSize:=_7; /設置數(shù)據(jù)位if ComboBox4.Text='8' thenComm1.ByteSize:=_8; /設置數(shù)據(jù)位if ComboBox5.text='1' then /設置停止位Comm1.StopBits:=_1;if ComboBox5.text='1.5' thenComm1.StopBits:=_1_5;if ComboBox5.text='2' thenComm1.StopBits:=_2;c

26、omm1.StopComm;comm1.StartComm;Label1.Caption:='狀態(tài):'+ComboBox1.Text+'串口已開始捕獲 'exceptLabel1.Caption := '狀態(tài):'+ComboBox1.Text+'串口打開失敗 'end;/Label1.Caption:=inttoStr(Comm1.CommPort;/Label1.Caption:=InttoStr(Comm1.BaudRate;end;/關閉串口procedure TForm1.Button2Click(Sender: TObj

27、ect;begincomm1.StopComm;Label1.Caption := '狀態(tài):'+ComboBox1.Text+'串口已停止捕獲 'end;/=設置串口號 = procedure TForm1.FormCreate(Sender: TObject;beginSetComPort(;end;/=自定義發(fā)送數(shù)據(jù)過程 = procedure senddata;vari:integer;commflg:boolean;beginviewstring:=''commflg:=true;/showmessage(inttostr(high(sb

28、uf;for i:=1 to high(sbuf dobeginbegincommflg:=false;break;end;/發(fā)送時字節(jié)間的延時sleep(1;viewstring:=viewstring+inttohex(sbufi,2+' 'if not commflg then messagedlg('發(fā)送失敗 !',mterror,mbyes,0;end;viewstring:='發(fā)送 '+viewstring;end;/ =串口發(fā)送數(shù)據(jù) = procedure sentcustom(SqrStr:string;var str11:str

29、ing ;i,j,k:integer;tmpstr:string;beginif SqrStr<>'' thenbeginstr11:=Trimplace(SqrStr; /替換字符串中的所有空格i:=round(length(str11/2; /獲得字符串長度 , 除 2取整后加 1/showmessage(inttostr(i;setlength(sbuf,i+1; /重新設定發(fā)送數(shù)組范圍/showmessage(inttostr(high(sbuf;for j:=1 to i dobegintmpstr:=copy(str11,j*2-1,2;/showmes

30、sage(tmpstr;if tmpstr='' thentmpstr:='00'sbufj:=byte(strtoint('$'+tmpstr; /將變量轉換為 byte 數(shù)組end;endelsebeginsetlength(sbuf,9;sbuf1:=byte($01;sbuf2:=byte($03;sbuf3:=byte($00;sbuf4:=byte($00;sbuf5:=byte($00;sbuf6:=byte($05;sbuf7:=byte($85;sbuf8:=byte($C9;end;senddata;end;/=接收數(shù)據(jù) =

31、procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word;typess=array1.8192of char ;varstr1:ss;s:array0.8192 of char ;n:integer;string1:string;beginstr1:=Buffer;/s=('0','1','2','3'.'E'for i:=0 to 9 dosi:=chr(48+i;for i:=10 to 15 do

32、si:=chr(55+i;string1:=''for i:=1 to bufferlength dobeginn:=ord(str1i;string1:=string1+sn div 16+sn mod 16+ ' '/ 除取整 除取余end;/轉換字符串完畢后,清空 bufferZeroMemory(buffer,0;/根據(jù)過濾狀態(tài),調(diào)用 replacing 函數(shù)替換字符串if label5.Caption='狀態(tài):已停止過濾 ' thenbeginstring1 :=string1;endelsebeginbeginstring1:=rep

33、lacing(string1,'82 71 14 01 08 ',''string1:=replacing(string1,'81 33 00 00 09 80 33 00 00 08 ','' end;if trim(string1 <>'' thenbeginTmr_Rtn_Str1:= string1end;if trim(string1 <>'' thenfor i:=1 to 16 dobeginif Tmr_Qry_Stri='01 03 00 00 00

34、 05' thenbeginTmr_Rtn_Stri:= string1;Tmr_Qry_Stri:=''endelseTmr_Qry_Stri:=''end;end;end;/=清除 MEMO 文本框中的數(shù)據(jù) = procedure TForm1.Button3Click(Sender: TObject;beginmemo1.Clear;end;procedure TForm1.Button4Click(Sender: TObject;beginlabel5.Caption:='狀態(tài):已開始過濾 'end;procedure TForm

35、1.Button5Click(Sender: TObject;beginlabel5.Caption:='狀態(tài):已停止過濾 'end;procedure TForm1.Button6Click(Sender: TObject;beginmemo2.Clear;end;/查詢狀態(tài)函數(shù)function Return_Sta_Sting(SqrStr:string:String;vari:integer;Cur_CRC16Str,End_Sqr_Str:string;beginfor i:=1 to 32 do /循環(huán)地址碼 132,將查詢返回值保存至數(shù)組beginif strtoi

36、nt(copy(Trimplace(SqrStr,1,2=i thenbeginCur_CRC16Str:=returnCRC16(SqrStr; /計算 CRC16校驗碼End_Sqr_Str:=SqrStr +' '+Cur_CRC16Str; /最終查詢字符串sentcustom(End_Sqr_Str; /發(fā)送查詢指令Result:=End_Sqr_Strendend;end;/定時返回狀態(tài)值procedure TForm1.Timer1Timer(Sender: TObject;vari,Ad_id:integer; /循環(huán)用整數(shù)變量Tmr_Qry_Str1:stri

37、ng; /定時器狀態(tài)查詢字符串變量Tmr_Rtn_Str1:string; /定時器狀態(tài)返回字符串變量beginTmr_Qry_Str1:='01 03 00 00 00 05' /查詢字符串Ad_id:=StrToInt('$'+Edit1.Text; /查詢字符串地址碼tryFor i:=1 to 16 dobeginif i=Ad_id thenbeginTmr_Qry_Stri:=Tmr_Qry_Str1; /為狀態(tài)查詢字符串數(shù)組賦值Return_Sta_Sting(Tmr_Qry_Str1; /執(zhí)行狀態(tài)查詢Tmr_Rtn_Str1:=Trimplace

38、(Tmr_Rtn_Stri; /狀態(tài)返回值/label28.caption:=Tmr_Rtn_Str1;end;if (Tmr_Rtn_Str1<>'' and (copy(Tmr_Rtn_Str1,5,2='0A' and (round(length(Tmr_Rtn_Str1/2=15 thenbeginEdit7.text:=Tmr_Rtn_Str1;Label8.Caption:=IntToStr(trunc(StrToInt('$'+copy(Tmr_Rtn_Str1,7,4/10; /當前溫度 Edit8.Text:=Lab

39、el8.Caption;Label9.Caption:='.'+IntToStr(StrToInt('$'+copy(Tmr_Rtn_Str1,7,4-(trunc(StrToInt('$'+copy(Tmr_Rtn_Str1,7,4/10* 10;Label13.Caption:=IntToStr(trunc(StrToInt('$'+copy(Tmr_Rtn_Str1,11,4/10; /設置溫度 Edit9.Text:=Label13.Caption;if StrToInt('$'+copy(Tmr_Rtn_

40、Str1,15,4=1 then /當前 模式beginLabel14.Visible:=false;Label27.Visible:=true;Edit11.Text:='01'endelsebeginLabel14.Visible:=true;Label27.Visible:=false;Edit11.Text:='00'end;if StrToInt('$'+copy(Trimplace(Tmr_Rtn_Str1,23,4=1 then /當前狀態(tài) beginPanel6.Visible:=false;Edit10.Text:='0

41、1'endelsebeginPanel6.Visible:=true;Edit10.Text:='00'end;end;end;exceptend;end;/=開關按鈕 = procedure TForm1.Button7Click(Sender: TObject;vari,Ad_id:integer;Btn_Qry_Str1:string;beginBtn_Qry_Str1:='01 06 00 04 00 00' /關閉Ad_id:=StrToInt('$'+Edit1.Text; /查詢字符串地址碼for i:=1 to 16 do

42、beginif i=Ad_id thenbeginif Edit10.Text='01' thenbeginBtn_Qry_Str1:='01 06 00 04 00 00' /關閉Btn_Qry_Stri:=Btn_Qry_Str1;Edit6.Text:=Return_Sta_Sting(Btn_Qry_Str1; /打開Edit10.Text:='00'Edit1.Text:='01' /地址碼Edit2.Text:='06' /功能碼Edit3.Text:='0004' /寄存器地址Edit

43、4.Text:='0000' /數(shù)據(jù) (關閉 Edit5.Text:=Btn_Qry_Str1;endelsebeginBtn_Qry_Str1:='01 06 00 04 00 01' /關閉Btn_Qry_Stri:=Btn_Qry_Str1;Edit6.Text:=Return_Sta_Sting(Btn_Qry_Str1; /打開Edit10.Text:='01'Edit1.Text:='01' /地址碼Edit2.Text:='06' /功能碼Edit3.Text:='0004' /寄存器地址Edit4.Text:='0001' /數(shù)據(jù) (關閉 Edit5.Text:=Btn_Qry_Str1;end;end;end;end;/=模式按鈕 = procedure TForm1.Button8Click(Sender: TObject;varBtn_Qry_Str1:string;beginif Edit11.Text='01' thenbeginBtn_Qry_Str1:='01 06 00 02 00 00' /制熱模式Edit6.Text:=Return_Sta_Sting(Bt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論