摘要:本文分析了Windows環(huán)境下串行通信的編程技術(shù),介紹了在Windows環(huán)境下用VB6.0語言編寫串行通信程序,實現(xiàn)了PC機與三菱 Q00PLC 之間的串行通信,并提出了在實際應(yīng)用中提高串行通信性能的方法。
關(guān)鍵詞:VB;Win32API函數(shù);串行通信;Q00PLC
一 概述
在工業(yè)控制中,串口是常用的計算機與外部串行設(shè)備之間的數(shù)據(jù)傳輸通道。由于串行通信結(jié)構(gòu)簡單、可靠性強、實現(xiàn)及使用成本低、通訊標(biāo)準(zhǔn)統(tǒng)一,因此在測控系統(tǒng)和工程中應(yīng)用十分廣泛。目前Windows在工業(yè)生產(chǎn)監(jiān)控管理系統(tǒng)中已成為主流平臺 ,Windows環(huán)境下的上、下位機之間的串行通信是設(shè)計與開發(fā)監(jiān)控管理系統(tǒng)和集散控制系統(tǒng)的重要組成部分。
Microsoft公司的VB++6.0是一種高級編程語言,它提供的串列通信控件封裝了封裝了Win32API中的標(biāo)準(zhǔn)通信函數(shù),可以讓開發(fā)者方便開發(fā)串列通信上位機程序。
PLC是現(xiàn)在控制領(lǐng)域不可缺少的部分,已經(jīng)非常普及,如何簡便的與PLC交互已經(jīng)成為眾多廠商新的競爭戰(zhàn)場。由此產(chǎn)生了人機界面、組態(tài)軟件等產(chǎn)品。這些產(chǎn)品的產(chǎn)生大大簡化了對PLC的控制,操作,使用更方便。但也有共同的缺點:價格過高和開放性較差。VB作為“原始"的編程語言在這兩方面無疑有著明顯的優(yōu)勢。
二 串行通信
串行通信是指計算機主機與外設(shè)之間以及主機系統(tǒng)與主機系統(tǒng)之間數(shù)據(jù)的串行傳送。使用串口通信時,發(fā)送和接收到的每一個字符實際上都是一次一位的傳送的,每一位為1或者為0。
2.1 串行通信的分類
串行通信可以分為同步通信和異步通信兩類。同步通信是按照軟件識別同步字符來實現(xiàn)數(shù)據(jù)的發(fā)送和接收,異步通信是一種利用字符的再同步技術(shù)的通信方式。
2.1.1 同步通信
同步通信是一種連續(xù)串行傳送數(shù)據(jù)的通信方式,一次通信只傳送一幀信息。這里的信息幀與異步通信中的字符幀不同,通常含有若干個數(shù)據(jù)字符。
它們均由同步字符、數(shù)據(jù)字符和校驗字符(CRC)組成。其中同步字符位于幀開頭,用于確認數(shù)據(jù)字符的開始。數(shù)據(jù)字符在同步字符之后,個數(shù)沒有限制,由所需傳輸?shù)臄?shù)據(jù)塊長度來決定;校驗字符有1到2個,用于接收端對接收到的字符序列進行正確性的校驗。同步通信的缺點是要求發(fā)送時鐘和接收時鐘保持嚴(yán)格的同步。
2.1.2 異步通信
異步通信中,在異步通行中有兩個比較重要的指標(biāo):字符幀格式和波特率。數(shù)據(jù)通常以字符或者字節(jié)為單位組成字符幀傳送。字符幀由發(fā)送端逐幀發(fā)送,通過傳輸線被接收設(shè)備逐幀接收。發(fā)送端和接收端可以由各自的時鐘來控制數(shù)據(jù)的發(fā)送和接收,這兩個時鐘源彼此獨立,互不同步。
接收端檢測到傳輸線上發(fā)送過來的低電平邏輯"0"(即字符幀起始位)時,確定發(fā)送端已開始發(fā)送數(shù)據(jù),每當(dāng)接收端收到字符幀中的停止位時,就知道一幀字符已經(jīng)發(fā)送完畢。
2.2 幾種流行的串行通信協(xié)議
RS-232、RS-422和RS-485都是串行數(shù)據(jù)接口標(biāo)準(zhǔn),最初都是由電子工業(yè)協(xié)會(EIA)制訂并發(fā)布的,RS-232在1962年發(fā)布,后來陸續(xù)有不少改進版本,其中最常用的是RS-232-C版。
目前RS-232是PC機與通信工業(yè)中應(yīng)用最廣泛的一種串行接口。RS-232被定義為一種在低速率串行通信中增加通信距離的單端標(biāo)準(zhǔn)。RS-232采取不平衡傳輸方式,即所謂單端通信。標(biāo)準(zhǔn)規(guī)定,RS-232的傳送距離要求可達50英尺(約15米),最高速率為20kbps。
[align=center]
圖1 RS232端口的硬件握手和連接方式[/align]
RS232的通訊信號電平為正負5~15V,這不同于數(shù)字電路的0~3V或0~5V,所以要以RS232的方式進行通訊,源信號不匹配時需要進行電壓轉(zhuǎn)換。
當(dāng)進行數(shù)據(jù)傳送時,只用一根數(shù)據(jù)線且只能進行單向傳輸?shù)姆绞?,稱為單工方式; 當(dāng)進行數(shù)據(jù)傳送時,只用一根數(shù)據(jù)線利用不同時段進行雙向傳輸?shù)姆绞?,稱為半雙工方式;當(dāng)進行數(shù)據(jù)傳送時,利用兩根數(shù)據(jù)線同時進行發(fā)送和接收的方式,稱為全雙工方式。
由于RS-232存在傳輸距離有限等不足,于是RS-422誕生了。RS-422標(biāo)準(zhǔn)全稱是“平衡電壓數(shù)字接口電路的電氣特性”,它定義了一種平衡通信接口,將傳輸速率提高到10Mbps,傳輸距離延長到4000英尺(約1219米),并允許在一條平衡總線上連接最多10個接收器。當(dāng)然,RS-422也有缺陷: 因為其平衡雙絞線的長度與傳輸速率成反比,所以在100kbps速率以內(nèi),傳輸距離才可能達到最大值,也就是說,只有在很短的距離下才能獲得最高傳輸速率。一般在100米長的雙絞線上所能獲得的最大傳輸速率僅為1Mbps。另外有一點必須指出,在RS-422通信中,只有一個主設(shè)備(Master),其余為從設(shè)備(Salve),從設(shè)備之間不能進行通信,所以RS-422支持的是點對多點的雙向通信。
為擴展應(yīng)用范圍,RS于1983年在RS-422基礎(chǔ)上制定了RS-485標(biāo)準(zhǔn),增加了多點、雙向通信能力,即允許多個發(fā)送器連接到同一條總線上,同時增加了發(fā)送器的驅(qū)動能力和沖突保護特性,擴展了總線共模范圍,后命名為TIA/RS-485-A標(biāo)準(zhǔn)。
由于RS-485是從RS-422基礎(chǔ)上發(fā)展而來的,所以RS-485許多電氣規(guī)定與RS-422相仿,如都采用平衡傳輸方式、都需要在傳輸線上接終接電阻、最大傳輸距離約為1219米、最大傳輸速率為10Mbps等。但是,RS-485可以采用二線與四線方式,采用二線制時可實現(xiàn)真正的多點雙向通信,而采用四線連接時,與RS-422一樣只能實現(xiàn)點對多點通信,但它比RS-422有改進, 無論四線還是二線連接方式總線上可接多達32個設(shè)備。
三菱的 Q00PLC 的通訊接口為RS232。
三 三菱 Q00PLC 的通訊方式
3.1 通訊協(xié)議
三菱的 Q00PLC 采用列 MELSEC 通訊協(xié)議,即 MC 協(xié)議。MC協(xié)議采用幀的形式進行通訊,它包括以下幾種形式:
(1)、QnA 兼容3C 幀。此種幀包括1-4種格式。
(2)、QnA 兼容4C 幀。此種幀包括1-5種格式。
(3)、QnA 兼容2C 幀。此種幀包括1-4種格式。
(4)、QnA 兼容3E 幀。此種幀包括1-4種格式。
(5)、A 兼容1E 幀。
3.2 實現(xiàn)方式
(1) 命令文件的發(fā)送
采用MC 協(xié)議進行的數(shù)據(jù)通訊采用半雙工通訊方式進行。訪問PLC CPU 時對于剛剛進行的命令文件發(fā)送請在接收PLC CPU 側(cè)發(fā)送的響應(yīng)文件后發(fā)送下一個命令文件(在響應(yīng)文件的接受尚未完成之前不能進行下一個命令文件的發(fā)送)
[align=center]
圖2 命令文件和響應(yīng)的順序[/align]
(2) 對于命令文件不能接收正常結(jié)束的響應(yīng)文件時
接受異常結(jié)束的響應(yīng)文件時,可根據(jù)響應(yīng)文件中的出錯代碼進行處理
3.3 Q00PLC 的幀格式
Q00PLC內(nèi)置了MC通訊協(xié)議的QnA 兼容3C 幀和 RS232 通訊接口,所以不用外加通訊模塊就可以實現(xiàn)與上位機的通訊。本例擬采用QnA 兼容3C 幀的第4種格式進行通訊。
3.3.1 對方設(shè)備讀出上位站PLC CPU 的數(shù)據(jù)時
a 上位機向 PLC CPU 側(cè)傳輸命令傳輸文件,下圖中箭頭所指的區(qū)域為請求數(shù)據(jù)區(qū)。
[align=center]
圖3 讀取時的發(fā)送幀格式[/align]
b PLC CPU 側(cè)響應(yīng)上位機的應(yīng)答傳輸文件,下圖中箭頭所指的區(qū)域為從PLC中讀出并返回的數(shù)據(jù)
[align=center]
圖4 返回的幀格式[/align]
3.3.2 對方設(shè)備向上位站PLC CPU 寫入數(shù)據(jù)時
a 幀格式與圖3中的格式類似,只是幀中的命令和子命令為讀取時的命令,請求數(shù)據(jù)區(qū)中增加了寫入的數(shù)據(jù)。
b 幀格式與圖34中的格式類似,只是沒有返回的數(shù)據(jù)。
四 Windows環(huán)境下 VB 與 Q00PLC 通信的實現(xiàn)
4.1 系統(tǒng)分析與說明
Windows系統(tǒng)為每個通信設(shè)備開辟了用戶定義的輸入/輸出緩沖區(qū),數(shù)據(jù)進出通信口均由系統(tǒng)后臺來完成,應(yīng)用程序只需完成對輸入/輸出緩沖區(qū)操作就可以了。實際過程是每接收一個字符就產(chǎn)生一個低級硬件中斷,Windows系統(tǒng)中的串行驅(qū)動程序就取得了控制權(quán),并將接收到的字符放入緩沖區(qū),然后將控制權(quán)返還給正在運行的應(yīng)用程序。如果輸入緩沖區(qū)數(shù)據(jù)已滿,串行驅(qū)動程序用當(dāng)前定義的流控制機制通知發(fā)送方停止發(fā)送數(shù)據(jù),而隊列中的數(shù)據(jù)按先進先出 (FIFO)的次序處理。
在Windows中,串行通信有兩種工作方式:查詢方式和事件驅(qū)動方式。查詢方式占用大量的CPU時間,效率較低,但是數(shù)據(jù)不易丟失;而Win32操作系統(tǒng)基于事件驅(qū)動 (也稱為消息驅(qū)動)機制的內(nèi)核,支持基于進程的協(xié)同式多任務(wù)和基于多線程的搶先式多任務(wù)?;谑录?qū)動的多線程應(yīng)用程序?qū)嶋H上在其內(nèi)部實現(xiàn)了多任務(wù)擴展,為代碼賦予了并行執(zhí)行的特性,可以使應(yīng)用程序?qū)PU的利用率大大提高,從而提高系統(tǒng)的響應(yīng)能力,加快信息處理速度,提高通信程序的實時性和增大數(shù)據(jù)吞吐量。
基于以上分析,以事件驅(qū)動方式實現(xiàn)Windows下的串行通信更具優(yōu)勢,它能完成較大數(shù)據(jù)量的實時通信,大大提高了通信的效率,故本程序采用此種方式進行串行通信,至于通信的可靠性可以通過軟件設(shè)計來保證。
Windows平臺下利用VB實現(xiàn)串口通信主要有以下兩種方法:
1)使用Windows API(Application Program Interface)函數(shù)。這種方法可編寫移植性強的通信程序,但必須首先用Declare聲明VB中所要用的動態(tài)鏈接庫DLL,這需要對Windows API函數(shù)有深入的了解,編程較復(fù)雜。
2)使用Microsoft公司提供的Active X控件MSComm。該通信控件通過改變對象屬性,向?qū)ο蟀l(fā)送消息及為對象事件編寫響應(yīng)代碼,可以方便地完成用戶應(yīng)用程序間的串行通信,既可實現(xiàn)API函數(shù)的所有功能,又使得編程效率提高,應(yīng)用功能增強,并且程序簡單明了。
對于MSComm控件實現(xiàn)串口通信的操作很多文獻都有論述,該控件的主要屬性可參考相關(guān)文獻,在此僅列出常用的屬性和方法。需要強調(diào)的是:在數(shù)據(jù)發(fā)送與接收過程中,都要通過一個Variant類型變量作為中介。發(fā)送數(shù)據(jù)時,必須先將要發(fā)送的數(shù)據(jù)賦給一個Variant類型變量,再把該Variant變量賦值給MSComm的Output屬性;同樣接受數(shù)據(jù)時,也應(yīng)先將MSComm的Input屬性賦值給Variant變量,待接收端收到后必須轉(zhuǎn)換成其它類型(如字符型、二進制型)的數(shù)據(jù)才能進行處理。本例采用MSComm控件來實現(xiàn)。
下面介紹MSCOMM控件的屬性:
CommPort:設(shè)定通信連接端口代號,程序必須指定所要使用的串行端口號,Windows系統(tǒng)使用所設(shè)定的端口與外界通信。
PortOpen:設(shè)定通信口狀態(tài),若為真,通信端口打開,否則關(guān)閉。
Settings:設(shè)定通信口參數(shù),其格式是"bbbb,p,d,s",其中bbbb為通信速率(波特率),p為通信檢查方式(奇偶校驗),d為數(shù)據(jù)位數(shù),s為停止位數(shù),其設(shè)定應(yīng)與PLC的設(shè)定一致。
Input:將對方傳送至輸入緩沖區(qū)的字符讀入到程序。
Output:將字符寫入輸出緩沖區(qū)。
InBufferCount:傳回接收緩沖區(qū)中的字符數(shù)。
OutBufferCount:傳回輸出緩沖區(qū)中的字符數(shù)。
InputLen:設(shè)定串行端口讀入字符串的長度。
InputMode:設(shè)定接收數(shù)據(jù)的方式。
Rthreshold:設(shè)定引發(fā)接收事件的字符數(shù)。
CommEvent:傳回OnComm事件發(fā)生時的數(shù)值碼
OnComm事件:無論是錯誤或事件發(fā)生,都會觸發(fā)此事件。
4.2 具體實現(xiàn)
本例程序為讀取Q00PLC的輸入輸出點的狀態(tài)。監(jiān)控界面如下所示:
[align=center]
圖5 監(jiān)控界面[/align]
4.2.1 控件參數(shù)的初始化
MSComm1.InBufferCount = 0 ‘清空輸入緩沖區(qū)
MSComm1.OutBufferCount = 0 ‘清空輸出緩沖區(qū)
MSComm1.CommPort = 1 ‘設(shè)定串行通信口為com1
MSComm1.Settings = "19200,O,8,1" ‘波特率19200,奇校驗,8位數(shù)據(jù)位,1位停止位
MSComm1.InputLen = 0 ‘一次讀入輸入緩沖區(qū)中的字符串的長度為緩沖區(qū)中的所有數(shù)據(jù)
MSComm1.RThreshold = 62 ‘輸入緩沖區(qū)中每次接到62個字符就產(chǎn)生一次OnComm事件
MSComm1.PortOpen = True ‘打開端口
Dim STX As String ‘以下為MC協(xié)議中的ASCII碼
Dim ENQ As String
Dim ACK As String
Dim CR As String
Dim LF As String
Dim NAK As String
STX = Chr$(&H2)
ENQ = Chr$(&H5)
ACK = Chr$(&H6)
CR = Chr$(&HD)
LF = Chr$(&HA)
4.2.2 計算機與PLC通信程序
Private Sub Timer1_Timer()
Dim SD As String
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
If F = 1 Then
SD = ENQ + "F9" + "0000FF00" + "0401" + "0001" + "X*" + "000020"
+ "0030" + CR + LF
Else
SD = ENQ + "F9" + "0000FF00" + "0401" + "0001" + "Y*" + "000050"
+ "0030" + CR + LF
End If
MSComm1.Output = SD
Timer1.Enabled = False
End Sub
‘OnComm事件
Private Sub MSComm1_OnComm()
Dim i, j As Integer
Dim RD, Temp, RDw As String
If MSComm1.CommEvent = comEvReceive Then
RD = MSComm1.Input
If Left(RD, 1) = STX Then
RDw = Mid(RD, 12, 48)
j = 0
Select Case F
Case 1
j = 48
Case -1
j = 96
End Select
For i = 1 To 48
Temp = Mid(RDw, i, 1)
If F = 1 Then
If Temp = "1" Then
Lalel(i - 1).BackColor = &H80FF80
Else
If i <= 3 Then
Lalel(i - 1).BackColor = &HFF
Else
Lalel(i - 1).BackColor = &HFFFF00
End If
End If
Else
If Temp = "1" Then
If i = 42 Then
Lalel(i - 1 + 48).BackColor = &HFF
Else
Lalel(i - 1 + 48).BackColor = &H80FF80
End If
Else
Lalel(i - 1 + 48).BackColor = &HFFFF00
End If
End If
Next i
F = F * (-1)
Timer1.Enabled = True
‘F = F * (-1)
End If
End If
End Sub
五 結(jié)束語
VB是一種成熟的、面向?qū)ο蟮某绦蛟O(shè)計語言,采用它編寫的Windows環(huán)境下PC機與Q00PLC的串行通訊軟件具有程序?qū)崿F(xiàn)簡便、通用性強的特點,減輕了軟件開發(fā)者的工作量,對于國內(nèi)的中、小型企業(yè)具有現(xiàn)實意義。
參考文獻
[1] 王棟,Visual Basic6.0程序設(shè)計實用教程[M],清華大學(xué)出版社,2003
[2] 工業(yè)接口與通訊,呂志藝,2003
[3] Q 系列 MELSEC 通訊協(xié)議參考手冊
[4] 三菱 Q 系列可編程控制器編程手冊;
作者簡介:
馬磊:1981年10月12日出生;性別:女;籍貫:山東省魏橋鎮(zhèn)南鄭村;在讀研究生;研究方向:造紙裝備與控制。
呂多勇:1982年6月出生;男;籍貫:山東省濟南市歷城區(qū);本科,學(xué)士學(xué)位;
聯(lián)系方式:通訊地址:山東省濟南市 大學(xué)科技園 山東輕工業(yè)學(xué)院 輕化與環(huán)境工程學(xué)院,06級研究生,馬磊。 郵編:250353 郵箱:aima2005@126.com