引言
西門(mén)子S7-2OO CPU可支持多種通信協(xié)議,如點(diǎn)到點(diǎn)(Pojnt-to-point)的協(xié)議(即PPI)、多點(diǎn)協(xié)議(MPI),以及Prfibus協(xié)議等。其中PPI協(xié) 議是西門(mén)子公司專(zhuān)門(mén)為其產(chǎn)品S7-200開(kāi)發(fā)的通信協(xié)議,使用PPI協(xié)議進(jìn)行通信時(shí),PLC可以不用編程,而且可讀寫(xiě)所有數(shù)據(jù)區(qū),快捷方便。但是,PPI 協(xié)議屬內(nèi)部協(xié)議對(duì)外不公開(kāi),用戶(hù)如果想使用PPI協(xié)議監(jiān)控,必須購(gòu)買(mǎi)其監(jiān)控產(chǎn)品或第三方廠家的組態(tài)軟件(第三方廠家也是購(gòu)買(mǎi)的該協(xié)議的驅(qū)動(dòng)文件,他們同樣 也看不到該協(xié)議)。這樣給用戶(hù)自主開(kāi)發(fā)帶來(lái)一定困難,特別是自行開(kāi)發(fā)的現(xiàn)場(chǎng)設(shè)備就不能通過(guò)PPI協(xié)議接入PLC。其它通信方式編程也存在編程復(fù)雜,需要購(gòu) 買(mǎi)軟件和授權(quán)等局限性。基于上述原因我們嘗試使用串口監(jiān)視第三方軟件和PLC的數(shù)據(jù)通信,獲得它們的通信數(shù)據(jù)字,然后對(duì)大量的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,得到通信 指令關(guān)鍵報(bào)文的格式,最后在自行開(kāi)發(fā)的程序中逐一測(cè)試,總結(jié)得出PPI協(xié)議的內(nèi)容,并開(kāi)發(fā)出通信控件,使它在自主開(kāi)發(fā)的總線控制系統(tǒng)中監(jiān)控機(jī)與各子站 PLC的通信變得簡(jiǎn)單、靈活、經(jīng)濟(jì),解決了PLC在現(xiàn)場(chǎng)總線控制系統(tǒng)中的通信難題。
Borland C++ Builder作為一種新穎的可視化編程語(yǔ)言,自誕生以來(lái),就以其在運(yùn)行速度、實(shí)現(xiàn)的功能及開(kāi)發(fā)應(yīng)用程序界面方面的強(qiáng)大功能風(fēng)靡于世,成為Windows 平臺(tái)下最主要的應(yīng)用開(kāi)發(fā)系統(tǒng)之一。它繼承TRAD(rapid application development)和VCL(visual component library)技術(shù),這使得利用C++ Builder開(kāi)發(fā)應(yīng)用程序變得簡(jiǎn)單、快速、易于移植。因此,我們使用 C++ Builder開(kāi)發(fā)通信控件。
一、S7-200 PPI協(xié)議
1.1 協(xié)議獲取方法
獲取協(xié)議的基本思路:西門(mén)子的Step7 Micro/ Win32是用于S7-200系列PLC的編程開(kāi)發(fā)工具,它使用PC機(jī)上的COM口通過(guò)一條PC/PPI編程電纜連接到PLC的編程口上。這說(shuō)明,PC實(shí) 際上是可以通過(guò)串口與S7-2OOCPU通信。通過(guò)截獲PC機(jī)串口上的收發(fā)數(shù)據(jù),對(duì)照Step7 Micro/Win32軟件發(fā)出的指令,我們就有可能分析出有關(guān)指令的報(bào)文和通信方式;然后,直接通過(guò)串口向PLC發(fā)送報(bào)文,以驗(yàn)證這些指令報(bào)文是否正 確。昆侖公司開(kāi)發(fā)的MCGS組態(tài)軟件中有西門(mén)子S7-2OOPPI協(xié)議的驅(qū)動(dòng)程序,我們可以利用它強(qiáng)大的監(jiān)控能力更加方便地獲取數(shù)據(jù)報(bào)文。
獲取協(xié)議需要的硬件條件:一臺(tái)具有至少兩個(gè)串行口的計(jì)算機(jī),一條SIEMENSS7-2OO PC/PPI電纜,串口分支器(自行制作)等。
軟件條件:Step7 Micro/Win32軟件,帶PPI驅(qū)動(dòng)程序的組態(tài)軟件(如MCGS),C++ Builder開(kāi)發(fā)環(huán)境,串口監(jiān)視軟件(可選)。
制作一個(gè)串口的分支器,COM1的RX、TX分別接到COM2的TX、RX,即交叉接線,使得COM1發(fā)送的數(shù)據(jù)COM2能收到。PC/PPI編程電纜接在COM1上,這樣,Step7 MiCro/Win32發(fā)給PLC的報(bào)文就可以在COM2上接收了。我們按S7-200系統(tǒng)手冊(cè)設(shè)置兩個(gè)串口,參數(shù)均為9600、8、偶校驗(yàn)、1位停止位,然后設(shè)置Step7軟件,使之能與S7-200CPU正常通信。從Step7軟件中發(fā)出一個(gè)明確指令,COM2上的監(jiān)視軟件就能顯示這條報(bào)文了(用16進(jìn)制顯示)。通過(guò)類(lèi)比組態(tài)軟件與PLC通信中所得至的數(shù)據(jù),我們即可以得到一些關(guān)鍵的報(bào)文。串口分支器原理如圖1所示。
1.2 協(xié)議分析
編寫(xiě)串口監(jiān)視程序,對(duì)計(jì)算機(jī)進(jìn)行底層操作,使計(jì)算機(jī)的兩個(gè)串口互不干擾。程序一開(kāi)始執(zhí)行就打開(kāi)監(jiān)視串□,監(jiān)聽(tīng)并記錄經(jīng)過(guò)串口的所有數(shù)據(jù),利用串口接收經(jīng)過(guò)串口的數(shù)據(jù),對(duì)接收到的大量數(shù)據(jù)進(jìn)行分析。
例如:通過(guò)Step7 Micro/Win32軟件訪司PLC寄存器VBl00,串口監(jiān)視程序得到的另一串口發(fā)送和接收的數(shù)據(jù)為:
68 1B lB 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 01 00 01 84 00 03 20 8B 16
68 16 16 68 00 02 08 32 03 00 00 00 00 00 02 00 05 00 00 04 01 FF 04 00 08 41 97 16
通過(guò)Step7 Micro/Win32軟件改寫(xiě)PTC寄存器 VD2O0,串口監(jiān)視程序得到的另一串口發(fā)送和接收的數(shù)據(jù)為:
68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 12 0A 10 02 00 01 00 01 84 00 06 40 00 04 00 08 FF CF 16
E5
10 02 00 5C 5E 16
68 12 12 68 00 02 08 32 03 00 00 00 00 00 02 00 01 00 00 05 0l FF 47 16
上面僅給出兩個(gè)讀寫(xiě)操作的例子,實(shí)際中利用這種方法得到大量的數(shù)據(jù),進(jìn)行統(tǒng)計(jì)比較分析,總結(jié)出協(xié)議指令格式。
1.3 協(xié)議指令測(cè)試
根據(jù)上面分析總結(jié)出的協(xié)議指令,利用C++ Builder編寫(xiě)測(cè)試程序(實(shí)現(xiàn)與PLC的通信)逐一對(duì)操作進(jìn)行測(cè)試,對(duì)測(cè)試過(guò)程進(jìn)行詳細(xì)的記錄;然后分別利用組態(tài)軟件MCGS,以及西門(mén)子開(kāi)發(fā)的 OPC軟件PC ACCESS(它們與S7-200通信都是使用PPI協(xié)議)再與PLC通信檢驗(yàn)測(cè)試結(jié)果的正確性,進(jìn)而檢驗(yàn)所總結(jié)的協(xié)議指令的正確性。測(cè)試界面如圖2所 示。
下面給出測(cè)試部分用的關(guān)鍵程序段:
//發(fā)送指令,其中數(shù)組rInstr存儲(chǔ)的是指令字
Variant TxBuff;
//聲明一個(gè)OleVariant變量
TxBuff=VarArrayCreate(OPENARRAY(int,(0,32)),varByte);
//重置它的大小,為0~n,int為n的類(lèi)型
//varByte 為T(mén)xBuff每一個(gè)元素的類(lèi)型
for(int i=0;i《33;i++)
TxbBuff.PutElement(rInstr[i],i);
//填充元素其中str_read為定義的一個(gè)固定數(shù)組
//其中有要發(fā)的數(shù)據(jù)
MSComm1-》Output=TxBuff;
//接收返回?cái)?shù)據(jù),數(shù)據(jù)以整形表示
OleVariant BxBuff;
RxBuff=MSComm1-》Input;
//接收數(shù)據(jù)
int a=RxBuff.ArrayHighBound(1);
//接收數(shù)據(jù)的字節(jié)數(shù)
for(int i=0;i《Len;i++)
//提取接收到的數(shù)據(jù)到接收緩沖數(shù)組中得到有用數(shù)據(jù)
rev_array[i]=RxBuff.GetElement(a-1-Len+i);
for(int i=0;i《Len;i++)
dataTy=dataTy*16*16+rcv_array[i];
……
二、通信控件研究與開(kāi)發(fā)
C++ Builder中提供了相當(dāng)多的控件供開(kāi)發(fā)人員選用,控件可分為可視化控件與不可視化控件兩種。可視化控件在使用時(shí)可以在設(shè)計(jì)階段和運(yùn)行階段均見(jiàn)到其外 觀;不可視控件則只能在設(shè)計(jì)階段看到一個(gè)代表的圖標(biāo),運(yùn)行階段是不可見(jiàn)的,但可以看到該控件所提供的服務(wù)。除了C++ Builder所提供的控件外,程序開(kāi)發(fā)人員可以針對(duì)本身的需要自行組合現(xiàn)有的控件而創(chuàng)建一個(gè)新的控件,或是自行開(kāi)發(fā)一個(gè)全新的控件,開(kāi)發(fā)完成后便可加入 到C++ Builder的控件面板中,同C++ Builder中自身的控件一樣使用,相當(dāng)方便。
根據(jù)上述對(duì)西門(mén)子PPI協(xié)議的解讀及其測(cè)試?yán)肅++ Builder開(kāi)發(fā)PPI通信控件的詳細(xì)說(shuō)明如下。
2.1 控件的創(chuàng)建步驟
本文創(chuàng)建的控件屬不可視控件;從Tcomponent類(lèi)繼承而來(lái),可在設(shè)計(jì)期間見(jiàn)到代表的圖標(biāo),運(yùn)行期間見(jiàn)到控件實(shí)現(xiàn)的功能。設(shè)計(jì)步驟具體如下:
①在C++ Builder集成開(kāi)發(fā)環(huán)境下,選擇Filel New菜單,調(diào)出對(duì)象庫(kù),然后選擇New選項(xiàng)卡中的 Component選項(xiàng),輸入適當(dāng)?shù)目丶?lèi),命名為T(mén)S7Comm,定義安裝在自定義標(biāo)簽7e,如圖3所示。
②窗體出現(xiàn)一個(gè)空白的控件單元文件,至此控件的基本架構(gòu)結(jié)束,下面就是實(shí)際的程序代碼編寫(xiě)。
③創(chuàng)建代表控件的代表圖標(biāo)。
文章所要開(kāi)發(fā)的控件屬于執(zhí)行期不可見(jiàn)的控件,需要一個(gè)代表的圖標(biāo)放在控件面板上,當(dāng)在應(yīng)用程序中使用該控件時(shí),也要在窗口上顯示代表圖標(biāo)。使用C++ Builder中的Image Edit程序,做一個(gè)24x24像素的Bitmap圖像,該Bitmap的名稱(chēng)要和控件有相同的命名,這里命名為T(mén)S7Comm,使用ImageEdit 繪圖工具畫(huà)完圖標(biāo)后,保存為T(mén)S7Comm.dcr。
2.2 控件的主要功能
控件要完成的主要功能是讀寫(xiě)S7-2OO PLC的寄存器(I、Q、M、V、S、SM等),控制S7-2OO PLC的狀態(tài)(登錄、啟動(dòng)、停止),強(qiáng)制I/O操作(強(qiáng)制讀迸數(shù)字量輸入和強(qiáng)制寫(xiě)數(shù)字量輸出)。
為了簡(jiǎn)化串口程序的設(shè)計(jì),本文選用了Microsoft的MSCOmm控件。注冊(cè)MSCOmm控件,C++ Builder中不像VB、VC本身提供串行通信控件MSComm,但是我們可以通過(guò)注冊(cè)后像VB、VC那樣使用它。啟動(dòng)C++ Builder后,選擇主菜單中的Component菜單項(xiàng),單擊Import Active Control命令,彈出Import Active窗口,選擇Microsoft Comm Control6.0,在選擇Install按鈕執(zhí)行安裝命令,系統(tǒng)會(huì)自動(dòng)進(jìn)行編譯,編譯完成后即完成了MSComm控件的注冊(cè),系統(tǒng)默認(rèn)安裝在 Active頁(yè),這里安裝在標(biāo)簽7e下。接下來(lái)我們就可以像使用C++ Builder本身提供的控件那樣使用新注冊(cè)的MSComm控件了。這樣就不用再像串口監(jiān)視那樣使用較復(fù)雜的API函數(shù),而用MSComm控件可以省去不 少底層程序的編寫(xiě),簡(jiǎn)單地實(shí)現(xiàn)串口通信,在開(kāi)發(fā)控件的Unit文件的頭文件中加入#include “MSCommLib_OCX.h”。
下面給出部分重要屬性、函數(shù)的聲明
class PACKAGE TS7Comm:public TComponent
{
PrlVate:
TComPonNumber FConmmPonent;
bool FPortOpen;
void-fastcall SetCommPort ComPortNumber port);
//設(shè)置通信端口
void-fastcall SetBaudRate (TBaudRate Rate);
//設(shè)置通信速率
void-fastcall SetDataBits (TDataBits Num);
//設(shè)置數(shù)據(jù)位數(shù)
void-fastcall SetStopBits (TStopBits Num);
//設(shè)置停止位
void -fastcall SetParity (TParity p)
//設(shè)置檢驗(yàn)方式
void -fastcall SetPortOpen (bool b)
//打開(kāi)通信端口
void OpenPort( ) ;
void ClosePort( ) ;
//關(guān)閉通信端口
。..。..
protected
。..。..
public
-fastcall TS7Comm (TComponent* Owner) ;
//構(gòu)造函數(shù)
-property bool PortOpen = {read = FPortOpen, write=SetPortOpen, default=false};
//開(kāi)關(guān)通信端口
long-fastCall ReadData(int plcAddr,TRortOpen,write=SetPortOpen,default=false};
//讀寄存器,plcAddr PLC的地址,默認(rèn)為02,regTy寄存器地址
//regAddr是寄存器地址
void-fastcall WriteData(int plcAddr,TRegType regTy,int regAddr,long data);
//寫(xiě)寄存器,最后一個(gè)參數(shù)為欲寫(xiě)入的數(shù)據(jù)
bool-fastcall ForceRead(int plcAddr,int regAddr);
//強(qiáng)制讀數(shù)字量輸入
bool-fastcall ForceWrite(int plcAddr,int regAddr);
//強(qiáng)制寫(xiě)數(shù)字量輸出
bool-fastcall PlC(int plcAddr);
//登錄指定的PLC站
bool-fastcall RunPlc(int plcAddr);
//啟動(dòng)
bool-fastcall StopPlc(int plcAddr) ;
//停止
……
-published:
//加入屬性
-property TComPornNumber CommPort={read=FCommport,write=SetCommPort,default=pnComl};
-property TBaudRate BaudRate = {read=FBaudRate,write=SetBaudRate,default=br9600};
-property TDataBits DataBits = {read=FDataBits,write=SetDataBits,default=DB8};
-Property TParity Parity={read=FParity,write=Setparity,default=None};
-property TStopBits StopBits={read=FStopBits,write=SetStopBits,default=SB1‘;
2.3 控件的安裝調(diào)試
以上控件命名為T(mén)S7Comm,依照屬性、事件、方法構(gòu)建了控件的各種服務(wù),也創(chuàng)建了控件的代表圖標(biāo),編譯控件的文件S7Comm.Cpp,通過(guò)編譯后, 生成目標(biāo)文件S7Comm.obj,這樣就為控件的安裝做好了準(zhǔn)備??丶陌惭b過(guò)程:首先,將開(kāi)發(fā)的控件文件加大到一個(gè)包中,這樣才能把它放到控件面板 里。在菜單Component下選擇Install Component;接下來(lái)在unit file name中選擇控件的文件,必須指明完整的路徑,再給定要安裝的包文件名稱(chēng)(Package file name),然后,點(diǎn)擊OK,在出現(xiàn)的’Package窗口中就包含了控件的名稱(chēng)和其所屬單元文件的名稱(chēng)。接下來(lái)是進(jìn)行編譯(Compile)操作,由 C++ Builder的編譯器看看所創(chuàng)建的控件是否可以通過(guò)編譯,在Package窗口中點(diǎn)擊左上方的Compile圖標(biāo)按鈕后,即開(kāi)始進(jìn)行編譯。編譯過(guò)程中如 果出現(xiàn)問(wèn)題,C++ Builder會(huì)提示程序的錯(cuò)誤點(diǎn)或警告點(diǎn)。此時(shí)必須對(duì)程序進(jìn)行修正,直到所有的錯(cuò)誤點(diǎn)被更正為止。最后,所有的問(wèn)題郡修正完畢后,程序即通過(guò)了編譯,單 擊install圖標(biāo)按鈕,系統(tǒng)即為控件在控件面板上設(shè)置一個(gè)放置位置,這與空間文件中Register函數(shù)所指明的標(biāo)簽一致。一切安裝操作完成后,在 C++ Builder的控件面板的7e控件頁(yè)面中就出現(xiàn)了一個(gè)S7COmm控件。
至此,控件的安裝已完成,接下來(lái)對(duì)控件迸行測(cè)試。筆者通過(guò)在應(yīng)用程序中做了大量的測(cè)試,證明該控件各項(xiàng)功能都能正確實(shí)現(xiàn),且穩(wěn)定可靠。目前,該控件已經(jīng)在THJ-2型高級(jí)過(guò)程控制系統(tǒng)實(shí)驗(yàn)裝置的自主監(jiān)控平臺(tái)上使用,運(yùn)行良好。
三、結(jié)束語(yǔ)
本文利用計(jì)算機(jī)串口監(jiān)視技術(shù)成功獲得了西門(mén)子S7-2OOPPI協(xié)議的指令字,并加以解析、總結(jié)、測(cè)試,并在C++ Builder開(kāi)發(fā)環(huán)境集成開(kāi)發(fā)了PPI通信控件。實(shí)踐證明,在不使用西門(mén)子通信驅(qū)動(dòng)程序或者其它組態(tài)軟件的情況下,利用所開(kāi)發(fā)的PPI通信控件實(shí)現(xiàn)上位 機(jī)對(duì)PLC的監(jiān)控該方法投資少,易于開(kāi)發(fā),運(yùn)行穩(wěn)定可靠,易于小型監(jiān)控系統(tǒng)使用。另外,本文所述對(duì)通信端口進(jìn)行監(jiān)測(cè)、分析的方法對(duì)一些未知協(xié)議的測(cè)定和通 信錯(cuò)誤的檢查也具有一定的指導(dǎo)意義。
責(zé)任編輯:Gt
-
plc
+關(guān)注
關(guān)注
5037文章
13916瀏覽量
474490 -
西門(mén)子
+關(guān)注
關(guān)注
98文章
3173瀏覽量
118243 -
現(xiàn)場(chǎng)總線
+關(guān)注
關(guān)注
3文章
526瀏覽量
39108
發(fā)布評(píng)論請(qǐng)先 登錄
S7-200西門(mén)子PLC視頻教程大全
西門(mén)子PPI協(xié)議詳解分析

西門(mén)子S7-200 PLC應(yīng)用100例

西門(mén)子S7-200以太網(wǎng)通訊解決方案

西門(mén)子PLC S7-200常見(jiàn)的71個(gè)故障匯總及解決辦法

英創(chuàng)信息技術(shù)工控主板通過(guò)PPI協(xié)議連接西門(mén)子PLC

西門(mén)子 S7-200 通過(guò)模塊連接易控通訊步驟介紹

西門(mén)子PLC S7-200 SMART PID控制功能分享
S7協(xié)議讀取西門(mén)子S7-200 Smart PLC數(shù)據(jù)

評(píng)論