時間:2008-08-25 10:05:00來源:ronggang
摘 要:本文介紹了用VC++和MFC開發(fā)的上位機和PLC的通訊系統(tǒng),給出了系統(tǒng)的通訊原理和系統(tǒng)的軟件設計方法。實踐證明整個系統(tǒng)運行穩(wěn)定,實用性和可擴展性強。
關鍵詞:PLC VC++ MFC 通訊模式
1 概述
PLC(Programmable Logic Controller)作為新一代工業(yè)控制器,以其高性能價格比在工業(yè)測控系統(tǒng)中獲得了廣泛應用。隨著微電子及控制技術的不斷發(fā)展,PLC已逐漸成為一種智能型、綜合型控制器,由PLC構成的集散控制是現(xiàn)代工業(yè)控制的一個重要組成部分。在眾多的小型集散控制系統(tǒng)中,若使用專業(yè)工控組態(tài)軟件,如INTOUCH、FIX等,制作上位機的監(jiān)控界面,而以專用的PLC通信接口模塊以及其廠家推薦的DDE Server作為聯(lián)系上位機和PLC的橋梁,則成本較高、投資較大。所以上位機直接與PLC的通訊是一種很好的技術方案。
在Windows環(huán)境下開發(fā)與工業(yè)PLC通訊,可以利用C并借助Windows SDK提供的應用程序接口函數(shù)來完成軟件的設計,但這樣開發(fā)的程序很復雜;也可以利用Visual Basic提供的通訊控件來開發(fā)串行通訊程序,程序的編制十分簡單,但在現(xiàn)實中,許多大的應用系統(tǒng)都是基于VC++平臺開發(fā)的,VC++是現(xiàn)今最復雜、但也是最強大的一種Windows應用程序開發(fā)工程軟件。它在圖形處理和數(shù)據(jù)庫管理等方面具有較強的優(yōu)勢,并且用它來實現(xiàn)底層的通訊控制有著更快的效率,使用MFC設計的界面與Visual Basic設計的界面一樣簡練。因此我們利用VC++6.0提供的通訊控件MSComm,以MFC來設計界面編制程序,構造與PLC的通訊系統(tǒng)。系統(tǒng)中的PLC為西門子公司的S7-200系列CPU226型。
2 系統(tǒng)的通訊原理
西門子S7-226型PLC是一種模塊化結(jié)構的小型PLC,具有較高的性能價格比,它帶有兩個RS485通訊口,而上位機即工控機的串行口是RS232,所以采用西門子公司專用的PC/PPI編程電纜作為上下位機的連接電纜,它實現(xiàn)了RS232和RS485的轉(zhuǎn)換,并且具有隔離抗干擾功能。整個系統(tǒng)原理圖如圖1所示。
圖1 通訊系統(tǒng)原理
CPU226自帶的通訊口RS485采用半雙工通訊,只需用兩根數(shù)據(jù)線TXD和RXD來發(fā)送數(shù)據(jù)和接收數(shù)據(jù),所以通訊中沒有硬件握手信號,而只能采用軟件握手的通訊方式保持數(shù)據(jù)傳輸?shù)耐?。為了保證通訊的安全性,必須對發(fā)送的數(shù)據(jù)幀中加入幀校驗碼(FCS),采取的方法是:把所發(fā)送的數(shù)據(jù)幀中的數(shù)據(jù)按照字節(jié)進行異或運算后得到的FCS連同數(shù)據(jù)一起發(fā)送。接收方收到后,進行同樣的運算,并把結(jié)果與FCS比較,如果兩者不相等,則認為傳輸數(shù)據(jù)出錯。對于檢驗到出錯的數(shù)據(jù)采取放棄的措施,并立即發(fā)送反饋信號要求發(fā)送方重發(fā)數(shù)據(jù)。因此上位機和PLC發(fā)送數(shù)據(jù)的格式分別為表1和表2所示??刂泼钊缯埱蟆鸬刃盘柫碛袆t不必加上校驗碼。
表1上位機數(shù)據(jù)格式
表2 PLC數(shù)據(jù)格式
3 系統(tǒng)的軟件設計
3.1系統(tǒng)的控制流程
整個通訊由上位機觸發(fā)開始,首先由上位機發(fā)送握手信號,PLC接收到握手信號后,發(fā)送回握信號;上位機收到回握信號,則開始發(fā)送請求指令,PLC收到指令后發(fā)送數(shù)據(jù)給上位機;上位機收到數(shù)據(jù)進行校驗,出錯則要求PLC重發(fā),沒有錯誤則處理輸出顯示。下面圖2和圖3分別就是上位機和PLC的通訊程序流程圖。
圖2 上位機程序流程圖 圖3 PLC程序流程圖
3.2 PLC軟件設計
S7-200系列PLC有兩種通訊模式:一種是點對點(PPI)通訊模式,另一種是對用戶完全開放的自由口通訊模式(free port mode),PPI模式用于PLC間直接連接的通訊,可以組成網(wǎng)絡,自由口模式應用于PLC與計算機間以及PLC間無線通訊等方面。本通訊系統(tǒng)采用自由口通訊模式。在通訊之前通過改寫SMB30或SMB130來選擇通訊模式,設定波特率以及數(shù)據(jù)長度和校驗位。對于數(shù)據(jù)發(fā)送,采用專用發(fā)送指令XMT TABLE, PORT,其中TABLE為發(fā)送緩沖區(qū)的首地址,首地址中保存要發(fā)送的字節(jié)數(shù),即數(shù)據(jù)長度,最大為255,其后的地址中保存要發(fā)送的數(shù)據(jù),PORT指定用于發(fā)送的端口。對于數(shù)據(jù)接收,使用接收指令RCV TABLE, PORT,接收指令激活初始化或結(jié)束接收信息,通過指定端口(PORT)接收信息并存儲于數(shù)據(jù)緩沖區(qū)(TABLE),數(shù)據(jù)緩沖區(qū)的第一個數(shù)據(jù)指明了接收的字節(jié)數(shù)。在西門子PLC編程語言中,共有33個中斷事件,其中用于通訊口的中斷事件就有6個。在通訊過程中,我們利用中斷來實現(xiàn)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的切換,當數(shù)據(jù)發(fā)送完成,會產(chǎn)生發(fā)送字符中斷事件,在中斷程序中切換到接收狀態(tài);當接收數(shù)據(jù)完成,會產(chǎn)生接收信息完成中斷事件,在中斷程序中切換到發(fā)送狀態(tài),由于收發(fā)切換有一定的間隔,所以必須延時一段時間再發(fā)送數(shù)據(jù),我們用定時中斷來產(chǎn)生延時。為了產(chǎn)生接收信息完成中斷事件,必須要對RCV指令設定結(jié)束信息作為判斷接收完成的條件,通過向SMB89或SMB189中裝入字符來設置,這個字符必須與上位機發(fā)送來的結(jié)束信息相吻合。
以下是PLC的部分程序:
MAIN(主程序)
NETWORK 1
LD SM0.1
MOVB 16#09, SMB30//初始化自由端口,選擇9600波特率,8位數(shù)據(jù),無校驗
MOVB 16#A0, SMB87//RCV允許,檢測信息結(jié)束字符
MOVB ‘@’, SMB89//設定信息結(jié)束字符為‘@’
MOVB 10, SMB94//設定最大字符數(shù)為10
MOVB 5, SMB34 //定時中斷0為5ms
ATCH 0,23//接收完成事件連接到中斷0
ENI//允許全局中斷
NETWORK 2
RCV VB300, 0//接收數(shù)據(jù)
NETWORK 3
LD SM0.0
MOVB 16,VB200//發(fā)送16個字符
MOVD 16#4521347E, VD201//以下是實驗數(shù)據(jù)
MOVW +9860, VW205
MOVD 16#12345678, VD207
MOVW +10562, VW211
MOVW +8568, VW213
MOVB 8, VB215
CALL SBR_0
INT_0(中斷0子程序)
NETWORK 1//如果接收到的字符為‘K‘,則繼續(xù)接收
LDB= VB302, ‘K‘
RCV VB300, 0
NETWORK 2//如果接收到的字符為‘A‘、‘C‘或者‘R‘,則發(fā)送數(shù)據(jù)
LDB= VB302, ‘A‘
OB= VB302, ‘R‘
OB= VB302, ‘C‘
ATCH INT_1, 10//啟動定時中斷
NETWORK 3 //如果接收到的字符為“Z”,則
停止延時發(fā)送
LDB= VB302, ‘Z‘
DTCH 10
INT_1(中斷1子程序)
LD SM0.0
XMT VB200, 0//發(fā)送數(shù)據(jù)
DTCH 10//關定時中斷
3.3 上位機軟件設計
系統(tǒng)中上位機的軟件部分利用VC++提供的通訊控件MSComm,以MFC為基礎編制通訊程序。MSComm通訊控件提供了使用RS232開發(fā)串行通訊軟件的細則,它使用事件驅(qū)動或查詢方式來解決開發(fā)通訊軟件中遇到的問題。事件驅(qū)動是一種功能強大的處理問題的方法,對事件發(fā)生的跟蹤和處理在通訊控件中是用OnComm來實現(xiàn)的,它包括檢測和處理通訊錯誤以及數(shù)據(jù)的處理顯示等。為了清楚了解現(xiàn)場的工作狀態(tài),可以在界面上實時顯示攝像機觀察到的內(nèi)容,為此,需要對圖像采集卡采集到的圖像進行分析處理,這里就不再詳述。圖4為通訊界面。
程序設計方法如下:
(1)建立項目:啟動VC++6.0,利用MFC AppWizard(exe)應用向?qū)Ы⒁粋€基于對話框的應用程序ScommTest。
圖4 通訊界面
(2)在項目中插入MSComm控件:選擇Project菜單下Add To Project子菜單中的 Components and Controls…選項,在彈出的對話框中雙擊Registered ActiveX Controls項,選擇Microsoft Communications Control version 6.0,單擊Insert按鈕將它插入到Project中來,接受缺省的選項。
(3)在對話框中添加控件:向主對話框中添加通訊控件、按鈕、文本框、編輯框和組合框,其中部分屬性如表3所示。
表3控件屬性表
(4)初始化串口:在OnInitDialog()函數(shù)中添加初始化串口參數(shù)的代碼
// TODO: Add extra initialization here
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1); //選擇com1
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打開串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無校驗,8個數(shù)據(jù)位,1個停止位
m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數(shù)據(jù)
m_ctrlComm.SetRThreshold(16); //參數(shù)15表示每當串口接收緩沖區(qū)中有多于或等于15個字符時將引發(fā)一個接收數(shù)據(jù)的OnComm事件
m_ctrlComm.SetInputLen(0); //設置當前接收區(qū)數(shù)據(jù)長度為0
m_ctrlComm.GetInput();//先預讀緩沖區(qū)以清除殘留數(shù)據(jù)
(5)編寫幀校驗函數(shù):首先在CSCommTestDlg類中加入公共成員函數(shù)說明
BYTE PLCData[30];//定義輸入數(shù)據(jù)存儲區(qū)
Void verfun(BYTE vdata[],int n);//定義校驗函數(shù)
然后寫幀校驗函數(shù):
void CSCommTestDlg::verfun(BYTE vdata[],int n)
{
int i;
BYTE sum=vdata[0];
for(i=1;i<=n-2;i++)
sum︿=vdata[i];//計算校驗碼
vdata[n]=sum;//保存幀校驗碼
}
(6)為通訊控件IDC_MSComm1添加OnComm消息處理函數(shù)OnComm()
void CSCommTestDlg::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設置BYTE數(shù)組(8位無符號整數(shù))
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩沖區(qū)內(nèi)有字符
{
variant_inp=m_ctrlComm.GetInput();//讀緩沖區(qū)
safearray_inp=variant_inp; //VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量
len=safearray_inp.GetOneDimSize(); //得到有效數(shù)據(jù)長度
for(k=0;k
safearray_inp.GetElement(&k,rxdata+k);//轉(zhuǎn)換為BYTE型數(shù)組
for(k=0;k
{
PLCData[k]=rxdata[k];
}
verfun(PLCData,16);//計算校驗碼
if(PLCData[15]==PLCData[16])
{ //接收數(shù)據(jù)正確發(fā)送確認信號
m_ctrlComm.SetOutput(COleVariant(“K@”)); //可以在下面自行加上對數(shù)據(jù)的處理
if(!m_quit)//如果沒有結(jié)束信號則續(xù)傳數(shù)據(jù)
m_ctrlComm.SetOutput(COleVariant(“C@”));
else
m_ctrlComm.SetOutput(COleVariant(“Z@”));
}
else //接收數(shù)據(jù)出錯要求重發(fā)數(shù)據(jù)
m_ctrlComm.SetOutput(COleVariant(“R@”));
(7)為按鈕IDC_BUTTON_START和IDC_BUTTON_QUIT添加消息處理函數(shù)OnButtonStart()和OnButtonQuit()
void CSCommTestDlg::OnButtonQuit()
{
m_quit=TRUE;
}
void CSCommTestDlg::OnButtonStart()
{
m_quit=FALSE;
m_ctrlComm.SetOutput(COleVariant("A@")); //發(fā)送請求信號
}
4 結(jié)束語
本文運用VC++和MFC開發(fā)了計算機與PLC的通訊系統(tǒng),充分利用計算機和PLC本身的資源實現(xiàn)了上位機對PLC的實時監(jiān)控,可以有效地對作業(yè)工具進行監(jiān)控和管理。本文介紹的通訊系統(tǒng)用于超高壓帶電作業(yè)機器人的控制系統(tǒng),實踐表明,系統(tǒng)簡練、穩(wěn)定,取得了令人滿意的效果。
參考文獻
[1] 李志虎等.基于Visual C++的上位機和PLC的通信實現(xiàn).計算機工程,2000(8)
[2] 朱正禮等.基于VC++的PLC與上位機的通訊.電氣傳動,2002(2)
[3] 西門子有限公司.西門子S7-200可編程序控制器系統(tǒng)手冊,1999
標簽:
中國傳動網(wǎng)版權與免責聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(wǎng)(www.wangxinlc.cn)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權屬于原版權人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
產(chǎn)品新聞
更多>2025-04-30
性能躍升20%!維宏NK300CX Plus數(shù)控系統(tǒng)...
2025-04-11
2025-04-08
【產(chǎn)品解讀】全面提升精密制造檢測節(jié)拍...
2025-03-31
應用案例 | 使用宏集TELE監(jiān)控繼電器監(jiān)控...
2025-03-26
2025-03-20