林 盛,遲新利,曲延華,高慶忠
(沈陽工程學(xué)院, 遼寧 沈陽 110136)
作為新一代工業(yè)控制裝置,PLC自上世紀(jì) 60年代產(chǎn)生以來,發(fā)展迅猛,被廣泛應(yīng)用于眾多的工業(yè)控制現(xiàn)場。S7-200系列的PLC是西門子公司的小型PLC,從其推向市場的那天起,就以高可靠性和性價(jià)比在國內(nèi)廣受歡迎。在工業(yè)控制現(xiàn)場,往往需要上位機(jī)(PC)對(duì)下位機(jī)(PLC)進(jìn)行監(jiān)控,以實(shí)現(xiàn)控制的分散和管理的集中。但上位機(jī)的專用組態(tài)軟件,往往價(jià)格昂貴,并且控制不夠靈活。
如果可以自己編程實(shí)現(xiàn)PLC與上位機(jī)之間的通訊,必可起到節(jié)約成本提高效率的效果??墒侨粢耆勺约簛砭帉懸欢斡糜谕ㄐ诺某绦颍仨殞?duì)相關(guān)的網(wǎng)絡(luò)協(xié)議及其他的一些較底層的技術(shù)有很深入的了解,這不是一件容易的事。本文將介紹一種簡單的方法,借助于Visual Studio2010中的VC++開發(fā)工具,用戶只需通過設(shè)置serialPort組件的屬性并調(diào)用其方法,再在PLC內(nèi)部進(jìn)行簡單的編程,就可經(jīng)由自由口實(shí)現(xiàn)PC與PLC之間的通信。
S7-200的自由口通信模式建立在RS-485硬件基礎(chǔ)上。如果PLC選擇了自由口模式,用戶就可以通過發(fā)送指令(XMT)、接收指令(RCV)、發(fā)送中斷以及接收中斷對(duì)通信口進(jìn)行相應(yīng)的操作。S7-200 PLC也允許用戶對(duì)諸如數(shù)據(jù)長度、奇偶校驗(yàn)等進(jìn)行簡單設(shè)置設(shè)置[1]。對(duì)于XMT和RCV 指令,用戶可以在編程當(dāng)中為其指定相應(yīng)的數(shù)據(jù)緩沖區(qū)。
最終的 PLC 程序應(yīng)當(dāng)由主程序、中斷(接收完成/發(fā)送完成)子程序、讀(寫)操作子程序和校驗(yàn)子程序等組成,各個(gè)程序塊各司其職。
主程序需要進(jìn)行諸如打開端口、設(shè)置波特率和奇偶校驗(yàn)等操作,并按照適當(dāng)?shù)臈l件執(zhí)行中斷或其他子程序。
主程序與子程序部分示例代碼如下:
NETWORK1//主程序
LD SM0.1//首個(gè)周期運(yùn)行標(biāo)志
MOVB 16#05,SMB130//打開 COM1,無奇偶校驗(yàn),數(shù)據(jù)位8,波特率為19 200,自由口模式
MOVB 16#EC,SMB187//接收使能,以SM188和SM189內(nèi)字符分別作為開始和停止字符,
MOVB 35,SMB188//以“#”做為開始字符
MOVB 38,SMB189//以“&”做為停止字符
MOVB 30,SMB194//30為最大可接收字節(jié)數(shù),設(shè)定范圍為1~255
MOVW +99,SMW192//設(shè)置通信信道空閑時(shí)間為99 ms
ATCH INT_0,23//以接收完成為標(biāo)識(shí),觸發(fā)中斷0
ATCH INT_2,9//以發(fā)送完成為標(biāo)識(shí),觸發(fā)中斷2
ENI //用戶中斷允許
RCV VB200 1//為COM1指定從VB200開始的緩沖區(qū)
NETWORK1//中斷0,接收完成中斷子程序
LDB=SMB186 16#20//接收完成狀態(tài)標(biāo)識(shí)
MOVB 10 SMB34//設(shè)置定時(shí)中斷0的時(shí)間間隔為10 ms
ATCH INT_1 10//定時(shí)中斷0超時(shí),觸發(fā)中斷1
CRETI//返回
NOT
RCV VB200 1//上次接收完成,開始新的接收
NETWORK1//中斷1
LD SM0.0//運(yùn)行標(biāo)識(shí)
DTCH 10//解除定時(shí)中斷
XMT VB200 1//向COM1的緩沖區(qū)返回信息
完整的程序運(yùn)行流程如圖1所示。
圖1 PLC程序流程圖Fig.1 Program Flow Chart for PLC
PC機(jī)側(cè)程序采用微軟公司的Visual C++工具開發(fā)。在以往的實(shí)踐中,大家或利用標(biāo)準(zhǔn)通信函數(shù)、或利用第三方控件 MSComm、或利用 API函數(shù)[3]來實(shí)現(xiàn)串行通信
微軟從 VisualStudio2005開發(fā)工具開始,在NETFramework類庫包含了SerialPort組件,利用此組件,可以方便地實(shí)現(xiàn)串口通訊的多種功能[2]。SerialPort組件的常用屬性極其描述如表1所示。
表1 SerialPort屬性Table 1 Attribute of SerialPort
serialPort組件的串口屬性要設(shè)置成與PLC串口參數(shù)相同的數(shù)值,其代碼如下:
serialPort1.PortName=“COM1”;//設(shè)置通訊端口為COM1
serialPort1.BaudRate=9600;//設(shè)置波特率為9600bps
serialPort1.DataBits=8;//設(shè)置8位數(shù)據(jù)位
serialPort1.StopBits=System.IO.Ports.StopBits.One;//設(shè)置1位停止位
serialPort1.Parity=System.IO.Ports.Parity.None;//無奇偶校驗(yàn)
serialPort組件打開關(guān)閉串口采用的是調(diào)用類的Open()和 Close()方法。其讀取數(shù)據(jù)的方法是多為同步阻塞調(diào)用,因此可以使用異步處理或線程間處理調(diào)用這些讀取數(shù)據(jù)的方法,從而盡量避免在主線程中調(diào)用,由此可以顯著提高系統(tǒng)的工作性能。
最終完成的通訊界面如圖2所示,在這個(gè)通信界面上可以根據(jù)實(shí)際需要,自由設(shè)置串口的各個(gè)參數(shù)。在完成通信參數(shù)、命令類型和寄存器參數(shù)的設(shè)置后,便可發(fā)送指令數(shù)據(jù)。命令類型中05代表“讀”,06代表“寫”。
圖2 PC程序界面Fig. 2 Program Interface of PC
隨著 PLC在工業(yè)現(xiàn)場的大量普及和應(yīng)用,對(duì)PLC的監(jiān)控和管理顯得日益重要。本文在PLC與PC的自由口通訊中,采用了VC++內(nèi)置的serialPort組件,不但大大簡化了編程,而且取得了不錯(cuò)的效果。在此基礎(chǔ)上,配合PC與PLC 的通信協(xié)議,就可以開發(fā)出交互界面友好、功能強(qiáng)大的上位機(jī)監(jiān)控系統(tǒng),以較低的成本,滿足眾多中小企業(yè)自動(dòng)化、信息化、網(wǎng)絡(luò)化的要求。
[1] 西門子(中國)有限公司. SIMATIC S7-200 可編程控制器系統(tǒng)手冊(cè)[G]. 2008.
[2] Ivor Horton,Visual C++2010入門經(jīng)典 [M]. 第5版.北京:清華大學(xué)出版社,2010.
[3] 高潮,羅強(qiáng),郭永彩,扶新.用Visual C++實(shí)現(xiàn)PC與PLC之間的串行通訊[J].重慶大學(xué)學(xué)報(bào)(自然科學(xué)版),2006,29(6):19-22.