1 引言 隨著計算機通訊技術的日益成熟及企業(yè)對工業(yè)自動化程度要求的提高,自動控制系統(tǒng)從傳統(tǒng)的集中式控制向多級分布式控制方向發(fā)展,構成控制系統(tǒng)的PLC也就必須具備通信聯(lián)網(wǎng)功能。在具體應用過程中,若要監(jiān)視PLC內部的數(shù)據(jù)與運行狀況,選用市場上的人機界面或組態(tài)軟件,雖然功能豐富,但大都價格昂貴,尤其在一些中小規(guī)模的生產場合。所以許多企業(yè)希望能自己用高級語言開發(fā)一個簡易實用的通信程序,通過面向對象的可視化編程語言VB6.0很容易地實現(xiàn)分布式監(jiān)控。PLC等下位機控制生產過程,本地計算機進行實時監(jiān)測或參與控制生產現(xiàn)場的參數(shù)。本文通過對OMRON的CPM1A小型機與上位計算機通信原理和通信方法的研究,介紹了如何用VB6.0實現(xiàn)上位計算機對PLC的實時監(jiān)控,并取得了良好的效果。 2 監(jiān)控原理 2.1 通信方法 ![]() 圖1 系統(tǒng)通信原理 在通信過程中上位機始終處于主動方,PLC則處于從動方,所有的數(shù)據(jù)交換只能在主站和從站之間進行,從站之間不能直接交換數(shù)據(jù),如果從站之間需要交換數(shù)據(jù),必須通過主站中轉1。首先上位機向PLC發(fā)送指令幀,PLC接收了上位機的指令后,先進行FCS校驗,看其是否正確,如果正確,則接收并向上位機傳送響應幀(包含首尾校驗字節(jié)),否則,PLC拒絕向上位機傳送數(shù)據(jù)。需要說明的是,整個通信過程中因PLC中配有通信機制,一般不需要對PLC進行編程。上位機接收到PLC傳送的數(shù)據(jù),也要判斷正確與否,如果正確,則接收,完成一次正常通信,否則,通信需重新開始。 2.2 通訊協(xié)議 ● 雙方在初始化時要使波特率、數(shù)據(jù)位數(shù)、停止位數(shù)、奇偶校驗均保持一致;
![]() (3)通訊的響應幀設計
![]() 其中,@為前導字符,表示開始;設備號為00-31(本例限設到10),共可設置32個站號,用來識別所連接的PLC,可通過PLC的DM6653的低8位來設定,默認站號為00;命令碼為CPMIA小型PLC規(guī)定的對其操作的命令代碼;正文為需要讀或寫的數(shù)據(jù)地址以及數(shù)據(jù);FCS為幀校驗代碼,用于及時發(fā)現(xiàn)通信過程中的錯誤,以備處理;*和CR表示命令結束[2>。 命令幀為PC機傳向PLC的幀格式,響應幀為PLC傳向PC機的幀格式,其命令幀與響應幀中的各個部分除數(shù)據(jù)區(qū)不同外,其他部分的含義是相同的。 2.3 MSComm控件介紹 表1 MSComm控件屬性 ![]() 2 通信程序設計 本系統(tǒng)以PC對基于PLC的交通燈控制系統(tǒng)的監(jiān)控為例,在上位機與PLC正常通信的前提下,設計如下界面。窗體的內容主要包括,四大區(qū):端口、站號選擇區(qū),設定時間輸入?yún)^(qū),監(jiān)控顯示區(qū),控制按紐區(qū)。從站號選擇區(qū)選擇不同站號即不同PLC,實現(xiàn)對多個PLC的實時監(jiān)控。 3.1 串口初始化程序 If en <> True Then 3.2 計算機與PLC通信的VB程序 ![]() Dim OutputStr As String Dim InString As String Dim ReturnStr As String Dim EndString As String Dim FCSString As String Dim ReturnFCSString As String erCount=0 OutputStr=InputStr+FCS(InputStr)+“*” If en=True Then =OutputStr+Chr$(13)’按照PLC幀格式輸出 End If Do DoEvents Loop Until erCount >=Num2’返回幀的長度 InString= EndString=Mid$(InString,6,2)’取返回幀的響應碼 If EndString <> “00”Then ReadData=“Error” Exit Function End If EndString=Mid$(InString,1,Len(InString)-4) ReturnFCSString=Mid$(InString, Len(InString) -3,2)’取返回幀校驗碼 FCSString=FCS(EndString) If FCSString <> ReturnFCSString Then ReadData=“Error” Exit Function End If If Len(InString)>=Num2 Then ReturnStr=Mid$(InString, Len(InString)-Num1-3, Num1)’取返回幀的數(shù)據(jù),其度為Num1 ReadData = ReturnStr End If End Function 4 結束語 |
(轉載)