C#讀寫 AB PLC 直接經過節點來讀寫數據 讀寫 AllenBradley PLC

本文將使用一個Github開源的組件庫技術來讀寫AB PLC,使用的是基於以太網的實現,不須要額外的組件,讀取操做只要放到後臺線程就不會卡死線程,本組件支持超級方便的高性能讀寫操做css

官網:http://www.hslcommunication.cn/     官網包含了詳細的API文檔html

聯繫做者及加羣方式(激活碼在羣裏發放):http://www.hslcommunication.cn/Cooperation 前端

本類庫絕對是ab最強的通信庫git

 

 

nuget地址:https://www.nuget.org/packages/HslCommunication/       nuget     下載github

github地址:https://github.com/dathlin/HslCommunication      fork      star                     若是喜歡能夠star或是fork,還能夠打賞支持。打賞請認準源代碼項目。數組

 

從NUGET安裝


Install-Package HslCommunication

 

準備


 

本文將展現怎樣使用代碼來訪問PLC數據,但願給有須要的人解決一些實際問題。主要對AB PLC的節點數據進行讀寫,您在應用工業生產使用以前,應該應該詳細的測試,以避免形成沒必要要的損失服務器

此處使用到了2個命名空間:網絡

using HslCommunication.Profinet.AllenBradley;
using HslCommunication;

  

隨便聊聊


當咱們一個上位機須要讀取100臺西門子PLC設備(此處只是舉個例子,凡是都是使用Modbus tcp的都是同樣的)的時候,你採用服務器主動去請求100臺設備的機制對性能來講是個極大的考驗,若是開100個線程去輪詢100臺設備,那麼性能損失將是很是大的,更不用說再增長設備,若是搭建Modbus tcp服務器,就能夠完美的解決性能問題,由於鏈接的壓力將會平均分攤給每一臺PLC,服務器端只要新增一個時間戳就能夠知道客戶端有沒有鏈接上。多線程

咱們在100臺PLC裏都增長髮送Modbus tcp方法,將數據發送到服務器的ip和端口上去,服務器根據站號來區分設備。這樣就能夠搭建一個高性能總站。 本組件支持快速搭建一個高性能的Modbus tcp總站。tcp

http://www.cnblogs.com/dathlin/p/7782315.html

 

關於兩種模式


在PLC端,包括三菱,西門子,歐姆龍,AB以及Modbus Tcp客戶端的訪問器上,都支持兩種模式,短鏈接模式和長鏈接模式,如今就來解釋下什麼原理。

短鏈接:每次讀寫都是一個單獨的請求,請求完畢也就關閉了,若是服務器的端口僅僅支持單鏈接,那麼關閉後這個端口能夠被其餘鏈接複用,可是在頻繁的網絡請求下,容易發生異常,會有其餘的請求不成功,尤爲是多線程的狀況下。

長鏈接:建立一個公用的鏈接通道,全部的讀寫請求都利用這個通道來完成,這樣的話,讀寫性能更快速,即時多線程調用也不會影響,內部有同步機制。若是服務器的端口僅僅支持單鏈接,那麼這個端口就被佔用了,好比三菱的端口機制,西門子的Modbus tcp端口機制也是這樣的。如下代碼默認使用長鏈接,性能更高,還支持多線程同步。

在短鏈接的模式下,每次請求都是單獨的訪問,因此沒有重連的困擾,在長鏈接的模式下,若是本次請求失敗了,在下次請求的時候,會自動從新鏈接服務器,直到請求成功爲止。另外,儘可能全部的讀寫都對結果的成功進行判斷。

 

關於日誌記錄


不論是三菱的數據訪問類,仍是西門子的,仍是Modbus tcp訪問類,都有一個LogNet屬性用來記錄日誌,該屬性是一個接口類,ILogNet,凡事繼承該接口的均可以用來記錄日誌,該日誌會在訪問失敗時,尤爲是由於網絡的緣由致使訪問失敗時會進行日誌記錄(若是你爲這個 LogNet 屬性配置了真實的日誌記錄器的話):若是你想使用該記錄日誌的功能,請參照以下的博客進行實例化:

http://www.cnblogs.com/dathlin/p/7691693.html

 

訪問測試項目


下面的一個項目是這個組件的訪問測試項目,您能夠進行初步的訪問的測試,免去了您寫測試程序的麻煩,三菱的界面和西門子的界面幾乎是一致的。能夠同時參考。該項目位於本篇文章開始處的Gitbub源代碼裏面的

下載地址爲:HslCommunicationDemo.zip 

 

 

 

演示項目,和本項目的信息無關,示例爲採集西門子PLC數據


下面演示了具體如何去訪問PLC的數據,咱們在訪問完成後,一般須要進行處理,如下的示例項目就演示了後臺從PLC讀取數據後,前臺顯示並推送給全部在線客戶端的功能,客戶端並進行圖形化顯示,具備必定的參考意義,而且推送給網頁前端,項目地址爲:

https://github.com/dathlin/RemoteMonitor

它應該和PLC直接鏈接並接入局域網,而後把數據推送給客戶端顯示。注意:一個複雜高級的程序就應該把處理邏輯程序和界面程序分開,好比這裏的服務器程序實現數據採集,推送,存儲。讓客戶端程序去實現數據的整理,分析,顯示,這樣即便客戶端程序由於BUG奔潰,服務器端仍然能夠正常的工做。

 

初始化訪問PLC對象

若是想使用本組件的數據讀取功能,必須先初始化數據訪問對象,根據實際狀況進行數據的填入。 下面僅僅是測試中的數據

private AllenBradleyNet allenBradleyNet  = new AllenBradleyNet( "192.168.0.110" );

  

鏈接PLC信息

實例化以後應該啓動PLC的鏈接操做。

OperateResult connect = allenBradleyNet.ConnectServer( );
                if (connect.IsSuccess)
                {
                    MessageBox.Show( "鏈接成功!" );
                }
                else
                {
                    MessageBox.Show( "鏈接失敗!" + connect.ToMessageShowString( ) );
                }

 

斷開PLC鏈接

allenBradleyNet.ConnectClose( );

  

讀取PLC信息

須要參照設備的節點信息來查看:

 

須要注意的是,咱們在讀取一個節點名稱以前,須要先查看該節點在PLC的數據類型,好比上面圖片裏的,B2是 REAL 類型,那麼咱們就須要使用float讀取,當你的類型選擇錯誤時,有可能會讀取不到正確的信息。

 

float value = allenBradleyNet.ReadFloat( "B2" ).Content

類型選擇的對應關係以下: bool 類型對應 bool    byte類型 對應  byte   DINT類型表明int等等。

 

批量讀取PLC信息

將讀取的節點變成一個數組信息傳入進去

public OperateResult<byte[]> Read( string[] address )

結果提取稍微麻煩一點,多個節點的數據拼接結果。例以下面:

OperateResult<byte[]> read = allenBradleyNet.Read( new string[] { "B1", "B2" } );
            if (read.IsSuccess)
            {
                int B1 = allenBradleyNet.ByteTransform.TransInt32( read.Content, 0 );
                float B2 = allenBradleyNet.ByteTransform.TransSingle( read.Content, 4 );
            }

  

寫入PLC信息

寫入操做的類型也是要和PLC進行對應的,當類型不正確的時候,是不能寫入操做的。

OperateResult write = allenBradleyNet.Write("B2", 123.456f);
if(write.IsSuccess)
{
     // 成功  
}
else
{
    // 失敗
}

  

自定義寫入方法:

/// <summary>
        /// 使用指定的類型寫入指定的節點數據
        /// </summary>
        /// <param name="address">節點地址數據</param>
        /// <param name="typeCode">類型代碼,詳細參見<see cref="AllenBradleyHelper"/>上的經常使用字段</param>
        /// <param name="value">實際的數據值</param>
        /// <returns>是否寫入成功</returns>
        public OperateResult WriteTag( string address, ushort typeCode, byte[] value )

  

若是你清楚類型代碼及數據內容能夠實現更復雜的數據寫入功能。

 

針對數組的數據讀取:

好比圖片中的 Array 數組,是一個short的數組數據,長度爲6,若是想要讀取這6個數據

OperateResult<short[]> readResult = allenBradleyNet.ReadInt16( "Array", 6 );

固然也支持讀取指定索引的數據

OperateResult<short> readResult = allenBradleyNet.ReadInt16( "Array[1]" );

寫入也是支持的

 

本方法是組件 5.5.2及以後開始支持,其中,後面的6能夠寫成0-6的任意數字。你寫多少,就讀多少長度的數組。讀取的類型也要和實際的匹配,才能完美的讀取。 

 針對數組的寫入操做:

                OperateResult write = allenBradleyNet.Write( "Array", new short[] { 101, 102, 103, 104, 105, 106 } );

結果以下:

 

更多的操做和細節能夠參照DEMO項目和源代碼項目

相關文章
相關標籤/搜索