關(guān)鍵詞:上位機(jī);PLC;串口通信;VC++6.0;振動(dòng)磨
1.引 言
當(dāng)今,在自動(dòng)化的工業(yè)生產(chǎn)中,變頻控制往往與計(jì)算機(jī)遠(yuǎn)程控制相聯(lián)系在一起,從而實(shí)現(xiàn)電機(jī)的遠(yuǎn)程變頻控制??删幊绦蚩刂破飨到y(tǒng)不僅可作為單一的機(jī)電控制設(shè)備,而且作為通用的自動(dòng)控制設(shè)備,也被大量地用于過程工業(yè)的自動(dòng)控制。歐姆龍最新推出的可編程控制器SYSMAC CP1H,具有“高度擴(kuò)張性”的端子臺(tái)型一體化[1]。與以往產(chǎn)品CPM2A 40 點(diǎn)輸入輸出型為相同尺寸,但處理速度可達(dá)到約10倍的性能。本課題通過控制機(jī)(即為PLC)設(shè)定比例運(yùn)行參數(shù),然后控制機(jī)通過D/A轉(zhuǎn)換模件發(fā)出控制變頻調(diào)速器的指令,使變頻調(diào)速器帶動(dòng)振動(dòng)磨電機(jī)按輸入的速度和時(shí)間運(yùn)轉(zhuǎn)。基于OMRON PLC的鏈接通信(有通信協(xié)議),我們采用功能強(qiáng)大的Visual C++6.0語言來實(shí)現(xiàn)這種小型集散控制系統(tǒng)的上、下位機(jī)的通信和友好的監(jiān)控界面,實(shí)現(xiàn)了上位機(jī)與PLC間的通信。
2.通訊軟件的設(shè)計(jì)
在本項(xiàng)目中,上位機(jī)選用計(jì)算機(jī), 下位機(jī)選用日本Omron公司的CP1H系列XA40DR-A可編程序控制器。在計(jì)算機(jī)外設(shè)中,RS-232串口因?yàn)槠浣M成方式簡(jiǎn)單,編程控制方便而成為應(yīng)用最為廣泛的I/O通道之一。32 位下串口通信程序通常采用兩種方法實(shí)現(xiàn):一是利用ActiveX控件; 二是使用API通信函數(shù)。使用ActiveX控件, 程序?qū)崿F(xiàn)非常簡(jiǎn)單, 結(jié)構(gòu)清晰,缺點(diǎn)是欠靈活; 使用API通信函數(shù)的優(yōu)缺點(diǎn)則基本上相反[2]。VC++6.0的MSComm是Microsoft 公司提供的簡(jiǎn)化Windows 下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡(jiǎn)便方法,筆者采用了這種方法。其端口接線見附圖。
2.1 上位機(jī)與PLC的通訊協(xié)議
HOST Link系統(tǒng)使用HOST Link 通信協(xié)議進(jìn)行通信,上位機(jī)具有傳送優(yōu)先權(quán),總是首先發(fā)出命令并啟動(dòng)通信,HOST Link 通信單元收到命令交由PLC執(zhí)行,然后將執(zhí)行結(jié)果返回上位機(jī),兩者以幀為單位輪流交換數(shù)據(jù)。
2.2 上位機(jī)的PLC鏈接通訊
通信時(shí)一組傳送的數(shù)據(jù)稱為塊,它是命令或響應(yīng)的單位,從上位機(jī)發(fā)送到HOSTLink 單元的數(shù)據(jù)稱為命令塊,相應(yīng)的,從HOSTLink單元發(fā)送到上位機(jī)的數(shù)據(jù)稱為響應(yīng)塊。多點(diǎn)通信時(shí),單幀發(fā)送的最大數(shù)據(jù)塊為131 個(gè)字符,因此當(dāng)一個(gè)數(shù)據(jù)塊含有132 個(gè)或更多字符時(shí),要分成兩幀或多幀進(jìn)行發(fā)送。多幀發(fā)送時(shí)中間幀的格式為:正文、FCS、分界符。起始幀、中間幀的長(zhǎng)度為131 ,結(jié)束幀的長(zhǎng)度最多為131 個(gè)字符。
Omron系列的PLC 通過RS232 口與主機(jī)通信有兩種方式,第一種是由上位機(jī)向PLC 發(fā)送初始命令,第二種是由PLC 向上位機(jī)發(fā)送初始命令[3]。在監(jiān)測(cè)系統(tǒng)中一般采用第一種方式。有關(guān)通信協(xié)議如下所述:
2.2.1上位機(jī)→PLC 的命令格式
其中:
(1)@為起始標(biāo)志符;
(2)N2 、N1 為PLC 節(jié)點(diǎn)標(biāo)志碼,由兩位十進(jìn)制數(shù)表示,它們用來指定與上位機(jī)通信的PLC。而PLC 自己的通信節(jié)點(diǎn)碼可由它的DM6648 和DM6653 來設(shè)置;
(3)CMD2 、CMD1 為兩字節(jié)命令碼;
(4)MT 為命令內(nèi)容,用來設(shè)置具體的命令參數(shù);
(5)V2、V1 為兩字節(jié)的幀校驗(yàn)碼,它是從開始符“@”到MT碼結(jié)束的所有字符的ASCII 碼按位異或的結(jié)果; 幀校驗(yàn)和是一個(gè)轉(zhuǎn)換成2 個(gè)ASCII 字符的8 位數(shù)據(jù)。它把幀中每一個(gè)字符順序地進(jìn)行異或操作而得到的結(jié)果,即把幀的第一個(gè)字符到正文結(jié)束的所有字符轉(zhuǎn)換成二進(jìn)制形式的ASCII 碼后,逐個(gè)異或而得到的[4]。當(dāng)發(fā)送命令時(shí),將其加在命令格式中,作為幀的一部分發(fā)送到接收端。當(dāng)接收數(shù)據(jù)時(shí),按上述步驟重新計(jì)算FCS ,當(dāng)計(jì)算結(jié)果與數(shù)據(jù)塊中所帶的FCS 相同時(shí),說明傳輸無誤,否則,說明接收到的數(shù)據(jù)不正確。
(6)“*”和“CR”兩字符表示命令結(jié)束。
例如,@00WD00060500表示寫一個(gè)數(shù)500到節(jié)點(diǎn)為0的PLC的DM0006中。
2.2.2 PLC→上位機(jī)的響應(yīng)格式
其中S2 、S1 為命令結(jié)束狀態(tài)碼,如00 表示正常結(jié)束,01 表示RUN 模態(tài)下PLC 無法完成上位機(jī)命令,其余符號(hào)代碼意義同上。實(shí)現(xiàn)上位機(jī)與HOST Link 通信單元的通信只需編寫上位機(jī)程序,因?yàn)镠OST Link 通信單元自身帶有通信程序,上位機(jī)下發(fā)命令,地址相符的PLC 自動(dòng)上傳響應(yīng)幀,所以這一部分程序不需要客戶編寫,但是,編寫上位機(jī)的通信程序時(shí),通信參數(shù)的設(shè)置必須保證與PLC 的通信參數(shù)一致性。
3.用VC++6.0編寫串行通信程序
首先建立一個(gè)基于對(duì)話框的MFC應(yīng)用程序SCommTest,支持ActiveX控件,電話形狀的控件是在系統(tǒng)中注冊(cè)過的MicrosoftCommunications Control, version 6.0,接受缺省的選項(xiàng)。
1.打開串口設(shè)置串口參數(shù)
在主對(duì)話框CSCommTestDlg::OnInitDialog()中打開串口,加入如下代碼:
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1); //選擇com1
i f ( ! m _ c t r l C o m m . G e t P o r t O p e n ( ) ) m _ c t r l C o m m .
SetPortOpen(TRUE);//打開串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,E,7,2"); //波特率9600,偶校驗(yàn),7個(gè)數(shù)據(jù)位,2個(gè)停止位
m_ctrlComm.SetInputModel(1); //1:表示以二進(jìn)制方式檢取數(shù)據(jù)m_ctrlComm.SetRThreshold(1);
//參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(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ù)
2.發(fā)送數(shù)據(jù)
為發(fā)送按鈕添加一個(gè)單擊消息BN_CLICKED處理函數(shù),選擇IDC_BUTTON_MANUALSEND,添加OnButtonManualsend()函數(shù),并在函數(shù)中添加如下代碼:
UpdateData(TRUE); //讀取編輯框內(nèi)容
SendData(m_strTXData1,6);
// m_strTXData1表示發(fā)送速度命令的具體數(shù)值,6表示寫數(shù)據(jù)的地址DM0006
Sleep(100);
SendData(m_strTXData2,12); //m_strTXData1表示發(fā)送時(shí)間命令的具體數(shù)值,12表示寫數(shù)據(jù)的地址DM00123.發(fā)送命令
按照命令格式,本課題主要發(fā)送兩個(gè)WD命令:
(1)數(shù)據(jù)采用十進(jìn)制發(fā)送,向DM0006中寫入速度指令;
(2)數(shù)據(jù)采用十進(jìn)制發(fā)送,向DM0012中寫入時(shí)間指令。部分程序如下:
Void CSCommTestDlg::SendData(int m_TobeSend,intm_address)
{ CByteArray Array;
unsigned char auchMsg[45]={0}
auchMsg[0]=64; // 起始標(biāo)志符
auchMsg[1]=0x0; //節(jié)點(diǎn)號(hào)
auchMsg[2]=0x0; auchMsg[3]=‘W‘; //命令符
auchMsg[4]=‘D‘;
auchMsg[5]=m_address/1000;
auchMsg[6]=(m_address%1000)/100;
auchMsg[7]=(m_address%100)/10;
auchMsg[8]=m_address%10;
auchMsg[9]=m_TobeSend/1000;
auchMsg[10]=(m_TobeSend%1000)/10;
auchMsg[11]=(m_TobeSend%100)/10;
auchMsg[12]=m_TobeSend%10;
LRC(auchMsg,13);
//auchMsg[13] ,auchMsg[14] ,保存FCS值
auchMsg[15]=‘*‘; //命令結(jié)束符
auchMsg[16]=13;
Array.RemoveAll();
for (Count=0;Count<17;Count++)
Array.Add(auchMsg[Count]);
m _ c t r l C o m m . S e t O u t p u t ( C O l e Va r i a n t ( A r r a y ) ) ;
4.計(jì)算校驗(yàn)碼函數(shù)
unsigned char uchLRC = 0 ; 初始值設(shè)定
while (usDataLen——)
{uchLRC ︿= *auchMsg++; }
unsigned char high=0xF0;
//high為校驗(yàn)碼的高位
unsigned char low=0x0F;
//low為校驗(yàn)碼的低位
high&=uchLRC;
low&=uchLRC;
high>>=4;右移四位
if(high<=9)
high=high+48;
else
high=high+55;
if(low<=9)
low=low+48;
else
low=low+55;
*auchMsg++=high;
*auchMsg++=low;
四.結(jié)束語
此程序在VC++6.0中運(yùn)行通過,并成功應(yīng)用于振動(dòng)磨的控制中。該系統(tǒng)采用OMRON XA40DR-A PLC與上位機(jī)連接組成控制系統(tǒng),上位機(jī)通過串行口向PLC發(fā)出寫命令及數(shù)據(jù),PLC接受數(shù)據(jù)后,通過D/A轉(zhuǎn)換模塊,將模擬量發(fā)給變頻器,從而實(shí)現(xiàn)了振動(dòng)磨振動(dòng)速度和時(shí)間的控制。
參考文獻(xiàn)
[1]OMRON公司.CP1H操作手冊(cè).2005
[2]萬曼影.視窗環(huán)境下歐姆龍PLC的實(shí)時(shí)通信.微處理機(jī).2004(6)
[3]何華東,趙喜榮.PLC與上位計(jì)算機(jī)的串行通信程序設(shè)計(jì).機(jī)電工程.2002(6)
[4]OMRON公司.CPM編程手冊(cè).2003基金項(xiàng)目:國(guó)家自然科學(xué)基金資助項(xiàng)目(編號(hào):50575147)
作者簡(jiǎn)介:蘇丹(1982-),女,在讀碩士;
王樹林(1951—),男,教授,博士生導(dǎo)師。