摘要:本文分析了Windows環境下串行通信的編程技術,介紹了在Windows環境下用VB6.0語言編寫串行通信程序,實現了PC機與三菱 Q00PLC 之間的串行通信,并提出了在實際應用中提高串行通信性能的方法。
關鍵詞:VB;Win32API函數;串行通信;Q00PLC
一 概述
在工業控制中,串口是常用的計算機與外部串行設備之間的數據傳輸通道。由于串行通信結構簡單、可靠性強、實現及使用成本低、通訊標準統一,因此在測控系統和工程中應用十分廣泛。目前Windows在工業生產監控管理系統中已成為主流平臺 ,Windows環境下的上、下位機之間的串行通信是設計與開發監控管理系統和集散控制系統的重要組成部分。
Microsoft公司的VB++6.0是一種高級編程語言,它提供的串列通信控件封裝了封裝了Win32API中的標準通信函數,可以讓開發者方便開發串列通信上位機程序。
PLC是現在控制領域不可缺少的部分,已經非常普及,如何簡便的與PLC交互已經成為眾多廠商新的競爭戰場。由此產生了人機界面、組態軟件等產品。這些產品的產生大大簡化了對PLC的控制,操作,使用更方便。但也有共同的缺點:價格過高和開放性較差。VB作為“原始"的編程語言在這兩方面無疑有著明顯的優勢。
二 串行通信
串行通信是指計算機主機與外設之間以及主機系統與主機系統之間數據的串行傳送。使用串口通信時,發送和接收到的每一個字符實際上都是一次一位的傳送的,每一位為1或者為0。
2.1 串行通信的分類
串行通信可以分為同步通信和異步通信兩類。同步通信是按照軟件識別同步字符來實現數據的發送和接收,異步通信是一種利用字符的再同步技術的通信方式。
2.1.1 同步通信
同步通信是一種連續串行傳送數據的通信方式,一次通信只傳送一幀信息。這里的信息幀與異步通信中的字符幀不同,通常含有若干個數據字符。
它們均由同步字符、數據字符和校驗字符(CRC)組成。其中同步字符位于幀開頭,用于確認數據字符的開始。數據字符在同步字符之后,個數沒有限制,由所需傳輸的數據塊長度來決定;校驗字符有1到2個,用于接收端對接收到的字符序列進行正確性的校驗。同步通信的缺點是要求發送時鐘和接收時鐘保持嚴格的同步。
2.1.2 異步通信
異步通信中,在異步通行中有兩個比較重要的指標:字符幀格式和波特率。數據通常以字符或者字節為單位組成字符幀傳送。字符幀由發送端逐幀發送,通過傳輸線被接收設備逐幀接收。發送端和接收端可以由各自的時鐘來控制數據的發送和接收,這兩個時鐘源彼此獨立,互不同步。
接收端檢測到傳輸線上發送過來的低電平邏輯"0"(即字符幀起始位)時,確定發送端已開始發送數據,每當接收端收到字符幀中的停止位時,就知道一幀字符已經發送完畢。
2.2 幾種流行的串行通信協議
RS-232、RS-422和RS-485都是串行數據接口標準,最初都是由電子工業協會(EIA)制訂并發布的,RS-232在1962年發布,后來陸續有不少改進版本,其中最常用的是RS-232-C版。
目前RS-232是PC機與通信工業中應用最廣泛的一種串行接口。RS-232被定義為一種在低速率串行通信中增加通信距離的單端標準。RS-232采取不平衡傳輸方式,即所謂單端通信。標準規定,RS-232的傳送距離要求可達50英尺(約15米),最高速率為20kbps。
[align=center]

圖1 RS232端口的硬件握手和連接方式[/align]
RS232的通訊信號電平為正負5~15V,這不同于數字電路的0~3V或0~5V,所以要以RS232的方式進行通訊,源信號不匹配時需要進行電壓轉換。
當進行數據傳送時,只用一根數據線且只能進行單向傳輸的方式,稱為單工方式; 當進行數據傳送時,只用一根數據線利用不同時段進行雙向傳輸的方式,稱為半雙工方式;當進行數據傳送時,利用兩根數據線同時進行發送和接收的方式,稱為全雙工方式。
由于RS-232存在傳輸距離有限等不足,于是RS-422誕生了。RS-422標準全稱是“平衡電壓數字接口電路的電氣特性”,它定義了一種平衡通信接口,將傳輸速率提高到10Mbps,傳輸距離延長到4000英尺(約1219米),并允許在一條平衡總線上連接最多10個接收器。當然,RS-422也有缺陷: 因為其平衡雙絞線的長度與傳輸速率成反比,所以在100kbps速率以內,傳輸距離才可能達到最大值,也就是說,只有在很短的距離下才能獲得最高傳輸速率。一般在100米長的雙絞線上所能獲得的最大傳輸速率僅為1Mbps。另外有一點必須指出,在RS-422通信中,只有一個主設備(Master),其余為從設備(Salve),從設備之間不能進行通信,所以RS-422支持的是點對多點的雙向通信。
為擴展應用范圍,RS于1983年在RS-422基礎上制定了RS-485標準,增加了多點、雙向通信能力,即允許多個發送器連接到同一條總線上,同時增加了發送器的驅動能力和沖突保護特性,擴展了總線共模范圍,后命名為TIA/RS-485-A標準。
由于RS-485是從RS-422基礎上發展而來的,所以RS-485許多電氣規定與RS-422相仿,如都采用平衡傳輸方式、都需要在傳輸線上接終接電阻、最大傳輸距離約為1219米、最大傳輸速率為10Mbps等。但是,RS-485可以采用二線與四線方式,采用二線制時可實現真正的多點雙向通信,而采用四線連接時,與RS-422一樣只能實現點對多點通信,但它比RS-422有改進, 無論四線還是二線連接方式總線上可接多達32個設備。
三菱的 Q00PLC 的通訊接口為RS232。
三 三菱 Q00PLC 的通訊方式
3.1 通訊協議
三菱的 Q00PLC 采用列 MELSEC 通訊協議,即 MC 協議。MC協議采用幀的形式進行通訊,它包括以下幾種形式:
(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 實現方式
(1) 命令文件的發送
采用MC 協議進行的數據通訊采用半雙工通訊方式進行。訪問PLC CPU 時對于剛剛進行的命令文件發送請在接收PLC CPU 側發送的響應文件后發送下一個命令文件(在響應文件的接受尚未完成之前不能進行下一個命令文件的發送)
[align=center]

圖2 命令文件和響應的順序[/align]
(2) 對于命令文件不能接收正常結束的響應文件時
接受異常結束的響應文件時,可根據響應文件中的出錯代碼進行處理
3.3 Q00PLC 的幀格式
Q00PLC內置了MC通訊協議的QnA 兼容3C 幀和 RS232 通訊接口,所以不用外加通訊模塊就可以實現與上位機的通訊。本例擬采用QnA 兼容3C 幀的第4種格式進行通訊。
3.3.1 對方設備讀出上位站PLC CPU 的數據時
a 上位機向 PLC CPU 側傳輸命令傳輸文件,下圖中箭頭所指的區域為請求數據區。
[align=center]

圖3 讀取時的發送幀格式[/align]
b PLC CPU 側響應上位機的應答傳輸文件,下圖中箭頭所指的區域為從PLC中讀出并返回的數據
[align=center]

圖4 返回的幀格式[/align]
3.3.2 對方設備向上位站PLC CPU 寫入數據時
a 幀格式與圖3中的格式類似,只是幀中的命令和子命令為讀取時的命令,請求數據區中增加了寫入的數據。
b 幀格式與圖34中的格式類似,只是沒有返回的數據。
四 Windows環境下 VB 與 Q00PLC 通信的實現
4.1 系統分析與說明
Windows系統為每個通信設備開辟了用戶定義的輸入/輸出緩沖區,數據進出通信口均由系統后臺來完成,應用程序只需完成對輸入/輸出緩沖區操作就可以了。實際過程是每接收一個字符就產生一個低級硬件中斷,Windows系統中的串行驅動程序就取得了控制權,并將接收到的字符放入緩沖區,然后將控制權返還給正在運行的應用程序。如果輸入緩沖區數據已滿,串行驅動程序用當前定義的流控制機制通知發送方停止發送數據,而隊列中的數據按先進先出 (FIFO)的次序處理。
在Windows中,串行通信有兩種工作方式:查詢方式和事件驅動方式。查詢方式占用大量的CPU時間,效率較低,但是數據不易丟失;而Win32操作系統基于事件驅動 (也稱為消息驅動)機制的內核,支持基于進程的協同式多任務和基于多線程的搶先式多任務。基于事件驅動的多線程應用程序實際上在其內部實現了多任務擴展,為代碼賦予了并行執行的特性,可以使應用程序對CPU的利用率大大提高,從而提高系統的響應能力,加快信息處理速度,提高通信程序的實時性和增大數據吞吐量。
基于以上分析,以事件驅動方式實現Windows下的串行通信更具優勢,它能完成較大數據量的實時通信,大大提高了通信的效率,故本程序采用此種方式進行串行通信,至于通信的可靠性可以通過軟件設計來保證。
Windows平臺下利用VB實現串口通信主要有以下兩種方法:
1)使用Windows API(Application Program Interface)函數。這種方法可編寫移植性強的通信程序,但必須首先用Declare聲明VB中所要用的動態鏈接庫DLL,這需要對Windows API函數有深入的了解,編程較復雜。
2)使用Microsoft公司提供的Active X控件MSComm。該通信控件通過改變對象屬性,向對象發送消息及為對象事件編寫響應代碼,可以方便地完成用戶應用程序間的串行通信,既可實現API函數的所有功能,又使得編程效率提高,應用功能增強,并且程序簡單明了。
對于MSComm控件實現串口通信的操作很多文獻都有論述,該控件的主要屬性可參考相關文獻,在此僅列出常用的屬性和方法。需要強調的是:在數據發送與接收過程中,都要通過一個Variant類型變量作為中介。發送數據時,必須先將要發送的數據賦給一個Variant類型變量,再把該Variant變量賦值給MSComm的Output屬性;同樣接受數據時,也應先將MSComm的Input屬性賦值給Variant變量,待接收端收到后必須轉換成其它類型(如字符型、二進制型)的數據才能進行處理。本例采用MSComm控件來實現。
下面介紹MSCOMM控件的屬性:
CommPort:設定通信連接端口代號,程序必須指定所要使用的串行端口號,Windows系統使用所設定的端口與外界通信。
PortOpen:設定通信口狀態,若為真,通信端口打開,否則關閉。
Settings:設定通信口參數,其格式是"bbbb,p,d,s",其中bbbb為通信速率(波特率),p為通信檢查方式(奇偶校驗),d為數據位數,s為停止位數,其設定應與PLC的設定一致。
Input:將對方傳送至輸入緩沖區的字符讀入到程序。
Output:將字符寫入輸出緩沖區。
InBufferCount:傳回接收緩沖區中的字符數。
OutBufferCount:傳回輸出緩沖區中的字符數。
InputLen:設定串行端口讀入字符串的長度。
InputMode:設定接收數據的方式。
Rthreshold:設定引發接收事件的字符數。
CommEvent:傳回OnComm事件發生時的數值碼
OnComm事件:無論是錯誤或事件發生,都會觸發此事件。
4.2 具體實現
本例程序為讀取Q00PLC的輸入輸出點的狀態。監控界面如下所示:
[align=center]

圖5 監控界面[/align]
4.2.1 控件參數的初始化
MSComm1.InBufferCount = 0 ‘清空輸入緩沖區
MSComm1.OutBufferCount = 0 ‘清空輸出緩沖區
MSComm1.CommPort = 1 ‘設定串行通信口為com1
MSComm1.Settings = "19200,O,8,1" ‘波特率19200,奇校驗,8位數據位,1位停止位
MSComm1.InputLen = 0 ‘一次讀入輸入緩沖區中的字符串的長度為緩沖區中的所有數據
MSComm1.RThreshold = 62 ‘輸入緩沖區中每次接到62個字符就產生一次OnComm事件
MSComm1.PortOpen = True ‘打開端口
Dim STX As String ‘以下為MC協議中的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
五 結束語
VB是一種成熟的、面向對象的程序設計語言,采用它編寫的Windows環境下PC機與Q00PLC的串行通訊軟件具有程序實現簡便、通用性強的特點,減輕了軟件開發者的工作量,對于國內的中、小型企業具有現實意義。
參考文獻
[1] 王棟,Visual Basic6.0程序設計實用教程[M],清華大學出版社,2003
[2] 工業接口與通訊,呂志藝,2003
[3] Q 系列 MELSEC 通訊協議參考手冊
[4] 三菱 Q 系列可編程控制器編程手冊;
作者簡介:
馬磊:1981年10月12日出生;性別:女;籍貫:山東省魏橋鎮南鄭村;在讀研究生;研究方向:造紙裝備與控制。
呂多勇:1982年6月出生;男;籍貫:山東省濟南市歷城區;本科,學士學位;
聯系方式:通訊地址:山東省濟南市 大學科技園 山東輕工業學院 輕化與環境工程學院,06級研究生,馬磊。 郵編:250353 郵箱:aima2005@126.com