1.硬件連接
一臺pc機可與一臺或最多16臺三菱fx系列通信,pc與plc之間不能直接連接。如圖1a、b為點對點結(jié)構(gòu)的連接,圖a中是通過fx-232aw單元進行rs-232c/rs-422轉(zhuǎn)換與plc編程口連接,圖b中通過在plc內(nèi)部安裝的通信功能擴展板fx-232-bd與pc連接;如圖1c所示為多點結(jié)構(gòu)的連接,fx-485-bd為安裝在plc內(nèi)部的通信功能擴展板,fx-485pc-if為rs-232c和rs-485的轉(zhuǎn)換接口。除此之外當然還可以通過其它通信模塊進行連接,不再一一贅述。下面以pc與plc之間點對點通信為例。

圖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位偶校驗位及1位停止位組成,比特率為9600 bps,字符為ascⅱ碼。數(shù)據(jù)格式如圖2所示。

圖2數(shù)據(jù)格式
2)通信命令
三菱fx系列plc有4條通信命令,分別是讀命令、寫命令、強制通命令、強制斷命令,如表1所示。
表1 fx系列plc的通信命令表

3)通信控制字符
fx系列plc采用面向字符的傳輸規(guī)程,用到5個通信控制字符,如表2所示。
表2 fx系列plc通信控制字符表
| 控制字符 | ascⅱ碼 | 功能說明 |
| enq | 05h | pc發(fā)出請求 |
| ack | 06h | plc對enq的確認回答 |
| nak | 15h | plc對enq的否認回答 |
| stx | 02h | 信息幀開始標志 |
| etx | 03h | 信息幀結(jié)束標志 |
注:當plc對計算機發(fā)來的enq不理解時,用nak回答。
4)報文格式
計算機向plc發(fā)送的報文格式如下:
| stx | cmd | 數(shù)據(jù)段 | etx | sumh | suml |
數(shù)據(jù)段格式與含義如下:
![]()
注:寫命令的數(shù)據(jù)段有數(shù)據(jù),讀命令數(shù)據(jù)段則無數(shù)據(jù)。
plc向pc發(fā)的應答報文格式如下:
![]()
注:對讀命令的應答報文數(shù)據(jù)段為要讀取的數(shù)據(jù),一個數(shù)據(jù)占兩字節(jié),分上位下位:
數(shù)據(jù)段:

對寫命令的應答報文無數(shù)據(jù)段,而用ack及nak作應答內(nèi)容。
5)傳輸規(guī)程
pc與fx系列plc間采用應答方式通信,傳輸出錯,則組織重發(fā)。其傳輸過程
如圖3所示。

圖3傳輸過程
plc根據(jù)pc的命令,在每個循環(huán)掃描結(jié)束處的end語句后組織自動應答,無需用戶在plc一方編寫程序。
3.pc通信程序的編寫
編寫pc的通信程序可采用編寫,或采用各種高級語言編寫,或采用組態(tài)軟件,或直接采用plc廠家的通信軟件(如三菱的melse medoc等)
下面利用vb6.0以一個簡單的例子來說明編寫通信程序的要點。假設(shè)pc要求從plc中讀入從d123開始的4個字節(jié)的數(shù)據(jù)(d123、d124),其傳輸應答過程及報文如圖4所示。

圖4傳輸應答過程及命令報文
命令報文中10f6h為d123的地址,04h表示要讀入4個字節(jié)的數(shù)據(jù)。校驗和sum=30h+31h+30h+46h+36h+30h+34h+03 h=174h,溢出部分不計,故sumh=7,suail=4,相應的ascⅱ碼為“37h”,“34h”。應答報文中4個字節(jié)的十六進制數(shù),其相應的ascⅱ碼為8個字節(jié),故應答報文長度為12個字節(jié)。
根據(jù)pc與fx系列plc的傳輸應答過程,利用vb的mscomm控件可以編寫如下通信程序?qū)崿F(xiàn)pc與fx系列plc之間的串行通信,以完成數(shù)據(jù)的讀取。mscomm控件可以采用輪詢或事件驅(qū)動的方法從端口獲取數(shù)據(jù)。在這個例子中使用了輪詢方法。
1)通信口初始化
private sub initialize()
mscomm1.commport =1
mscomm1.settings = “9600,e,7,1”
mscomm1.inbuffersize = 1024
mscomml.outbuffersize = 1024
mscomm1.bbbbblen = 0
mscomml.bbbbbmode = combbbbbtext
mscomm1.handshaking = comnone
mscomm1.portopen = true
end sub
2)請求通信與確認
private function makehandshaking()as boolean
dim inpackage as bbbbbb
mscomml.outbuffercount = 0
mscomml.inbuffercount = 0
mscomml.output = chr(&h5)
do
doevents
loop until mscomml.inbuffercount = 1
inpackage = mscomml.bbbbb
if inpackage = chr(&h6)then
makehandshaking = true
else
makehandshaking = false
end if
end function
3)發(fā)送命令報文
private sub sendframe ()
dim outbbbbbb as bbbbbb
mscomml.outbuffercount = 0
mscomml.inbuffercount = 0
outstrin = chr(&h2)+″on″+″10f604″+chr(&h3)+″74″
mscomml.output = outbbbbbb
end sub
4)讀取應答報文
private sub receiveframe()
dim inbbbbbb as bbbbbb
do
doevents
loop until mscomml.inbuffercount = 12
inbbbbbb = mscomml.inpult
end sub










