一、 概述

工業裝置採用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~VB10,共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