引言
西門子S7-2OO CPU可支持多種通信協議,如點到點(Pojnt-to-point)的協議(即PPI)、多點協議(MPI),以及Prfibus協議等。其中PPI協 議是西門子公司專門為其產品S7-200開發的通信協議,使用PPI協議進行通信時,PLC可以不用編程,而且可讀寫所有數據區,快捷方便。但是,PPI 協議屬內部協議對外不公開,用戶如果想使用PPI協議監控,必須購買其監控產品或第三方廠家的組態軟件(第三方廠家也是購買的該協議的驅動文件,他們同樣 也看不到該協議)。這樣給用戶自主開發帶來一定困難,特別是自行開發的現場設備就不能通過PPI協議接入PLC。其它通信方式編程也存在編程復雜,需要購 買軟件和授權等局限性。基于上述原因我們嘗試使用串口監視第三方軟件和PLC的數據通信,獲得它們的通信數據字,然后對大量的數據進行統計分析,得到通信 指令關鍵報文的格式,最后在自行開發的程序中逐一測試,總結得出PPI協議的內容,并開發出通信控件,使它在自主開發的總線控制系統中監控機與各子站 PLC的通信變得簡單、靈活、經濟,解決了PLC在現場總線控制系統中的通信難題。
Borland C++ Builder作為一種新穎的可視化編程語言,自誕生以來,就以其在運行速度、實現的功能及開發應用程序界面方面的強大功能風靡于世,成為Windows 平臺下最主要的應用開發系統之一。它繼承TRAD(rapid application development)和VCL(visual component library)技術,這使得利用C++ Builder開發應用程序變得簡單、快速、易于移植。因此,我們使用 C++ Builder開發通信控件。
一、S7-200 PPI協議
1.1 協議獲取方法
獲取協議的基本思路:西門子的Step7 Micro/ Win32是用于S7-200系列PLC的編程開發工具,它使用PC機上的COM口通過一條PC/PPI編程電纜連接到PLC的編程口上。這說明,PC實 際上是可以通過串口與S7-2OOCPU通信。通過截獲PC機串口上的收發數據,對照Step7 Micro/Win32軟件發出的指令,我們就有可能分析出有關指令的報文和通信方式;然后,直接通過串口向PLC發送報文,以驗證這些指令報文是否正 確。昆侖公司開發的MCGS組態軟件中有西門子S7-2OOPPI協議的驅動程序,我們可以利用它強大的監控能力更加方便地獲取數據報文。
獲取協議需要的硬件條件:一臺具有至少兩個串行口的計算機,一條SIEMENSS7-2OO PC/PPI電纜,串口分支器(自行制作)等。
軟件條件:Step7 Micro/Win32軟件,帶PPI驅動程序的組態軟件(如MCGS),C++ Builder開發環境,串口監視軟件(可選)。
制作一個串口的分支器,COM1的RX、TX分別接到COM2的TX、RX,即交叉接線,使得COM1發送的數據COM2能收到。PC/PPI編程電纜接在COM1上,這樣,Step7 MiCro/Win32發給PLC的報文就可以在COM2上接收了。我們按S7-200系統手冊設置兩個串口,參數均為9600、8、偶校驗、1位停止位,然后設置Step7軟件,使之能與S7-200CPU正常通信。從Step7軟件中發出一個明確指令,COM2上的監視軟件就能顯示這條報文了(用16進制顯示)。通過類比組態軟件與PLC通信中所得至的數據,我們即可以得到一些關鍵的報文。串口分支器原理如圖1所示。
1.2 協議分析
編寫串口監視程序,對計算機進行底層操作,使計算機的兩個串口互不干擾。程序一開始執行就打開監視串□,監聽并記錄經過串口的所有數據,利用串口接收經過串口的數據,對接收到的大量數據進行分析。
例如:通過Step7 Micro/Win32軟件訪司PLC寄存器VBl00,串口監視程序得到的另一串口發送和接收的數據為:
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,串口監視程序得到的另一串口發送和接收的數據為:
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
上面僅給出兩個讀寫操作的例子,實際中利用這種方法得到大量的數據,進行統計比較分析,總結出協議指令格式。
1.3 協議指令測試
根據上面分析總結出的協議指令,利用C++ Builder編寫測試程序(實現與PLC的通信)逐一對操作進行測試,對測試過程進行詳細的記錄;然后分別利用組態軟件MCGS,以及西門子開發的 OPC軟件PC ACCESS(它們與S7-200通信都是使用PPI協議)再與PLC通信檢驗測試結果的正確性,進而檢驗所總結的協議指令的正確性。測試界面如圖2所 示。
下面給出測試部分用的關鍵程序段:
//發送指令,其中數組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為定義的一個固定數組
//其中有要發的數據
MSComm1-》Output=TxBuff;
//接收返回數據,數據以整形表示
OleVariant BxBuff;
RxBuff=MSComm1-》Input;
//接收數據
int a=RxBuff.ArrayHighBound(1);
//接收數據的字節數
for(int i=0;i《Len;i++)
//提取接收到的數據到接收緩沖數組中得到有用數據
rev_array[i]=RxBuff.GetElement(a-1-Len+i);
for(int i=0;i《Len;i++)
dataTy=dataTy*16*16+rcv_array[i];
……
二、通信控件研究與開發
C++ Builder中提供了相當多的控件供開發人員選用,控件可分為可視化控件與不可視化控件兩種。可視化控件在使用時可以在設計階段和運行階段均見到其外 觀;不可視控件則只能在設計階段看到一個代表的圖標,運行階段是不可見的,但可以看到該控件所提供的服務。除了C++ Builder所提供的控件外,程序開發人員可以針對本身的需要自行組合現有的控件而創建一個新的控件,或是自行開發一個全新的控件,開發完成后便可加入 到C++ Builder的控件面板中,同C++ Builder中自身的控件一樣使用,相當方便。
根據上述對西門子PPI協議的解讀及其測試利用C++ Builder開發PPI通信控件的詳細說明如下。
2.1 控件的創建步驟
本文創建的控件屬不可視控件;從Tcomponent類繼承而來,可在設計期間見到代表的圖標,運行期間見到控件實現的功能。設計步驟具體如下:
①在C++ Builder集成開發環境下,選擇Filel New菜單,調出對象庫,然后選擇New選項卡中的 Component選項,輸入適當的控件類,命名為TS7Comm,定義安裝在自定義標簽7e,如圖3所示。
②窗體出現一個空白的控件單元文件,至此控件的基本架構結束,下面就是實際的程序代碼編寫。
③創建代表控件的代表圖標。
文章所要開發的控件屬于執行期不可見的控件,需要一個代表的圖標放在控件面板上,當在應用程序中使用該控件時,也要在窗口上顯示代表圖標。使用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的狀態(登錄、啟動、停止),強制I/O操作(強制讀迸數字量輸入和強制寫數字量輸出)。
為了簡化串口程序的設計,本文選用了Microsoft的MSCOmm控件。注冊MSCOmm控件,C++ Builder中不像VB、VC本身提供串行通信控件MSComm,但是我們可以通過注冊后像VB、VC那樣使用它。啟動C++ Builder后,選擇主菜單中的Component菜單項,單擊Import Active Control命令,彈出Import Active窗口,選擇Microsoft Comm Control6.0,在選擇Install按鈕執行安裝命令,系統會自動進行編譯,編譯完成后即完成了MSComm控件的注冊,系統默認安裝在 Active頁,這里安裝在標簽7e下。接下來我們就可以像使用C++ Builder本身提供的控件那樣使用新注冊的MSComm控件了。這樣就不用再像串口監視那樣使用較復雜的API函數,而用MSComm控件可以省去不 少底層程序的編寫,簡單地實現串口通信,在開發控件的Unit文件的頭文件中加入#include “MSCommLib_OCX.h”。
下面給出部分重要屬性、函數的聲明
class PACKAGE TS7Comm:public TComponent
{
PrlVate:
TComPonNumber FConmmPonent;
bool FPortOpen;
void-fastcall SetCommPort ComPortNumber port);
//設置通信端口
void-fastcall SetBaudRate (TBaudRate Rate);
//設置通信速率
void-fastcall SetDataBits (TDataBits Num);
//設置數據位數
void-fastcall SetStopBits (TStopBits Num);
//設置停止位
void -fastcall SetParity (TParity p)
//設置檢驗方式
void -fastcall SetPortOpen (bool b)
//打開通信端口
void OpenPort( ) ;
void ClosePort( ) ;
//關閉通信端口
。..。..
protected
。..。..
public
-fastcall TS7Comm (TComponent* Owner) ;
//構造函數
-property bool PortOpen = {read = FPortOpen, write=SetPortOpen, default=false};
//開關通信端口
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);
//寫寄存器,最后一個參數為欲寫入的數據
bool-fastcall ForceRead(int plcAddr,int regAddr);
//強制讀數字量輸入
bool-fastcall ForceWrite(int plcAddr,int regAddr);
//強制寫數字量輸出
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 控件的安裝調試
以上控件命名為TS7Comm,依照屬性、事件、方法構建了控件的各種服務,也創建了控件的代表圖標,編譯控件的文件S7Comm.Cpp,通過編譯后, 生成目標文件S7Comm.obj,這樣就為控件的安裝做好了準備。控件的安裝過程:首先,將開發的控件文件加大到一個包中,這樣才能把它放到控件面板 里。在菜單Component下選擇Install Component;接下來在unit file name中選擇控件的文件,必須指明完整的路徑,再給定要安裝的包文件名稱(Package file name),然后,點擊OK,在出現的’Package窗口中就包含了控件的名稱和其所屬單元文件的名稱。接下來是進行編譯(Compile)操作,由 C++ Builder的編譯器看看所創建的控件是否可以通過編譯,在Package窗口中點擊左上方的Compile圖標按鈕后,即開始進行編譯。編譯過程中如 果出現問題,C++ Builder會提示程序的錯誤點或警告點。此時必須對程序進行修正,直到所有的錯誤點被更正為止。最后,所有的問題郡修正完畢后,程序即通過了編譯,單 擊install圖標按鈕,系統即為控件在控件面板上設置一個放置位置,這與空間文件中Register函數所指明的標簽一致。一切安裝操作完成后,在 C++ Builder的控件面板的7e控件頁面中就出現了一個S7COmm控件。
至此,控件的安裝已完成,接下來對控件迸行測試。筆者通過在應用程序中做了大量的測試,證明該控件各項功能都能正確實現,且穩定可靠。目前,該控件已經在THJ-2型高級過程控制系統實驗裝置的自主監控平臺上使用,運行良好。
三、結束語
本文利用計算機串口監視技術成功獲得了西門子S7-2OOPPI協議的指令字,并加以解析、總結、測試,并在C++ Builder開發環境集成開發了PPI通信控件。實踐證明,在不使用西門子通信驅動程序或者其它組態軟件的情況下,利用所開發的PPI通信控件實現上位 機對PLC的監控該方法投資少,易于開發,運行穩定可靠,易于小型監控系統使用。另外,本文所述對通信端口進行監測、分析的方法對一些未知協議的測定和通 信錯誤的檢查也具有一定的指導意義。
責任編輯:Gt
-
plc
+關注
關注
5016文章
13385瀏覽量
464811 -
西門子
+關注
關注
94文章
3062瀏覽量
116274 -
現場總線
+關注
關注
3文章
521瀏覽量
38612
發布評論請先 登錄
相關推薦
評論