一、 概述
工業裝置採用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