国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于VB的霍尼韋爾溫控表控制程序的實現(xiàn)

2017-12-11 10:50:03高志楊于新剛
電腦知識與技術(shù) 2017年31期
關(guān)鍵詞:賦值控件寄存器

高志楊 于新剛

摘要:Modbus協(xié)議在電子控制器通訊上有廣泛的應(yīng)用,對其必要的掌握和應(yīng)用是廣大相關(guān)工程技術(shù)人員必備的能力,使用VB6.0進行程序開發(fā)有簡單易學(xué),開發(fā)周期短的特點,利用其MSComm控件通過串口通訊可以輕松實現(xiàn)與智能儀表等電子控制器的通訊。主要介紹了溫控表通過Modbus-RTU協(xié)議模式進行通訊的方法,并以一款霍尼韋爾溫控表為具體控制對象,VB6.0為程序開發(fā)平臺,通過實例編程,介紹了串口與MSComm控件實現(xiàn)可變參數(shù)通訊和對溫控表編程溫控的過程。

關(guān)鍵詞:Modbus協(xié)議;VB6.0; RS-485;MSComm控件

中圖分類號:TP302 文獻標識碼:A 文章編號:1009-3044(2017)31-0095-06

Control Program Realization of Honeywell Temperature Control Meter Based on VB

GAO Zhi-Yang,YU Xin-Gang

(Jiamusi University, Teaching Experiment Equipment Management Center, Jiamusi 154007,China)

Abstract: The Modbus protocol has a wide range applications in the communication of electronic controllers, the mastering and application are the necessary capabilities of the relevant engineering and technical personnel. The feauture of VB6.0 is easy to learn and develop the programg, its MSComm control through the serial communication can easily achieve communication with intelligent instruments and other electronic controller. This paper mainly introduces the method of communication between the temperature control meter and the Modbus-RTU protocol mode, and takes a Honeywell temperature control meter as the concrete control object. VB6.0 is the program development platform, through the example programming, introducing variable parameter communication and temperature control process between the serial port and the MSComm Control.

Key words: Modbus protocol; VB6.0; RS-485; MSComm control

本文從實際應(yīng)用角度介紹了利用VB6.0的串口通信控件和RS485總線通過Modbus-RTU協(xié)議,實現(xiàn)與霍尼韋爾溫控表通訊,讀取、顯示現(xiàn)場溫度與程序設(shè)定值,并對溫控表目標溫度進行設(shè)定的過程,編程實現(xiàn)了溫度控制的目的。

1 Modbus-RTU協(xié)議模式簡介

Modbus-RTU是Modbus協(xié)議下的一個協(xié)議傳輸模式。Modbus是一個工業(yè)上常用的通訊協(xié)議,通過Modbus協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)和其他設(shè)備之間可以實現(xiàn)通信。Modbus協(xié)議已經(jīng)成為一種 通用工業(yè)標準。用于控制器時,通常選擇設(shè)置其中的ASCII傳輸模式或RTU傳輸模式中一種。通過Modbus協(xié)議控制器組成的網(wǎng)絡(luò)通信通常使用主-從技術(shù),即一設(shè)備(主設(shè)備)能初始化查詢傳輸(查詢),從設(shè)備返回消息作為回應(yīng),主從設(shè)備發(fā)送的消息報文格式都要符合Modbus協(xié)議的要求。

控制程序設(shè)計中采用了常用的Modbus-RTU協(xié)議模式,表1是協(xié)議規(guī)定其報文結(jié)構(gòu):

表1 Modbus-RTU報文結(jié)構(gòu)

[地址碼 功能碼 數(shù)據(jù)地址碼 數(shù)據(jù)區(qū) CRC校驗碼 一個字節(jié) 一個字節(jié) 2字節(jié) N個字節(jié) 2個字節(jié) ]

其中報文中的每個字節(jié)都是2個十六進制字符組成。地址碼表明標明從機的地址,每個從機都必須有唯一的地址碼,并且只有符合地址碼的從機才能響應(yīng)主機回送信息;功能碼告訴從機應(yīng)執(zhí)行什么動作;數(shù)據(jù)地址碼標明動作執(zhí)行的起始寄存器或線圈地址;數(shù)據(jù)區(qū)包括需要由從機返回何種信息或執(zhí)行什么動作;CRC校驗碼用于信息的正確性檢驗。

2 霍尼韋爾溫控表的參數(shù)設(shè)置

溫度控制程序控制對象是型號為DC1040CT的霍尼韋爾溫控表,溫控表內(nèi)部已經(jīng)固化了Modbus協(xié)議,根據(jù)溫控表說明書的技術(shù)參數(shù)說明可知:表內(nèi)集成有Modbus-RTU和Modbus-ASCII兩種協(xié)議模式,在本溫控程序設(shè)計中,設(shè)置表的參數(shù)PSL為RTU,即采用Modbus-RTU模式;設(shè)置參數(shù)BITS為E_81,即偶校驗、8位數(shù)據(jù)位、1位停止位;設(shè)置表的地址參數(shù)ID.NO為1,即儀表的協(xié)議地址為1;設(shè)置波特率參數(shù)BAUD為48,即波特率為4800kps;小數(shù)點設(shè)置參數(shù)DP設(shè)為1,即1位小數(shù)點。

3 溫控程序軟件的設(shè)計與實現(xiàn)

溫度控程序使用的編程軟件是微軟的Visual Basic 6.0,利用其中的Mscomm串口通信控件實現(xiàn)與溫控表的通訊與溫度控制。Visual Basic 6.0中的Mscomm控件主要是為RS-232通用串口設(shè)計的?,F(xiàn)在的計算機上普遍已經(jīng)不再配置RS-232串口,可以在USB串口上接一個USB轉(zhuǎn)RS-232的轉(zhuǎn)接口,再配置一個RS-232串口到RS-485總線的轉(zhuǎn)換器,即可實現(xiàn)Mscomm與RS-485總線上的設(shè)備通訊。

溫度控制程序通過USB串口轉(zhuǎn)換到RS-232串口,再轉(zhuǎn)換到RS-485總線與溫控表相連接,通過溫控表被配置唯一的地址碼和Modbus-RTU協(xié)議完成數(shù)據(jù)通訊連接,實現(xiàn)控制程序?qū)乜乇淼南嚓P(guān)數(shù)據(jù)寫入與讀取。

3.1 溫度控制軟件的界面設(shè)計

運行VB6.0,新建一個命名為Honeywell控制的工程,主窗體名為:控制窗口,然后在工具箱中添加Microsoft Comm Control 6.0控件和Microsoft Windows Common Controls 6.0控件,在窗體設(shè)計界面中分別加入Frame、Label、MScomm、ComboBox、CommandButton、Timer、Slider、TextBox等控件,分別命名,并將TextBox控件Text屬性都設(shè)置為空,設(shè)計界面如圖1:

3.2 界面的窗體Form_load()事件程序設(shè)計

利用窗體事件Form_load(),對窗體上的各控件進行參數(shù)設(shè)置。用各ComboBox控件的AddItem屬性設(shè)置各個ComboBox控件的待選參數(shù),用各ComboBox控件的ListIndex屬性設(shè)置各默認初始參數(shù),F(xiàn)orm_Load()過程中如下代碼:

Private Sub Form_Load()

'儀表地址選擇設(shè)置

AddressNo.AddItem "1", 0

AddressNo.AddItem "2", 1

AddressNo.AddItem "3", 2

AddressNo.AddItem "4", 3

AddressNo.AddItem "5", 4

AddressNo.AddItem "6", 5

'串口號設(shè)置

ComNo.AddItem "COM1", 0

ComNo.AddItem "COM2", 1

ComNo.AddItem "COM3", 2

ComNo.AddItem "COM4", 3

ComNo.AddItem "COM5", 4

'波特率設(shè)置

BaudeRate.AddItem "4800", 0

BaudeRate.AddItem "9600", 1

BaudeRate.AddItem "19200", 2

BaudeRate.AddItem "115200", 3

'校驗位設(shè)置

Parity.AddItem "N", 0

Parity.AddItem "E", 1

Parity.AddItem "O", 2

'數(shù)據(jù)位設(shè)置

DataBit.AddItem "7", 0

DataBit.AddItem "8", 1

'停止位設(shè)置

StopBit.AddItem "1", 0

StopBit.AddItem "2", 1

'預(yù)置串口參數(shù)默認值

AddressNo.ListIndex = 0

ComNo.ListIndex = 0

BaudeRate.ListIndex = 1

Parity.ListIndex = 1

DataBit.ListIndex = 1

StopBit.ListIndex = 0

'初始串口未打開提示信息

Indic_Conn.Caption = " 串口未打開"

'設(shè)置Timer1為不可用

Timer1.Enabled = False

End Sub

注意,AddressNo.AddItem即設(shè)備地址參數(shù),可以根據(jù)實際需要參照Modbus協(xié)議規(guī)定繼續(xù)添加。同時,在過程中關(guān)閉了Timer1控件對象,因為本程序在Timer1_Timer事件中有數(shù)據(jù)通訊請求過程,若在串口未連接的情況下執(zhí)行數(shù)據(jù)通訊請求,會出現(xiàn)錯誤,所以在Form_load()中將其關(guān)閉,待串口打開后再將其打開,執(zhí)行數(shù)據(jù)通訊請求。

3.3 按鈕互鎖的過程設(shè)計

本控制程序中的串口連接與斷開兩個按鈕要實現(xiàn)互鎖,即串口成功打開后,則打開按鈕狀態(tài)變?yōu)闊o效,直到按斷開按鈕,使串口成功斷開為止。斷開按鈕也是如此,斷開串口后,則斷開按鈕狀態(tài)也變?yōu)闊o效,要等串口成功連接后,斷開按鈕才有效。按鈕互鎖子過程放在窗體代碼中,按鈕互鎖子過程代碼如下:

Public Sub button_manage(button As Variant)

Select Case button

'參數(shù)為連接按鈕

Case CMDConn

'斷開按鈕有效

CMDDisconn.Enabled = True

'連接按鈕無效

CMDConn.Enabled = False

'參數(shù)為斷開按鈕

Case CMDDisconn

'連接按鈕有效

CMDConn.Enabled = True

'斷開按鈕無效

CMDDisconn.Enabled=False

End Select

End Sub

其中,被鎖定的按鈕控件名作為調(diào)用過程的參數(shù),鎖定管理過程根據(jù)參數(shù)判斷被鎖定按鈕,并打開對應(yīng)的另一按鈕。

3.4 打開與關(guān)閉串口的程序設(shè)計

CMDConn_Click()是串口打開事件過程,首先在過程中設(shè)置一條On Error Goto Errline語句,功能是若串口打開不成功則跳轉(zhuǎn)至Errline行,進行打開錯誤提示,并退出串口連接過程。其后是串口各參數(shù)設(shè)置并打開串口過程。執(zhí)行完打開串口指令后,繼續(xù)執(zhí)行提示串口打開成功指令、執(zhí)行打開關(guān)閉按鈕互鎖過程、執(zhí)行使Frame控件無效指令和打開Timer1控件指令,實現(xiàn)各個控件對應(yīng)的功能。串口打開過程代碼如下:

Private Sub CMDConn_Click()

On Error GoTo Errline

'配置、確定打開串口各項參數(shù)

MSComm1.CommPort = ComNo.ListIndex + 1

MSComm1.Settings = BaudeRate.Text

+ "," + Parity.Text + "," + DataBit.Text +

"," + StopBit.Text

MSComm1.InputMode = 1

MSComm1.InputLen = 0

MSComm1.InBufferCount = 0

MSComm1.OutBufferCount = 0

MSComm1.RThreshold = 7

MSComm1.InBufferSize = 1024

MSComm1.OutBufferSize = 1024

' 根據(jù)以所確定參數(shù)打開串口

MSComm1.PortOpen = True

'提示串口成功打開

Indic_Conn.Caption = " 串口成功打開"

'調(diào)用按鈕互鎖程序,使打開無效關(guān)閉按鈕

'有效

button_manage (CMDConn)

'使各通訊參數(shù)不可更改

Commpara.Enabled = False

'使Timer1控件工作

Timer1.Enabled = True

Exit Sub

Errline:

Indic_Conn.Caption = "串口未打開,請檢查串口參數(shù)重新連接.."

End Sub

關(guān)閉串口過程代碼如下:

Private Sub CMDDisconn_Click()

'關(guān)閉Timer1使數(shù)據(jù)通訊請求指令無效

Timer1.Enabled = False

'使串口通訊各參數(shù)可調(diào)整

Commpara.Enabled = True

'關(guān)閉串口

MSComm1.PortOpen = False

'顯示串口關(guān)閉信息

Indic_Conn.Caption = " 串口已關(guān)閉"

'關(guān)閉斷開按鈕,打開連接按鈕

button_manage (CMDDisconn)

End Sub

3.5 數(shù)據(jù)寫入與讀取過程程序設(shè)計

根據(jù)霍尼韋爾溫控表的技術(shù)資料可知,溫控表保存設(shè)定溫度數(shù)據(jù)的寄存器地址為000,保存程序溫度數(shù)據(jù)的寄存器地址為138,要在控制程序中分別顯示溫控表的設(shè)定溫度值和程序溫度值,本程序采用的是讀取設(shè)定溫度數(shù)據(jù)請求和讀取程序溫度數(shù)據(jù)分開發(fā)送和讀取的方法,程序中定義了一個公共變量,用于判斷Modbus-RTU傳輸協(xié)議應(yīng)答報文中傳輸?shù)氖窃O(shè)定溫度寄存器數(shù)據(jù)還是程序溫度寄存器數(shù)據(jù),同時定義了一個保存設(shè)定溫度寄存器數(shù)據(jù)的變量,供溫度設(shè)定控件Slider1和溫度寫入過程共同使用。將以上兩個公共變量,定義在公共模塊中,并將公共模塊命名為PublicFUN,PublicFUN模塊中設(shè)置以上兩公共變量的代碼如下:

'定義數(shù)據(jù)請求寄存器地址變量

Public addressVal As Integer

'定義設(shè)定溫度值數(shù)據(jù)變量

Public SSetVal As Long

由Modbus-RTU協(xié)議規(guī)范模式可知,傳輸?shù)膱笪牡淖詈髢蓚€字節(jié)存放的是計算后的CRC校驗碼,程序中必須有CRC校驗碼計算程序,供系統(tǒng)發(fā)送請求數(shù)據(jù)和接受數(shù)據(jù)進行數(shù)據(jù)正確性檢驗時使用,因為CRC校驗碼計算是公用的函數(shù),我們將也其放在公共模塊中,CRC校驗碼計算函數(shù)代碼如下:

Public Function CRC16(data() As Byte, no As Integer, btLoCRC As Byte, _

btHiCRC As Byte) As String

Dim CL As Byte, CH As Byte

Dim SaveHi As Byte, SaveLo As Byte

Dim i As Integer

Dim Flag As Integer

btHiCRC = &HFF

btLoCRC = &HFF

CL = &H1

CH = &HA0

For i = 0 To (no - 1)

btHiCRC = btHiCRC Xor data(i)

For Flag = 0 To 7

SaveHi = btLoCRC

SaveLo = btHiCRC

btLoCRC = btLoCRC \ 2

btHiCRC = btHiCRC \ 2

If ((SaveHi And &H1) = &H1) Then

btHiCRC = btHiCRC Or &H80

End If

If ((SaveLo And &H1) = &H1) Then

btLoCRC = btLoCRC Xor CH

btHiCRC = btHiCRC Xor CL

End If

Next Flag

Next i

Dim ReturnData(1) As Byte

ReturnData(0) = btHiCRC

ReturnData(1) = btLoCRC

CRC16 = ReturnData

End Function

Public Function CRC16Tbl(data() As Byte, no As Integer, btLoCRC As Byte, btHiCRC As Byte) As String

'Dim btLoCRC As Byte

'Dim btHiCRC As Byte

btLoCRC = &HFF

btHiCRC = &HFF

Dim i As Integer

Dim iIndex As Long

For i = 0 To (no - 1)

iIndex = btHiCRC Xor data(i)

btHiCRC = btLoCRC Xor GetCRCLo(iIndex)

btLoCRC = GetCRCHi(iIndex)

Next i

Dim ReturnData(1) As Byte

ReturnData(0) = btHiCRC

ReturnData(1) = btLoCRC

CRC16Tbl = ReturnData

End Function

'CRC低位字節(jié)值表

Function GetCRCLo(Ind As Long) As Byte

GetCRCLo=Choose(Ind+1, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40,&H1,&HC0,&H80,&H41,&H0,&HC1,&H81,&H40,&H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81,&H40,&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,

&H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0,&HC1,&H81,&H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81,&H40,&H1,&HC0,&H80,&H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1,&HC0,&H80,&H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0,&HC1,&H81,&H40,&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41, &H0, &HC1, &H81, &H40, &H1,&HC0, &H80, &H41, &H1,&HC0, &H80,&H41, &H0, &HC1, &H81, &H40)

End Function

'CRC高位字節(jié)值表

Function GetCRCHi(Ind As Long) As Byte

GetCRCHi=Choose(Ind+1,&H0, &HC0, &HC1, &H1, &HC3, &H3, &H2, &HC2, &HC6, &H6, &H7, &HC7, &H5, &HC5, &HC4, &H4, &HCC, &HC, &HD, &HCD, &HF, &HCF, &HCE, &HE, &HA, &HCA, &HCB, &HB, &HC9, &H9, &H8, &HC8, &HD8, &H18, &H19, &HD9, &H1B, &HDB, &HDA, &H1A, &H1E, &HDE, &HDF, &H1F, &HDD, &H1D, &H1C, &HDC, &H14, &HD4, &HD5, &H15, &HD7, &H17, &H16, &HD6, &HD2, &H12, &H13, &HD3, &H11, &HD1, &HD0, &H10, &HF0, &H30, &H31, &HF1, &H33, &HF3, &HF2, &H32, &H36, &HF6, &HF7, &H37, &HF5, &H35, &H34, &HF4, &H3C, &HFC, &HFD, &H3D, &HFF, &H3F, &H3E, &HFE, &HFA, &H3A, &H3B, &HFB, &H39, &HF9, &HF8, &H38, &H28, &HE8, &HE9, &H29, &HEB, &H2B, &H2A, &HEA, &HEE, &H2E, &H2F, &HEF, &H2D, &HED, &HEC, &H2C, &HE4, &H24, &H25, &HE5, &H27, &HE7, &HE6, &H26, &H22, &HE2, &HE3, &H23, &HE1, &H21, &H20, &HE0, &HA0, &H60, &H61, &HA1, &H63, &HA3, &HA2,&H62,&H66,&HA6,&HA7,&H67,&HA5,&H65, &H64, &HA4, &H6C, &HAC, &HAD, &H6D, &HAF, &H6F, &H6E, &HAE, &HAA, &H6A, &H6B, &HAB, &H69, &HA9, &HA8, &H68, &H78, &HB8, &HB9, &H79, &HBB, &H7B, &H7A, &HBA, &HBE, &H7E, &H7F, &HBF, &H7D, &HBD, &HBC, &H7C, &HB4, &H74, &H75, &HB5, &H77, &HB7, &HB6, &H76, &H72, &HB2, &HB3, &H73, &HB1, &H71, &H70, &HB0, &H50, &H90, &H91, &H51, &H93, &H53, &H52, &H92,&H96,&H56,&H57, &H97, &H55, &H95, &H94, &H54, &H9C, &H5C, &H5D, &H9D, &H5F, &H9F, &H9E, &H5E, &H5A, &H9A, &H9B, &H5B, &H99, &H59, &H58, &H98, &H88, &H48, &H49, &H89, &H4B, &H8B, &H8A, &H4A, &H4E, &H8E, &H8F, &H4F, &H8D, &H4D, &H4C, &H8C,&H44,&H84,&H85,&H45,&H87,&H47,&H46,&H86,&H82,&H42,&H43,&H83,&H41,&H81,&H80, &H40)

End Function

在發(fā)送設(shè)定溫度數(shù)據(jù)過程開始前,需要先根據(jù)Modbus-RTU協(xié)議模式規(guī)范,設(shè)計好所發(fā)送數(shù)據(jù)報文并賦值。本程序采的是協(xié)議中的多寄存器寫入功能碼16,并且所讀取寄存器數(shù)量為1,根據(jù)協(xié)議規(guī)范定義一個以字節(jié)型(Byte)數(shù)據(jù)為元素類型,元素個數(shù)為11的數(shù)組,將其各位元素經(jīng)過計算和賦值,通過MSComm控件發(fā)送到RS485總線。設(shè)計的報文如表2:

寫入設(shè)定溫度寄存器數(shù)據(jù)過程實現(xiàn)代碼如下:

Private Sub WRdata(DataToWR As Long)

'定義過程數(shù)組與所需變量

Dim WRsend(10) As Byte

Dim crc

Dim btLoCRC As Byte, btHiCRC As Byte

'寫入設(shè)備ID位賦值

WRsend(0) = "&h" + Hex(AddressNo.ListIndex + 1)

'寫入功能碼位賦值

WRsend(1) = "&h" + Hex(16)

'寫入寄存器地址高、低位地址位賦值

WRsend(2) = "&h" + Hex(0)

WRsend(3) = "&h" + Hex(0)

'寫入寄存器數(shù)量數(shù)高、低位賦值

WRsend(4) = "&h" + Hex(0)

WRsend(5) = "&h" + Hex(1)

'發(fā)送字節(jié)數(shù)位賦值

WRsend(6) = "&h" + Hex(2)

'寫入寄存器數(shù)據(jù)位賦值

WRsend(7) = "&h" + Hex(DataToWR \ 256)

WRsend(8) = "&h" + Hex(DataToWR Mod 256)

'計算CRC值

crc = CRC16(WRsend, 9, btLoCRC, btHiCRC)

'待發(fā)送幀CRC校驗碼位賦值

WRsend(9) = "&h" + Hex(btHiCRC)

WRsend(10) = "&h" + Hex(btLoCRC)

'發(fā)送數(shù)據(jù)寫入請求

MSComm1.Output = WRsend

'清緩存

MSComm1.InBufferCount = 0

End Sub

數(shù)據(jù)讀取報文的設(shè)計過程與寫入報文設(shè)計類似,只不過依照協(xié)議計算出的幀長度和各位的賦值情況有所不同,根據(jù)協(xié)議Modbus-RTU規(guī)定,寄存器數(shù)據(jù)讀取功能碼為03,并且所讀寄存器數(shù)量為1,根據(jù)協(xié)議規(guī)范,定義一個以字節(jié)型(Byte)數(shù)據(jù)為元素類型,元素個數(shù)為8的數(shù)組,將其各位元素經(jīng)過計算和賦值,通過MSComm控件發(fā)送到RS485總線。設(shè)計的報文如表3:

讀取過程實現(xiàn)代碼如下:

Public Function SendRequest(addval As Integer)

'定義發(fā)送數(shù)組與相關(guān)變量

Dim QRsend(7) As Byte

Dim crc

Dim btLoCRC As Byte, btHiCRC As Byte

If MSComm1.PortOpen = True Then

'被讀取設(shè)備地址賦值

RQsend(0) = "&h" + Hex(AddressNo.ListIndex + 1)

'寄存器讀取功能碼賦值

RQsend(1) = "&h" + Hex(3)

'被讀取寄存器高、低位賦值

RQsend(2) = "&h" + Hex(0)

RQsend(3) = "&h" + Hex(addval)

'讀取寄存器數(shù)量高、低位賦值

RQsend(4) = "&h" + Hex(0)

RQsend(5) = "&h" + Hex(1)

'計算CRC值

crc = CRC16(RQsend, 6, btLoCRC, btHiCRC)

'待發(fā)送報文CRC位賦值

RQsend(6) = "&h" + Hex(btHiCRC)

RQsend(7) = "&h" + Hex(btLoCRC)

'發(fā)送數(shù)據(jù)讀取請求

MSComm1.Output = RQsend

'清緩存

MSComm1.InBufferCount = 0

End If

End Function

程序中在Timer1控件的Timer1_Timer事件中分別調(diào)用數(shù)據(jù)設(shè)定溫度數(shù)據(jù)讀取過程、設(shè)定溫度數(shù)據(jù)讀取過程和設(shè)定溫度數(shù)據(jù)寫入過程,使溫控程序循環(huán)進行以上三個數(shù)據(jù)的讀取和寫入。先設(shè)置Timer1的Interval值為100,即設(shè)定Timer1的循環(huán)周期為0.1秒,溫度數(shù)據(jù)的讀取和寫入實現(xiàn)代碼如下:

Private Sub Timer1_Timer()

'設(shè)置一靜態(tài)計數(shù)變量并循環(huán)遞增

Static TMCount as integer

TMCount = TMCount + 1

If TMCount < 3 Then

'TMCount為1時,讀取程序溫度數(shù)據(jù)

If TMCount = 1 Then

addressVal = 138

SendRequest (138)

'TMCount為2時,讀取設(shè)定溫度數(shù)據(jù)

Else

addressVal = 0

SendRequest (0)

End If

Else

'TMCount為3時,寫入設(shè)定溫度數(shù)據(jù)

Call WRdata(SSetVal)

'TMCount清零,重新啟動讀取與寫入循環(huán)

TMCount = 0

End If

End Sub

程序中串口通訊控件MSComm1的MSComm1_OnComm()事件用于讀取溫控表相應(yīng)數(shù)據(jù),并將相關(guān)數(shù)據(jù)進行顯示,實現(xiàn)代碼如下:

Private Sub MSComm1_OnComm()

'定義過程相關(guān)變量

Dim RDdata() As Byte

Dim btLoCRC As Byte, btHiCRC As Byte

Dim data As Integer

Dim crc

Select Case MSComm1.CommEvent

Case comEvReceive

RDdata = MSComm1.Input

If RDdata (1) = 3 Then

'計算并返回CRC碼值

crc = CRC16(RDdata, 5, btLoCRC, btHiCRC)

If RDdata (5) = btHiCRC And

RDdata (6) = btLoCRC Then

'CRC值正確則顯示數(shù)據(jù)

Select Case addressVal

Case 138

PV.Text = 0.1 * (256 * Val(RDdata (3)) + Val(RDdata (4)))

Case 0

SV.Text = 0.1 * (256 * Val(RDdata (3))

+ Val(RDdata (4)))

End Select

End If

End If

End Select

End Sub

程序中的Slider控件用于溫度設(shè)定,過程代碼如下:

Private Sub Slider1_scroll()

'將設(shè)定溫度值換算為寄存器數(shù)據(jù)并賦值給公共變量

SSetVal = 10 * Slider1.Value

End Sub

至此,本控制程序的界面與程序代碼設(shè)計完畢。程序運行后,可以得到如圖2所示的溫控程序界面:

可以通過ComboBox控件對設(shè)備地址、串口號、波特率、校驗位、數(shù)據(jù)位、停止位分別設(shè)置相關(guān)參數(shù),操作系統(tǒng)中串口的各參數(shù)也要和被控的溫控表通訊參數(shù)一致。點擊連接按鈕進行連接,連接成功后,當(dāng)前溫控表的程序溫度值與設(shè)定溫度值被顯示出來,可以通過Slider1控件進行溫控表設(shè)定溫度值的設(shè)置,并在程序界面中及時顯示出來。如圖3。

在串口成功連接后,相關(guān)的通訊參數(shù)是不能被更改的,若要重新設(shè)置相關(guān)的通訊參數(shù),點擊斷開按鈕斷開通訊連接,重新設(shè)置相關(guān)參數(shù)并再次進行連接即可。

4 結(jié)論與展望

通過上述溫控控制程序的設(shè)計與實現(xiàn),可知其重點是通訊的實現(xiàn)與對協(xié)議的掌握,溫控程序中通訊模塊實現(xiàn)了通訊參數(shù)的隨需調(diào)整設(shè)置,方法具有較強的實用價值;VB6.0通過數(shù)組數(shù)據(jù)結(jié)構(gòu)可輕松實現(xiàn)Modbus-RTU協(xié)議報文結(jié)構(gòu),過程方法易于理解;該程序的內(nèi)容側(cè)重點是通訊和協(xié)議的實現(xiàn),整體溫控過程完整,界面的完善設(shè)計可進一步隨需實現(xiàn)。

參考文獻:

[1] 李江全.現(xiàn)代測控系統(tǒng)典型應(yīng)用實例[M].北京:電子工業(yè)出版社,2010.

[2] 李江全.Visual Basica數(shù)據(jù)采集與串口通信測控應(yīng)用實戰(zhàn)[M].北京:人民郵電出版社,2010.

[3] 張輝.Visual Basic串口通信及編程實例[M].北京:化學(xué)工業(yè)出版社,2017.

[4] 董立君,劉書偉,侯逸青.VB下基于Modbus規(guī)約的串口通信[J].工業(yè)控制計算機,2006,19(8):8-9,11.

猜你喜歡
賦值控件寄存器
關(guān)于1 1/2 … 1/n的一類初等對稱函數(shù)的2-adic賦值
L-代數(shù)上的賦值
Lite寄存器模型的設(shè)計與實現(xiàn)
強賦值幺半群上的加權(quán)Mealy機與加權(quán)Moore機的關(guān)系*
關(guān)于.net控件數(shù)組的探討
軟件(2018年7期)2018-08-13 09:44:42
分簇結(jié)構(gòu)向量寄存器分配策略研究*
利用賦值法解決抽象函數(shù)相關(guān)問題オ
就這樣玩會VBA中常見的自定義控件
電腦迷(2012年24期)2012-04-29 00:44:03
高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
一種可重構(gòu)線性反饋移位寄存器設(shè)計
五指山市| 庄浪县| 雷州市| 静安区| 张家港市| 浦县| 纳雍县| 仲巴县| 城步| 娄底市| 鄂温| 遵化市| 正宁县| 广州市| 和林格尔县| 河北区| 浠水县| 东乡| 万全县| 常山县| 鄱阳县| 上虞市| 建宁县| 广德县| 东山县| 定边县| 西林县| 灌南县| 前郭尔| 凤凰县| 高雄县| 雷波县| 雷州市| 望都县| 仪陇县| 鄂伦春自治旗| 历史| 泰和县| 新建县| 佳木斯市| 株洲县|