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