摘要:本文對(duì)Java實(shí)現(xiàn)串行通信的理論進(jìn)行了分析,給出了一種基于Java語言的計(jì)算機(jī)與PLC串口通信方案。
關(guān)鍵詞:Java;串口通信;計(jì)算機(jī);PLC
中圖分類號(hào):TN91 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-7712(2012)20-0020-01
Java是一種面向?qū)ο蟮模С志W(wǎng)絡(luò)通信的程序設(shè)計(jì)語言,該語言不僅具有C++和Smalltalk語言的諸多優(yōu)點(diǎn),還能夠進(jìn)行網(wǎng)絡(luò)通信、實(shí)現(xiàn)并發(fā)程序設(shè)計(jì)、對(duì)多媒體數(shù)據(jù)進(jìn)行控制等,這些特點(diǎn)都決定了Java語言具有強(qiáng)健的魯棒性。再者,Java對(duì)不同平臺(tái)具有良好的支持性能,可以通過一次編譯實(shí)現(xiàn)跨平臺(tái)通信和數(shù)據(jù)傳輸。這個(gè)特性幾號(hào)了解決了控制程序移植困難的問題,減少了開發(fā)周期,降低了開發(fā)難度。
PLC的抗干擾能力強(qiáng)、可靠性高、便于應(yīng)用和集成,因此被應(yīng)用在許多領(lǐng)域。通過PLC在分布式系統(tǒng)和數(shù)據(jù)采集系統(tǒng)中實(shí)現(xiàn)串行通信已經(jīng)得到了廣泛的應(yīng)用。
本文就利用Java語言實(shí)現(xiàn)計(jì)算機(jī)與PLC的串口通信進(jìn)行了研究。
一、基于Java的串口通信技術(shù)
(一)Java本地調(diào)用技術(shù)。將Java與硬件系統(tǒng)進(jìn)行關(guān)聯(lián)需要使用Java本地調(diào)用技術(shù),也就是JNI技術(shù)。該技術(shù)通過Java虛擬機(jī)實(shí)現(xiàn)與用其他語言編寫的應(yīng)用程序和庫(kù)的相互操作,其作用可以表示為兩者之間的中介。
(二)Javax.comm類庫(kù)。串口通信是計(jì)算機(jī)與其他外部設(shè)備進(jìn)行數(shù)據(jù)傳輸?shù)闹饕绞剑遣荒苤苯永肑ava語言實(shí)現(xiàn)串口通信的編程控制,因此需要借助其他語言如匯編、C/C++等實(shí)現(xiàn)對(duì)硬件的控制,在此之上利用JNI技術(shù)實(shí)現(xiàn)對(duì)串行通信的控制。雖然過程可能比較繁瑣,但是SUN公司提供了javax.comm類庫(kù),通過該庫(kù)調(diào)用合適的API即可通過Java實(shí)現(xiàn)串口的通信。該庫(kù)提供有四個(gè)接口,六個(gè)類,三個(gè)層次。
其中上層類中的CommPortIdentifier可以使應(yīng)用程序用方法和驅(qū)動(dòng)器對(duì)可用的通信端口進(jìn)行查找,選擇某一端口后打開該端口利用通過其他類庫(kù),如底層類庫(kù)等,進(jìn)行通信。
類CommPort則是一個(gè)用來描述底層系統(tǒng)定義的有效通訊端口抽象類,通過該類可以控制通信端口實(shí)現(xiàn)傳輸?shù)姆椒ā?/p>
底層類中的兩個(gè)類庫(kù)分別提供串行或并行通訊接口,分別定義通信所需的基本功能的方法。
由于驅(qū)動(dòng)層類不直接提供使用,故本文不做討論。
具體通信流程為:搜索系統(tǒng)中的可用端口,選中其中一個(gè)可用端口創(chuàng)建傳輸對(duì)象,然后將該對(duì)象投射到某一類型的物理通訊設(shè)備中,標(biāo)注該端口打開,就可以通過調(diào)用不同的方法進(jìn)行數(shù)據(jù)的讀寫和傳遞,使用完畢后關(guān)閉該端口。
二、PLC串行通信
(一)通信協(xié)議。上位機(jī)與PLC之間的通信需要使用到通信協(xié)議,實(shí)現(xiàn)一次數(shù)據(jù)或命令的傳輸被稱為一個(gè)數(shù)據(jù)幀或者命令幀,PLC接收到相應(yīng)的幀后對(duì)上位機(jī)進(jìn)行反饋。
一個(gè)完整的幀結(jié)構(gòu)包含如下幾個(gè)部分:協(xié)議幀結(jié)構(gòu)標(biāo)志、PLC判別節(jié)點(diǎn)號(hào)、識(shí)別碼、正文、FSC幀檢查碼、終止符等。
(二)通信順序。具體的通信順序如下:首先上位機(jī)完成定界符的設(shè)定后對(duì)其控制的PLC設(shè)備發(fā)送控制幀,然后PLC在接收到定界符后向上位機(jī)進(jìn)行反饋確定兩者之間開始通信,上位機(jī)接收到PLC發(fā)送的反饋定界符后開始傳輸數(shù)據(jù)幀;當(dāng)PLC向上位機(jī)發(fā)送數(shù)據(jù)時(shí),同樣需要先發(fā)送定界符并確認(rèn)返回定界符,然后才能開始進(jìn)行數(shù)據(jù)傳輸,數(shù)據(jù)傳輸完畢后以終止符結(jié)尾。
三、網(wǎng)絡(luò)中的基于Java控制技術(shù)的多PLC通信技術(shù)
本文使用一臺(tái)上位機(jī)同時(shí)對(duì)多個(gè)PLC設(shè)備進(jìn)行控制,鑒于上位機(jī)只有RS-232接口,故在硬件配置中需要使用RS-232與RS-485的轉(zhuǎn)換器,通過該轉(zhuǎn)換器實(shí)現(xiàn)利用RS-485網(wǎng)絡(luò)對(duì)PLC設(shè)備的遠(yuǎn)程控制。
系統(tǒng)的軟件部分流程為首先進(jìn)行程序初始化工作,然后與控制設(shè)備進(jìn)行連接,連接成功后通過命令幀或者數(shù)據(jù)幀實(shí)現(xiàn)上位機(jī)與不同PLC之間的數(shù)據(jù)通信和遠(yuǎn)程控制。
打開串口代碼為:
try{
PortId=CommPortIdentifier.getPortIdentifiers(PortName);
try{
serialPort=().portld.open(“Serial_Communication”,2000);
}catch(PortInUseException e)
{return InitFail};
}try{
In=SerialPort.getInputStream();
Out=SerialPort.getOutputStream();
}catch(IOException e)
{return InitFail};
串口配置代碼為:
try
{serialPort.setSerialPortParams(9600,//傳輸波特率為9600
SerialPort.DATABITS_16,//數(shù)據(jù)位為16位
SerialPort.STOPBITS_2,//停止位為2位
SerialPort.PATITY_NONE);//無數(shù)據(jù)校驗(yàn)
}catch(UnsupportedCommOperation Exception e)
{return InitFail};
本系統(tǒng)使用監(jiān)聽的方式實(shí)現(xiàn)數(shù)據(jù)傳遞,該方式的好處在于響應(yīng)速度快、實(shí)時(shí)性高。監(jiān)聽法是緩存區(qū)存儲(chǔ)了新的數(shù)據(jù)時(shí),端口會(huì)根據(jù)存儲(chǔ)狀態(tài)的改變而產(chǎn)生變化,監(jiān)聽器將監(jiān)聽結(jié)果傳遞給應(yīng)用程序,應(yīng)用程序?qū)Σ煌瑪?shù)據(jù)進(jìn)行相應(yīng)的處理,完成數(shù)據(jù)的傳輸和狀態(tài)的監(jiān)控。
四、結(jié)語
應(yīng)用Java實(shí)現(xiàn)計(jì)算機(jī)與PLC的串行通信具有非常廣泛的應(yīng)用,其對(duì)分布式控制系統(tǒng)設(shè)計(jì)、現(xiàn)場(chǎng)設(shè)備的數(shù)據(jù)采集與遠(yuǎn)程控制等都具有現(xiàn)實(shí)指導(dǎo)意義。這種通信方式簡(jiǎn)單可靠,投資少,速度快,具有可觀的應(yīng)用前景。
參考文獻(xiàn):
[1]吳興軍,胡漢春.Java實(shí)現(xiàn)計(jì)算機(jī)與OMRON PLC串口通信[J].工業(yè)儀表與自動(dòng)化裝置,2010,1.
[2]王峰,鄭曉麗,陸金桂.基于Java的PC與Simens S7-200 PLC的通信[J].交通與計(jì)算機(jī),2005,3.