技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國(guó)傳動(dòng)網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > 基于VC++和MFC的上位機(jī)與PLC的通訊系統(tǒng)

基于VC++和MFC的上位機(jī)與PLC的通訊系統(tǒng)

時(shí)間:2008-08-25 10:05:00來(lái)源:ronggang

導(dǎo)語(yǔ):?用VC++和MFC開(kāi)發(fā)的上位機(jī)和PLC的通訊系統(tǒng),給出了系統(tǒng)的通訊原理和系統(tǒng)的軟件設(shè)計(jì)方法。實(shí)踐證明整個(gè)系統(tǒng)運(yùn)行穩(wěn)定,實(shí)用性和可擴(kuò)展性強(qiáng)

摘 要:本文介紹了用VC++和MFC開(kāi)發(fā)的上位機(jī)和PLC的通訊系統(tǒng),給出了系統(tǒng)的通訊原理和系統(tǒng)的軟件設(shè)計(jì)方法。實(shí)踐證明整個(gè)系統(tǒng)運(yùn)行穩(wěn)定,實(shí)用性和可擴(kuò)展性強(qiáng)。

關(guān)鍵詞:PLC VC++ MFC 通訊模式

1 概述

PLC(Programmable Logic Controller)作為新一代工業(yè)控制器,以其高性能價(jià)格比在工業(yè)測(cè)控系統(tǒng)中獲得了廣泛應(yīng)用。隨著微電子及控制技術(shù)的不斷發(fā)展,PLC已逐漸成為一種智能型、綜合型控制器,由PLC構(gòu)成的集散控制是現(xiàn)代工業(yè)控制的一個(gè)重要組成部分。在眾多的小型集散控制系統(tǒng)中,若使用專(zhuān)業(yè)工控組態(tài)軟件,如INTOUCH、FIX等,制作上位機(jī)的監(jiān)控界面,而以專(zhuān)用的PLC通信接口模塊以及其廠家推薦的DDE Server作為聯(lián)系上位機(jī)和PLC的橋梁,則成本較高、投資較大。所以上位機(jī)直接與PLC的通訊是一種很好的技術(shù)方案。

在Windows環(huán)境下開(kāi)發(fā)與工業(yè)PLC通訊,可以利用C并借助Windows SDK提供的應(yīng)用程序接口函數(shù)來(lái)完成軟件的設(shè)計(jì),但這樣開(kāi)發(fā)的程序很復(fù)雜;也可以利用Visual Basic提供的通訊控件來(lái)開(kāi)發(fā)串行通訊程序,程序的編制十分簡(jiǎn)單,但在現(xiàn)實(shí)中,許多大的應(yīng)用系統(tǒng)都是基于VC++平臺(tái)開(kāi)發(fā)的,VC++是現(xiàn)今最復(fù)雜、但也是最強(qiáng)大的一種Windows應(yīng)用程序開(kāi)發(fā)工程軟件。它在圖形處理和數(shù)據(jù)庫(kù)管理等方面具有較強(qiáng)的優(yōu)勢(shì),并且用它來(lái)實(shí)現(xiàn)底層的通訊控制有著更快的效率,使用MFC設(shè)計(jì)的界面與Visual Basic設(shè)計(jì)的界面一樣簡(jiǎn)練。因此我們利用VC++6.0提供的通訊控件MSComm,以MFC來(lái)設(shè)計(jì)界面編制程序,構(gòu)造與PLC的通訊系統(tǒng)。系統(tǒng)中的PLC為西門(mén)子公司的S7-200系列CPU226型。

2 系統(tǒng)的通訊原理

西門(mén)子S7-226型PLC是一種模塊化結(jié)構(gòu)的小型PLC,具有較高的性能價(jià)格比,它帶有兩個(gè)RS485通訊口,而上位機(jī)即工控機(jī)的串行口是RS232,所以采用西門(mén)子公司專(zhuān)用的PC/PPI編程電纜作為上下位機(jī)的連接電纜,它實(shí)現(xiàn)了RS232和RS485的轉(zhuǎn)換,并且具有隔離抗干擾功能。整個(gè)系統(tǒng)原理圖如圖1所示。

通訊系統(tǒng)原理

圖1 通訊系統(tǒng)原理

CPU226自帶的通訊口RS485采用半雙工通訊,只需用兩根數(shù)據(jù)線TXD和RXD來(lái)發(fā)送數(shù)據(jù)和接收數(shù)據(jù),所以通訊中沒(méi)有硬件握手信號(hào),而只能采用軟件握手的通訊方式保持?jǐn)?shù)據(jù)傳輸?shù)耐健榱吮WC通訊的安全性,必須對(duì)發(fā)送的數(shù)據(jù)幀中加入幀校驗(yàn)碼(FCS),采取的方法是:把所發(fā)送的數(shù)據(jù)幀中的數(shù)據(jù)按照字節(jié)進(jìn)行異或運(yùn)算后得到的FCS連同數(shù)據(jù)一起發(fā)送。接收方收到后,進(jìn)行同樣的運(yùn)算,并把結(jié)果與FCS比較,如果兩者不相等,則認(rèn)為傳輸數(shù)據(jù)出錯(cuò)。對(duì)于檢驗(yàn)到出錯(cuò)的數(shù)據(jù)采取放棄的措施,并立即發(fā)送反饋信號(hào)要求發(fā)送方重發(fā)數(shù)據(jù)。因此上位機(jī)和PLC發(fā)送數(shù)據(jù)的格式分別為表1和表2所示。控制命令如請(qǐng)求、應(yīng)答等信號(hào)另有則不必加上校驗(yàn)碼。

表1上位機(jī)數(shù)據(jù)格式

表2 PLC數(shù)據(jù)格式

3 系統(tǒng)的軟件設(shè)計(jì)

3.1系統(tǒng)的控制流程

整個(gè)通訊由上位機(jī)觸發(fā)開(kāi)始,首先由上位機(jī)發(fā)送握手信號(hào),PLC接收到握手信號(hào)后,發(fā)送回握信號(hào);上位機(jī)收到回握信號(hào),則開(kāi)始發(fā)送請(qǐng)求指令,PLC收到指令后發(fā)送數(shù)據(jù)給上位機(jī);上位機(jī)收到數(shù)據(jù)進(jìn)行校驗(yàn),出錯(cuò)則要求PLC重發(fā),沒(méi)有錯(cuò)誤則處理輸出顯示。下面圖2和圖3分別就是上位機(jī)和PLC的通訊程序流程圖。

上位機(jī)程序流程圖 圖3 PLC程序流程圖

圖2 上位機(jī)程序流程圖 圖3 PLC程序流程圖

3.2 PLC軟件設(shè)計(jì)

S7-200系列PLC有兩種通訊模式:一種是點(diǎn)對(duì)點(diǎn)(PPI)通訊模式,另一種是對(duì)用戶完全開(kāi)放的自由口通訊模式(free port mode),PPI模式用于PLC間直接連接的通訊,可以組成網(wǎng)絡(luò),自由口模式應(yīng)用于PLC與計(jì)算機(jī)間以及PLC間無(wú)線通訊等方面。本通訊系統(tǒng)采用自由口通訊模式。在通訊之前通過(guò)改寫(xiě)SMB30或SMB130來(lái)選擇通訊模式,設(shè)定波特率以及數(shù)據(jù)長(zhǎng)度和校驗(yàn)位。對(duì)于數(shù)據(jù)發(fā)送,采用專(zhuān)用發(fā)送指令XMT TABLE, PORT,其中TABLE為發(fā)送緩沖區(qū)的首地址,首地址中保存要發(fā)送的字節(jié)數(shù),即數(shù)據(jù)長(zhǎng)度,最大為255,其后的地址中保存要發(fā)送的數(shù)據(jù),PORT指定用于發(fā)送的端口。對(duì)于數(shù)據(jù)接收,使用接收指令RCV TABLE, PORT,接收指令激活初始化或結(jié)束接收信息,通過(guò)指定端口(PORT)接收信息并存儲(chǔ)于數(shù)據(jù)緩沖區(qū)(TABLE),數(shù)據(jù)緩沖區(qū)的第一個(gè)數(shù)據(jù)指明了接收的字節(jié)數(shù)。在西門(mén)子PLC編程語(yǔ)言中,共有33個(gè)中斷事件,其中用于通訊口的中斷事件就有6個(gè)。在通訊過(guò)程中,我們利用中斷來(lái)實(shí)現(xiàn)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的切換,當(dāng)數(shù)據(jù)發(fā)送完成,會(huì)產(chǎn)生發(fā)送字符中斷事件,在中斷程序中切換到接收狀態(tài);當(dāng)接收數(shù)據(jù)完成,會(huì)產(chǎn)生接收信息完成中斷事件,在中斷程序中切換到發(fā)送狀態(tài),由于收發(fā)切換有一定的間隔,所以必須延時(shí)一段時(shí)間再發(fā)送數(shù)據(jù),我們用定時(shí)中斷來(lái)產(chǎn)生延時(shí)。為了產(chǎn)生接收信息完成中斷事件,必須要對(duì)RCV指令設(shè)定結(jié)束信息作為判斷接收完成的條件,通過(guò)向SMB89或SMB189中裝入字符來(lái)設(shè)置,這個(gè)字符必須與上位機(jī)發(fā)送來(lái)的結(jié)束信息相吻合。

以下是PLC的部分程序:

MAIN(主程序)

NETWORK 1

LD SM0.1

MOVB 16#09, SMB30//初始化自由端口,選擇9600波特率,8位數(shù)據(jù),無(wú)校驗(yàn)

MOVB 16#A0, SMB87//RCV允許,檢測(cè)信息結(jié)束字符

MOVB ‘@’, SMB89//設(shè)定信息結(jié)束字符為‘@’

MOVB 10, SMB94//設(shè)定最大字符數(shù)為10

MOVB 5, SMB34 //定時(shí)中斷0為5ms

ATCH 0,23//接收完成事件連接到中斷0

ENI//允許全局中斷

NETWORK 2

RCV VB300, 0//接收數(shù)據(jù)

NETWORK 3

LD SM0.0

MOVB 16,VB200//發(fā)送16個(gè)字符

MOVD 16#4521347E, VD201//以下是實(shí)驗(yàn)數(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//啟動(dòng)定時(shí)中斷

NETWORK 3 //如果接收到的字符為“Z”,則

停止延時(shí)發(fā)送

LDB= VB302, ‘Z‘

DTCH 10

INT_1(中斷1子程序)

LD SM0.0

XMT VB200, 0//發(fā)送數(shù)據(jù)

DTCH 10//關(guān)定時(shí)中斷

3.3 上位機(jī)軟件設(shè)計(jì)

系統(tǒng)中上位機(jī)的軟件部分利用VC++提供的通訊控件MSComm,以MFC為基礎(chǔ)編制通訊程序。MSComm通訊控件提供了使用RS232開(kāi)發(fā)串行通訊軟件的細(xì)則,它使用事件驅(qū)動(dòng)或查詢方式來(lái)解決開(kāi)發(fā)通訊軟件中遇到的問(wèn)題。事件驅(qū)動(dòng)是一種功能強(qiáng)大的處理問(wèn)題的方法,對(duì)事件發(fā)生的跟蹤和處理在通訊控件中是用OnComm來(lái)實(shí)現(xiàn)的,它包括檢測(cè)和處理通訊錯(cuò)誤以及數(shù)據(jù)的處理顯示等。為了清楚了解現(xiàn)場(chǎng)的工作狀態(tài),可以在界面上實(shí)時(shí)顯示攝像機(jī)觀察到的內(nèi)容,為此,需要對(duì)圖像采集卡采集到的圖像進(jìn)行分析處理,這里就不再詳述。圖4為通訊界面。

程序設(shè)計(jì)方法如下:

(1)建立項(xiàng)目:?jiǎn)?dòng)VC++6.0,利用MFC AppWizard(exe)應(yīng)用向?qū)Ы⒁粋€(gè)基于對(duì)話框的應(yīng)用程序ScommTest。

通訊界面

圖4 通訊界面

(2)在項(xiàng)目中插入MSComm控件:選擇Project菜單下Add To Project子菜單中的 Components and Controls…選項(xiàng),在彈出的對(duì)話框中雙擊Registered ActiveX Controls項(xiàng),選擇Microsoft Communications Control version 6.0,單擊Insert按鈕將它插入到Project中來(lái),接受缺省的選項(xiàng)。

(3)在對(duì)話框中添加控件:向主對(duì)話框中添加通訊控件、按鈕、文本框、編輯框和組合框,其中部分屬性如表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);//打開(kāi)串口

else

AfxMessageBox("cannot open serial port");

m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無(wú)校驗(yàn),8個(gè)數(shù)據(jù)位,1個(gè)停止位

m_ctrlComm.SetInputMode(1); //1:表示以二進(jìn)制方式檢取數(shù)據(jù)

m_ctrlComm.SetRThreshold(16); //參數(shù)15表示每當(dāng)串口接收緩沖區(qū)中有多于或等于15個(gè)字符時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的OnComm事件

m_ctrlComm.SetInputLen(0); //設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為0

m_ctrlComm.GetInput();//先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)

(5)編寫(xiě)幀校驗(yàn)函數(shù):首先在CSCommTestDlg類(lèi)中加入公共成員函數(shù)說(shuō)明

BYTE PLCData[30];//定義輸入數(shù)據(jù)存儲(chǔ)區(qū)

Void verfun(BYTE vdata[],int n);//定義校驗(yàn)函數(shù)

然后寫(xiě)幀校驗(yàn)函數(shù):

void CSCommTestDlg::verfun(BYTE vdata[],int n)

int i;

BYTE sum=vdata[0];

for(i=1;i<=n-2;i++)

sum︿=vdata[i];//計(jì)算校驗(yàn)碼

vdata[n]=sum;//保存幀校驗(yàn)碼

(6)為通訊控件IDC_MSComm1添加OnComm消息處理函數(shù)OnComm()

void CSCommTestDlg::OnComm()

VARIANT variant_inp;

COleSafeArray safearray_inp;

LONG len,k;

BYTE rxdata[2048]; //設(shè)置BYTE數(shù)組(8位無(wú)符號(hào)整數(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ù)長(zhǎng)度

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);//計(jì)算校驗(yàn)碼

if(PLCData[15]==PLCData[16])

{ //接收數(shù)據(jù)正確發(fā)送確認(rèn)信號(hào)

m_ctrlComm.SetOutput(COleVariant(“K@”));   //可以在下面自行加上對(duì)數(shù)據(jù)的處理

if(!m_quit)//如果沒(méi)有結(jié)束信號(hào)則續(xù)傳數(shù)據(jù)

m_ctrlComm.SetOutput(COleVariant(“C@”));

else

m_ctrlComm.SetOutput(COleVariant(“Z@”));

else //接收數(shù)據(jù)出錯(cuò)要求重發(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ā)送請(qǐng)求信號(hào)

4 結(jié)束語(yǔ)

本文運(yùn)用VC++和MFC開(kāi)發(fā)了計(jì)算機(jī)與PLC的通訊系統(tǒng),充分利用計(jì)算機(jī)和PLC本身的資源實(shí)現(xiàn)了上位機(jī)對(duì)PLC的實(shí)時(shí)監(jiān)控,可以有效地對(duì)作業(yè)工具進(jìn)行監(jiān)控和管理。本文介紹的通訊系統(tǒng)用于超高壓帶電作業(yè)機(jī)器人的控制系統(tǒng),實(shí)踐表明,系統(tǒng)簡(jiǎn)練、穩(wěn)定,取得了令人滿意的效果。

參考文獻(xiàn)

[1] 李志虎等.基于Visual C++的上位機(jī)和PLC的通信實(shí)現(xiàn).計(jì)算機(jī)工程,2000(8)

[2] 朱正禮等.基于VC++的PLC與上位機(jī)的通訊.電氣傳動(dòng),2002(2)

[3] 西門(mén)子有限公司.西門(mén)子S7-200可編程序控制器系統(tǒng)手冊(cè),1999

標(biāo)簽:

點(diǎn)贊

分享到:

上一篇:LonWorks控制器芯片的設(shè)計(jì)擴(kuò)...

下一篇:微能WIN-V63矢量控制變頻器在...

中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來(lái)源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來(lái)源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來(lái)源的稿件,均來(lái)自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來(lái)源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡(jiǎn)介|會(huì)員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見(jiàn)反饋|sitemap

傳動(dòng)網(wǎng)-工業(yè)自動(dòng)化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺(tái)

網(wǎng)站客服服務(wù)咨詢采購(gòu)咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權(quán)所有
粵ICP備 14004826號(hào) | 營(yíng)業(yè)執(zhí)照證書(shū) | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號(hào)