王 蕓(1982-)
女,湖北人 ,助教,碩士研究生,(安徽師范大學(xué)物電學(xué)院,安徽 蕪湖 241000),研究方向?yàn)橛?jì)算機(jī)應(yīng)用。
基金項(xiàng)目:安徽省教育廳2006年自然科學(xué)基金(NO.2006kj077B)
摘要:研究了在Visual C++6.0環(huán)境下利用MSComm控件實(shí)現(xiàn)系列PLC與上位計(jì)算機(jī)通信的問題,并給出了基于Visual C++6.0的通信程序設(shè)計(jì)方法。該通信程序能讀寫PLC內(nèi)部各種軟設(shè)備。實(shí)踐證明,在Visual C++6.0下實(shí)現(xiàn)系列PLC與計(jì)算機(jī)通信簡單使用,具有很強(qiáng)的推廣應(yīng)用價(jià)值。
關(guān)鍵詞:PLC;Visual C++6.0;MSComm控件;通信
Abstract: In this paper, the issue of implementing communication between PLC and computer is studied base on Visual C++6.0 developing environment. A method for designing communication program by Visual C++6.0 is given. The communication program can read or write various kinds of soft devices inside PLC. The practice proved that the communication between PLC and computer under Visual C++6.0 is simple and applicable. It is worth to be promoted.
Key words: PLC;Visual C++6.0;MSComm control box;Communication
1 引言
可編程控制器PLC(Programmable Logic Controller),由于其安全可靠、功能齊全、應(yīng)用靈活、操作維修容易和穩(wěn)定可靠等特點(diǎn)而得到廣泛應(yīng)用。但它也存在一些缺點(diǎn),如不能給用戶提供良好的人機(jī)控制和管理界面。隨著工廠自動(dòng)化程序要求的不斷提高,生產(chǎn)過程中,要監(jiān)視、控制PLC內(nèi)部的數(shù)據(jù)與運(yùn)行狀況。對(duì)于中小型控制系統(tǒng),如采用廠家提供的通信模塊則成本高、投資較大、靈活性差。因此用戶自己開發(fā)計(jì)算機(jī)與PLC的通信模塊程序不僅可以滿足不同情況下數(shù)據(jù)傳輸速率與穩(wěn)定性的要求而且對(duì)節(jié)約外資、靈活應(yīng)用具有重要意義。本文以三菱PLC為例,介紹一種通過Visual C++編程實(shí)現(xiàn)計(jì)算機(jī)作為上位機(jī)與PLC的通信,該通信程序能讀寫PLC內(nèi)部各種軟設(shè)備。
2 通信原理
系統(tǒng)采用RS-232C總線實(shí)現(xiàn),直接與計(jì)算機(jī)的Host-Link單元構(gòu)成1:1點(diǎn)對(duì)點(diǎn)通信系統(tǒng)。設(shè)定計(jì)算機(jī)即上位機(jī)具有高的優(yōu)先級(jí),通信以“幀”為單位進(jìn)行,計(jì)算機(jī)首先向PLC發(fā)出命令幀,發(fā)送查詢數(shù)據(jù)的指令,目的是查詢PLC中端子的狀態(tài)和DM區(qū)的值等。PLC接收了指令后,進(jìn)行校驗(yàn),檢查數(shù)據(jù)是否正確,如果正確,則向上位機(jī)發(fā)送響應(yīng)幀,傳送數(shù)據(jù)(包含首尾校驗(yàn)字節(jié))。否則,PLC拒絕向上位機(jī)傳送數(shù)據(jù)。上位機(jī)接收到PLC傳送的數(shù)據(jù),也要判斷正確與否,如果正確,則接收;否則,拒絕接收。
要使計(jì)算機(jī)與PLC聯(lián)接單元之間正確交換數(shù)據(jù),必須確保以下條件成立:(1)上下位機(jī)之間波特率以及數(shù)據(jù)格式一致;(2)在通信程序中,只使用協(xié)議規(guī)定的命令級(jí)中的命令;(3)當(dāng)上位機(jī)向PLC發(fā)送數(shù)據(jù)或讀取數(shù)據(jù)均由上位機(jī)主動(dòng)以命令幀形式發(fā)出;(4)對(duì)上位機(jī)發(fā)來的命令幀,PLC用響應(yīng)幀應(yīng)答,若命令較長時(shí),可分為若干幀發(fā)送。只要能順利實(shí)現(xiàn)命令幀和響應(yīng)幀的應(yīng)答,就能使要交換的數(shù)據(jù)順利達(dá)到對(duì)方。對(duì)于PLC發(fā)回的響應(yīng)幀用戶必須按其格式進(jìn)行拆裝識(shí)別,才能正確分離出交換數(shù)據(jù)及有用狀態(tài)信息。
3 MSComm控件特點(diǎn)
利用VC的MSComm控件,實(shí)際上是一些Windows API函數(shù)的有機(jī)集成,它以屬性和事件的形式提供了對(duì)Windows通訊驅(qū)動(dòng)程序API函數(shù)接口,為應(yīng)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法。因此,程序員只需在程序中設(shè)置和監(jiān)視MSComm控件的屬性和事件即可完成對(duì)串口的編程。
MSComm控件提供了一種有效的處理串口交互作用的方法:事件驅(qū)動(dòng)法,該方法利用OnComm事件捕獲并處理通信及其錯(cuò)誤,當(dāng)CommEvent屬性發(fā)生變化時(shí),就產(chǎn)生事件并等待相應(yīng)處理。每個(gè)MSComm控件都有一個(gè)串口相對(duì)應(yīng)。
MSComm控件基本屬性如下:
CommPort:設(shè)置并返回通信端口號(hào)。Windows系統(tǒng)將會(huì)利用該端口與外界通信。
Setings:設(shè)置并返回初始化參數(shù)。其組成格式為“BBBB.P.D.S”。BBBB為數(shù)據(jù)速率,P為奇偶校驗(yàn),D為數(shù)據(jù)位數(shù),S為停止位數(shù)。
PortOpen:設(shè)置并返回通信端口的狀態(tài)。也可以打開和關(guān)閉端口。
OutPut:向傳輸緩沖區(qū)寫IB的數(shù)據(jù)。
InPut:將傳送到輸入緩沖區(qū)的字符讀到程序里。
RThreshold:設(shè)置在產(chǎn)生OnComm之前要接受的字符數(shù)。
InputLen:設(shè)置并返回Input屬性從接收緩沖區(qū)讀取的字符數(shù)。
InBuffersize:設(shè)置或返回輸入緩沖區(qū)的大小。
InBufferCount:返回輸入緩沖區(qū)內(nèi)等待讀取的字節(jié)個(gè)數(shù);可通過設(shè)置該屬性值為0來清除接收緩沖區(qū)。
InputMode:設(shè)置或返回傳輸數(shù)據(jù)的類型。
CommEvent:傳回OnComm事件發(fā)生時(shí)的數(shù)值碼。
4 通信程序設(shè)計(jì)
在應(yīng)用程序中,主要采用MSComm控件與PLC進(jìn)行通信,加載窗體時(shí)初始化通信參數(shù),讀數(shù)據(jù)時(shí)由上位機(jī)通過串行口向PLC發(fā)出讀數(shù)據(jù)命令幀,PLC發(fā)出響應(yīng)幀并將數(shù)據(jù)準(zhǔn)備好,這時(shí)上位機(jī)讀串行口就可讀取需要的數(shù)據(jù);寫數(shù)據(jù)時(shí)上位機(jī)通過串行口向PLC發(fā)出寫數(shù)據(jù)命令幀,PLC接受命令,并發(fā)送響應(yīng)幀。
(1)在進(jìn)行通信之前首先要對(duì)PLC端進(jìn)行編程初始化,初始化程序如下:
LD M8002
MOV K0 D8121
MOV H4881 D8120
M8002為特殊功能寄存器,只在PLC轉(zhuǎn)為運(yùn)行時(shí)接通一次。D8121設(shè)定PLC站號(hào)寄存器,在這里設(shè)定PLC的站號(hào)為0號(hào)。通信控制寄存器D8120中移入16進(jìn)制數(shù)4881,對(duì)照參數(shù)表,PLC端的設(shè)定為通信速率9600b/s,無校驗(yàn),8位數(shù)據(jù)位,1位停止位。采用RS232接口,數(shù)據(jù)幀中不添加校驗(yàn)位。上位機(jī)端要與之相匹配。
(2)裝載窗體時(shí)初始化并打開串口
m_Com.SetCommPort(1); //選擇COM1
m_Com.SetInBufferSize(1024); //設(shè)置輸入緩沖區(qū)大小
m_Com.SetOutBufferSize(512); //設(shè)置輸出緩沖區(qū)大小
if(!m_Com.GetPortOpen()) //打開串口
m_Com.SetPortOpen(TRUE); //打開通信端口,準(zhǔn)備通信
m_Com.Settings(9600,n,8,1); //通信速率9600b/s,無校驗(yàn),8位數(shù)據(jù)位,1位停止位
m_Com.SetRThreashold();
m_Com.SetInputLen(1);
m_Com.SetInputMode(0);
(3)發(fā)送主程序(串口讀寫)
由GetInput()和SetOutput()函數(shù)完成串口讀寫。相應(yīng)的部分程序?yàn)椋?BR>Void CMainFramme::OnCommSend()
{
//準(zhǔn)備要發(fā)送的數(shù)據(jù)存放在數(shù)組SXData[]中
CByteArray Send;
Send.RemoveAll();
Send.SetSize(m);
For(i=0;i<m;i++)
Array.SetAt(i;SxData[i]);
m_Com.SetOutput(ColeVariant(Send));
}
Void CMainFramme::OnCommMscomm()
{
VARIANT vResponse;
int k;
k=m_Com.GetInBuffetCount(); //接收到的字符數(shù)目
if(k>0)
{vResponse=m_Com.GetInput(); //read
}
在實(shí)際應(yīng)用中,從站被動(dòng)的接收上位機(jī)發(fā)出的指令后做出的響應(yīng),然后將信息傳回上位機(jī),由于上位機(jī)在整個(gè)通信的過程中不能被中斷,因此上位機(jī)在接收與發(fā)送數(shù)據(jù)過程中采用了不可中斷的方法。
5 結(jié)束語
本系統(tǒng)根據(jù)計(jì)算機(jī)和PLC的特點(diǎn),通過利用PLC的自由口通信協(xié)議,利用VC++6.0開發(fā)工具,開發(fā)出PC與PLC通信的應(yīng)用軟件,實(shí)踐證明這種方法結(jié)構(gòu)簡單,開發(fā)周期短,節(jié)約投資,對(duì)小規(guī)模的控制系統(tǒng)有極大的現(xiàn)實(shí)意義。
作者信息:
王 蕓,高菲菲 (安徽師范大學(xué)物電學(xué)院,安徽 蕪湖 241000)
參考文獻(xiàn)
[1] 徐世許.可編程序控制器原理·應(yīng)用·網(wǎng)絡(luò)[M].合肥:中國科學(xué)技術(shù)大學(xué)出版社,2005:244-247.
[2] MITSUBISHI公司. MITSUBISHI FX-232AW接口單元通信手冊(cè)[M].上海:三菱公司,2000:25-33.
[3] 陳興,張禮全,史旺旺.用VC++實(shí)現(xiàn)PC與多PLC之間串行通信的方法[J].微計(jì)算機(jī)信息,2004(20):6-7.