1.硬件連接
一臺(tái)pc機(jī)可與一臺(tái)或最多16臺(tái)三菱fx系列plc通信,pc與plc之間不能直接連接。如圖1a、b為點(diǎn)對(duì)點(diǎn)結(jié)構(gòu)的連接,圖a中是通過fx-232aw單元進(jìn)行rs-232c/rs-422轉(zhuǎn)換與plc編程口連接,圖b中通過在plc內(nèi)部安裝的通信功能擴(kuò)展板fx-232-bd與pc連接;如圖1c所示為多點(diǎn)結(jié)構(gòu)的連接,fx-485-bd為安裝在plc內(nèi)部的通信功能擴(kuò)展板,fx-485pc-if為rs-232c和rs-485的轉(zhuǎn)換接口。除此之外當(dāng)然還可以通過其它通信模塊進(jìn)行連接,不再一一贅述。下面以pc與plc之間點(diǎn)對(duì)點(diǎn)通信為例。
圖1 pc與fx的硬件連接圖
2.三菱fx系列plc通信協(xié)議
pc中必須依據(jù)所連接plc的通信規(guī)程來編寫通信協(xié)議,所以我們先要熟悉fx系列plc的通信協(xié)議。
1)數(shù)據(jù)格式
三菱 fx系列plc采用異步格式,由1位起始位、7位數(shù)據(jù)位、1位偶校驗(yàn)位及1位停止位組成,比特率為9600 bps,字符為ascⅱ碼。數(shù)據(jù)格式如圖2所示。
圖2 數(shù)據(jù)格式
2)通信命令
三菱fx系列plc有4條通信命令,分別是讀命令、寫命令、強(qiáng)制通命令、強(qiáng)制斷命令,如表1所示。
表1 fx系列plc的通信命令表
3)通信控制字符
fx系列plc采用面向字符的傳輸規(guī)程,用到5個(gè)通信控制字符,如表2所示。
表2 fx系列plc通信控制字符表
控制字符
ascⅱ碼
功能說明
enq
05h
pc發(fā)出請(qǐng)求
ack
06h
plc對(duì)enq的確認(rèn)回答
nak
15h
plc對(duì)enq的否認(rèn)回答
stx
02h
信息幀開始標(biāo)志
etx
03h
信息幀結(jié)束標(biāo)志
注:當(dāng)plc對(duì)計(jì)算機(jī)發(fā)來的enq不理解時(shí),用nak回答。
4)報(bào)文格式
計(jì)算機(jī)向plc發(fā)送的報(bào)文格式如下:
stx
cmd
數(shù)據(jù)段
etx
sumh
suml
其中,stx為開始標(biāo)志:02h;etx為結(jié)束標(biāo)志:03h;cmd為命令的ascⅱ碼;sumh、suml為按字節(jié)求累加和,溢出不計(jì)。由于每字節(jié)十六進(jìn)制數(shù)變?yōu)閮勺止?jié)的ascⅱ碼,故校驗(yàn)和為sumh與suml。
數(shù)據(jù)段格式與含義如下:
注:寫命令的數(shù)據(jù)段有數(shù)據(jù),讀命令數(shù)據(jù)段則無數(shù)據(jù)。
plc向pc發(fā)的應(yīng)答報(bào)文格式如下:
注:對(duì)讀命令的應(yīng)答報(bào)文數(shù)據(jù)段為要讀取的數(shù)據(jù),一個(gè)數(shù)據(jù)占兩字節(jié),分上位下位:
數(shù)據(jù)段:
對(duì)寫命令的應(yīng)答報(bào)文無數(shù)據(jù)段,而用ack及nak作應(yīng)答內(nèi)容。
5)傳輸規(guī)程
pc與fx系列plc間采用應(yīng)答方式通信,傳輸出錯(cuò),則組織重發(fā)。其傳輸過程
如圖3所示。
圖3 傳輸過程
plc根據(jù)pc的命令,在每個(gè)循環(huán)掃描結(jié)束處的end語句后組織自動(dòng)應(yīng)答,無需用戶在plc一方編寫程序。
3.pc通信程序的編寫
編寫pc的通信程序可采用匯編語言編寫,或采用各種高級(jí)語言編寫,或采用工控組態(tài)軟件,或直接采用plc廠家的通信軟件(如三菱的melse medoc等)
下面利用vb6.0以一個(gè)簡單的例子來說明編寫通信程序的要點(diǎn)。假設(shè)pc要求從plc中讀入從d123開始的4個(gè)字節(jié)的數(shù)據(jù)(d123、d124),其傳輸應(yīng)答過程及報(bào)文如圖4所示。
圖4 傳輸應(yīng)答過程及命令報(bào)文
命令報(bào)文中10f6h為d123的地址,04h表示要讀入4個(gè)字節(jié)的數(shù)據(jù)。校驗(yàn)和sum=30h+31h+30h+46h+36h+30h+34h+03 h=174h,溢出部分不計(jì),故sumh=7,suail=4,相應(yīng)的ascⅱ碼為“37h”,“34h”。應(yīng)答報(bào)文中4個(gè)字節(jié)的十六進(jìn)制數(shù),其相應(yīng)的ascⅱ碼為8個(gè)字節(jié),故應(yīng)答報(bào)文長度為12個(gè)字節(jié)。
根據(jù)pc與fx系列plc的傳輸應(yīng)答過程,利用vb的mscomm控件可以編寫如下通信程序?qū)崿F(xiàn)pc與fx系列plc之間的串行通信,以完成數(shù)據(jù)的讀取。mscomm控件可以采用輪詢或事件驅(qū)動(dòng)的方法從端口獲取數(shù)據(jù)。在這個(gè)例子中使用了輪詢方法。
1)通信口初始化
private sub initialize()
mscomm1.commport =1
mscomm1.settings = “9600,e,7,1”
mscomm1.inbuffersize = 1024
mscomml.outbuffersize = 1024
mscomm1.inputlen = 0
mscomml.inputmode = cominputtext
mscomm1.handshaking = comnone
mscomm1.portopen = true
end sub
2)請(qǐng)求通信與確認(rèn)
private function makehandshaking()as boolean
dim inpackage as string
mscomml.outbuffercount = 0
mscomml.inbuffercount = 0
mscomml.output = chr(&h5)
do
doevents
loop until mscomml.inbuffercount = 1
inpackage = mscomml.input
if inpackage = chr(&h6) then
makehandshaking = true
else
makehandshaking = false
end if
end function
3)發(fā)送命令報(bào)文
private sub sendframe ()
dim outstring as string
mscomml.outbuffercount = 0
mscomml.inbuffercount = 0
outstrin = chr(&h2)+″on″+″10f604″+chr(&h3)+″74″
mscomml.output = outstring
end sub
4)讀取應(yīng)答報(bào)文
private sub receiveframe()
dim instring as string
do
doevents
loop until mscomml.inbuffercount = 12
instring = mscomml.inpult
end sub