• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

    高志楊 于新剛

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

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

    中圖分類號(hào):TP302 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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

    '串口號(hào)設(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

    '校驗(yàn)位設(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ù)默認(rèn)值

    AddressNo.ListIndex = 0

    ComNo.ListIndex = 0

    BaudeRate.ListIndex = 1

    Parity.ListIndex = 1

    DataBit.ListIndex = 1

    StopBit.ListIndex = 0

    '初始串口未打開(kāi)提示信息

    Indic_Conn.Caption = " 串口未打開(kāi)"

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

    Timer1.Enabled = False

    End Sub

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

    3.3 按鈕互鎖的過(guò)程設(shè)計(jì)

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

    Public Sub button_manage(button As Variant)

    Select Case button

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

    Case CMDConn

    '斷開(kāi)按鈕有效

    CMDDisconn.Enabled = True

    '連接按鈕無(wú)效

    CMDConn.Enabled = False

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

    Case CMDDisconn

    '連接按鈕有效

    CMDConn.Enabled = True

    '斷開(kāi)按鈕無(wú)效

    CMDDisconn.Enabled=False

    End Select

    End Sub

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

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

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

    Private Sub CMDConn_Click()

    On Error GoTo Errline

    '配置、確定打開(kāi)串口各項(xiàng)參數(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ù)打開(kāi)串口

    MSComm1.PortOpen = True

    '提示串口成功打開(kāi)

    Indic_Conn.Caption = " 串口成功打開(kāi)"

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

    '有效

    button_manage (CMDConn)

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

    Commpara.Enabled = False

    '使Timer1控件工作

    Timer1.Enabled = True

    Exit Sub

    Errline:

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

    End Sub

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

    Private Sub CMDDisconn_Click()

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

    Timer1.Enabled = False

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

    Commpara.Enabled = True

    '關(guān)閉串口

    MSComm1.PortOpen = False

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

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

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

    button_manage (CMDDisconn)

    End Sub

    3.5 數(shù)據(jù)寫(xiě)入與讀取過(guò)程程序設(shè)計(jì)

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

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

    Public addressVal As Integer

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

    Public SSetVal As Long

    由Modbus-RTU協(xié)議規(guī)范模式可知,傳輸?shù)膱?bào)文的最后兩個(gè)字節(jié)存放的是計(jì)算后的CRC校驗(yàn)碼,程序中必須有CRC校驗(yàn)碼計(jì)算程序,供系統(tǒng)發(fā)送請(qǐng)求數(shù)據(jù)和接受數(shù)據(jù)進(jìn)行數(shù)據(jù)正確性檢驗(yàn)時(shí)使用,因?yàn)镃RC校驗(yàn)碼計(jì)算是公用的函數(shù),我們將也其放在公共模塊中,CRC校驗(yàn)碼計(jì)算函數(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ù)過(guò)程開(kāi)始前,需要先根據(jù)Modbus-RTU協(xié)議模式規(guī)范,設(shè)計(jì)好所發(fā)送數(shù)據(jù)報(bào)文并賦值。本程序采的是協(xié)議中的多寄存器寫(xiě)入功能碼16,并且所讀取寄存器數(shù)量為1,根據(jù)協(xié)議規(guī)范定義一個(gè)以字節(jié)型(Byte)數(shù)據(jù)為元素類型,元素個(gè)數(shù)為11的數(shù)組,將其各位元素經(jīng)過(guò)計(jì)算和賦值,通過(guò)MSComm控件發(fā)送到RS485總線。設(shè)計(jì)的報(bào)文如表2:

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

    Private Sub WRdata(DataToWR As Long)

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

    Dim WRsend(10) As Byte

    Dim crc

    Dim btLoCRC As Byte, btHiCRC As Byte

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

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

    '寫(xiě)入功能碼位賦值

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

    '寫(xiě)入寄存器地址高、低位地址位賦值

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

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

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

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

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

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

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

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

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

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

    '計(jì)算CRC值

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

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

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

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

    '發(fā)送數(shù)據(jù)寫(xiě)入請(qǐng)求

    MSComm1.Output = WRsend

    '清緩存

    MSComm1.InBufferCount = 0

    End Sub

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

    讀取過(guò)程實(shí)現(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)

    '計(jì)算CRC值

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

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

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

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

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

    MSComm1.Output = RQsend

    '清緩存

    MSComm1.InBufferCount = 0

    End If

    End Function

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

    Private Sub Timer1_Timer()

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

    Static TMCount as integer

    TMCount = TMCount + 1

    If TMCount < 3 Then

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

    If TMCount = 1 Then

    addressVal = 138

    SendRequest (138)

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

    Else

    addressVal = 0

    SendRequest (0)

    End If

    Else

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

    Call WRdata(SSetVal)

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

    TMCount = 0

    End If

    End Sub

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

    Private Sub MSComm1_OnComm()

    '定義過(guò)程相關(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

    '計(jì)算并返回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è)定,過(guò)程代碼如下:

    Private Sub Slider1_scroll()

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

    SSetVal = 10 * Slider1.Value

    End Sub

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

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

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

    4 結(jié)論與展望

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

    參考文獻(xiàn):

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

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

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

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

    猜你喜歡
    賦值控件寄存器
    關(guān)于1 1/2 … 1/n的一類初等對(duì)稱函數(shù)的2-adic賦值
    L-代數(shù)上的賦值
    Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
    強(qiáng)賦值幺半群上的加權(quán)Mealy機(jī)與加權(quán)Moore機(jī)的關(guān)系*
    關(guān)于.net控件數(shù)組的探討
    軟件(2018年7期)2018-08-13 09:44:42
    分簇結(jié)構(gòu)向量寄存器分配策略研究*
    利用賦值法解決抽象函數(shù)相關(guān)問(wèn)題オ
    就這樣玩會(huì)VBA中常見(jiàn)的自定義控件
    電腦迷(2012年24期)2012-04-29 00:44:03
    高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
    一種可重構(gòu)線性反饋移位寄存器設(shè)計(jì)
    蓬莱市| 海南省| 长垣县| 晋宁县| 福鼎市| 托克托县| 佛山市| 旬邑县| 襄城县| 湟中县| 临潭县| 珲春市| 德昌县| 英山县| 双辽市| 淳化县| 墨脱县| 台安县| 昆明市| 安图县| 吐鲁番市| 化德县| 偃师市| 隆子县| 镇宁| 承德县| 台中县| 黄冈市| 塔城市| 博客| 北川| 社旗县| 桑日县| 曲松县| 桦川县| 平罗县| 东阳市| 彭阳县| 永济市| 浦北县| 日土县|