一、 概述
工業設備采用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類型的實數也是可以的,這里就不詳細介紹了。