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

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

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

西門子 S7-200 通過模塊連接易控通訊步驟介紹

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

評論