PC+PLC通過Modbus協議構建工控系統


 

一、 概述

工業設備采用HMI+PLC控制是比較常見的方案,隨着工業自動化的要求越來越高,現在很多設備都要求接入企業MES系統,MES系統一般為WEB系統,接口形式大部分為HTTP協議,這種傳統方案和MES系統接口就比較麻煩。

本文提供一種簡單的PC+PLC的工控方案,可以采用C#開發控制端人機交互頁面,PLC做控制中心,兩者通過Modbus協議通信交換數據。通過這個方案也可以對舊設備進行改造增加MES接口功能。

具體方案如下:

1、 試驗下位機采用SIMENS S7-200 Smart,上位機應用程序采用C#開發,軟件和PLC之間采用Modbus TCP協議進行通信。

2、 通信時,上位機避免訪問PLC的IQ、AI、M等區域,只通過V區域進行數據交換:PLC實時將設備狀態信息復制到指定位置,上位機每隔200ms去取一次狀態數據,並根據設備狀態和用戶指令進行相關操作;

3、 上位機將PLC需要執行的動作指示傳輸到指定位置,PLC每次執行程序掃描時根據數據做出相應反應。PLC應對數據的有效性進行檢驗,如果檢驗不通過將拒絕執行動作,並報錯。

4、 PLC還需要對一些安全方面的控制進行直接檢查,不需要等待上位機指示。包括:急停響應、限位開關、過壓等。

 

二、 方案說明

理論上,通過Modbus協議,上位機是可以直接訪問I/O、A/D、D/A等端口的,也就是說可以直接讀取輸入狀態,並控制輸出。但我們不建議這種方案,主要有下面幾個原因:

1、  PC向PLC詢問的時間不可能很及時,我們設定為200ms,這個時間對控制系統來說響應時間有點長了,PLC掃碼周期一般只幾有個ms,響應較快;

2、 通訊過程存在不穩定性,當通訊異常時,PLC恰好處於一個不安全的狀態就太危險了。

所以應保證PLC是具備控制能力的,當上位機向PLC發送命令時,如果出現異常,也應該保證PLC處於一個安全的狀態。

 

三、 試驗

我們做一個人簡單的試驗程序,它只有兩個功能

1、  將輸入(I0.0)的狀態顯示在程序界面上;

2、 通過上位機控制輸出狀態(Q0.0)

PLC部分程序:

 

 一共有3行程序:

第1行:啟動一個ModBus Server

說明:

1) MaxIQ:設置IQ的訪問范圍;

2)MaxAI設置AD的訪問范圍;

3)HoldStart:參數 HoldStart 為指向 V 存儲器中保持寄存器起始位置的指針。通常將該值設置為 &VB0(VB0 地址);

4)MaxHold:參數 MaxHold 設置可用於 Modbus 地址 4xxxx 的 V 存儲 器中的字保持寄存器數;

5)即使HoldStart不指向VB0,Modbus尋址仍是從0開始,范圍為0~MaxHold,如果超出范圍將報告非法數據地址的錯誤;

 第2行:將輸入狀態映射到V0.0

第3行:將V2.0數據映射到輸出狀態

 

上位機界面:

   

程序通過一個方塊的顏色顯示PLC輸入口的狀態;Start和Stop按鈕控制PLC輸出端口狀態。

客戶端通過EasyModbusTCP庫來實現基礎通訊,首先通過Nuget下載依賴庫。

   

狀態讀取:

int[] words = _modbusClient.ReadHoldingRegisters(0, 10);

byte VB0 = (byte)(words[0] >> 8);

byte VB1 = (byte)(words[00] & 0x00FF);

bool IsEmergencyStop = (VB0 & 0x01) == 1;

說明:

1)  首先從地址0讀取10個字(WORD),由於設置了HoldStart為VB0,所以會讀取VB0~VB20,共20個字節, words長度為10,每兩個字節形成一個int數據,低位在前,高位在后;

2)  通過第一個int數據取得VB0和VB1,然后再取得VB0.0即可得到位信息。

 

控制輸出:

       public void StartTest()

        {

            //V2.0

            _modbusClient.WriteSingleRegister(1, 0x0100);

        }

 

        public void StopTest()

        {

            //V2.0

            _modbusClient.WriteSingleRegister(1, 0x0000);

        }

 

WriteSingleRegister也是按照WORD來進行尋址的,例如:

WriteSingleRegister(10, 0x1234)

表示:VB20設置為0x12,VB21設置為0x34;

雙方交換float類型的實數也是可以的,這里就不詳細介紹了。

 

示例項目地址:https://gitee.com/seabluescn/plcsamples.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM