C# 讀寫倍福plc beckhoff , 使用ADS協議實現讀取plc


 

本文將使用庫技術來讀寫倍福PLC數據,使用的是基於以太網的ADS實現,不需要額外的組件,讀取操作只要放到后台線程就不會卡死線程,本組件支持超級方便的高性能讀寫操作

 github地址:https://github.com/dathlin/HslCommunication 如果喜歡可以star或是fork,還可以打賞支持,打賞請認准源代碼項目。

聯系作者及加群方式:http://www.hslcommunication.cn/Cooperation 

 

在Visual Studio 中的NuGet管理器中可以下載安裝,也可以直接在NuGet控制台輸入下面的指令安裝:

 

Install-Package HslCommunication

  

  

 如果需要教程:Nuget安裝教程:http://www.cnblogs.com/dathlin/p/7705014.html

 

組件的完整信息和API介紹參照:http://www.cnblogs.com/dathlin/p/7703805.html   組件的使用限制,更新日志,都在該頁面里面。

 

如果你需要在讀取PLC數據之后,還要群發客戶端來實現遠程辦公室同步監視,可以參考如下的項目(基於該組件擴展起來的,帶有賬戶驗證,版本控制,數據群發,公告管理等等功能)

https://github.com/dathlin/ClientServerProject

 

本文將展示如何配置網絡參數及怎樣使用代碼來訪問PLC數據,希望給有需要的人解決一些實際問題。主要對基恩士的數據進行讀寫操作,具體的參照下面的地址信息

此處使用了網線直接的方式,如果PLC接進了局域網,就可以進行遠程讀寫了^_^

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

1
2
using  HslCommunication.Profinet.Beckhoff;
using  HslCommunication;

  

 

隨便聊聊


當我們一個上位機需要讀取100台西門子PLC設備(此處只是舉個例子,凡是都是使用Modbus tcp的都是一樣的)的時候,你采用服務器主動去請求100台設備的機制對性能來說是個極大的考驗,如果開100個線程去輪詢100台設備,那么性能損失將是非常大的,更不用說再增加設備,如果搭建Modbus tcp服務器,就可以完美的解決性能問題,因為連接的壓力將會平均分攤給每一台PLC,服務器端只要新增一個時間戳就可以知道客戶端有沒有連接上。

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

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

 

關於兩種模式


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

短連接:每次讀寫都是一個單獨的請求,請求完畢也就關閉了,如果服務器的端口僅僅支持單連接,那么關閉后這個端口可以被其他連接復用,但是在頻繁的網絡請求下,容易發生異常,會有其他的請求不成功,尤其是多線程的情況下。

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

在短連接的模式下,每次請求都是單獨的訪問,所以沒有重連的困擾,在長連接的模式下,如果本次請求失敗了,在下次請求的時候,會自動重新連接服務器,直到請求成功為止。另外,盡量所有的讀寫都對結果的成功進行判斷。

 

關於日志記錄


不管是基恩士的,三菱的數據訪問類,還是西門子的,還是Modbus tcp訪問類,都有一個LogNet屬性用來記錄日志,該屬性是一個接口類,ILogNet,凡事繼承該接口的都可以用來記錄日志,該日志會在訪問失敗時,尤其是因為網絡的原因導致訪問失敗時會進行日志記錄(如果你為這個 LogNet 屬性配置了真實的日志記錄器的話):如果你想使用該記錄日志的功能,請參照如下的博客進行實例化:

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

 

訪問測試項目


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

下載地址為:HslCommunicationDemo.zip 

 

 

演示項目


下面的三篇演示了具體如何去訪問PLC的數據,我們在訪問完成后,通常需要進行處理,以下的示例項目就演示了后台從PLC讀取數據后,前台顯示並推送給所有在線客戶端的功能,客戶端並進行圖形化顯示,具有一定的參考意義,並且推送給網頁前端,項目地址為:

https://github.com/dathlin/RemoteMonitor

下面的圖片示例中的左邊程序就是服務器程序,它應該和PLC直接連接並接入局域網,然后把數據推送給客戶端顯示。注意:一個復雜高級的程序就應該把處理邏輯程序和界面程序分開,比如這里的服務器程序實現數據采集,推送,存儲。讓客戶端程序去實現數據的整理,分析,顯示,這樣即使客戶端程序因為BUG奔潰,服務器端仍然可以正常的工作。

 

 

 

 

配置篇


 

倍福的配置

在使用組件和倍福plc通訊之前,需要進行相關的配置,

 

STEP1 選擇system manager

SETP2選擇 choose 

 

 

 

 

 

 輸入用戶名和密碼后點擊OK添加完成

注意
連接ADS時必須要填密碼

如果沒有請去創建一個

 

 

 

 

 點擊AMS標簽頁

可以看到本機的AMSnet 和路由狀況

 

 注意,plc的IP地址,不是ams net id

電腦的ip地址,也不是ams net id。

 

 

讀寫數據篇


 

初始化訪問PLC對象

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

 

            BeckhoffAdsNet beckhoffAdsNet = new BeckhoffAdsNet( "192.168.182.131", 48898 );
            beckhoffAdsNet.SetTargetAMSNetId( "192.168.182.131.1.1:801" );
            beckhoffAdsNet.SetSenderAMSNetId( "192.168.235.128.1.1" );

  

打開連接,並可以判斷是否連接上

  

beckhoffAdsNet.ConnectServer( );

  

如果需要判斷,那么按照如下的操作

  

            OperateResult connect = beckhoffAdsNet.ConnectServer( );
            if (connect.IsSuccess)
            {
                // connect success
            }
            else
            {
                // failed
            }

  

 那么現在可以讀寫數據了,數據分為三種類型

1. I.Q.M地址,這三個是同理的

  

            OperateResult<bool> read = beckhoffAdsNet.ReadBool( "M100" );
            bool value = read.Content;

  此時的100是第100個位的數據

當然了,也可以讀取字數據

            OperateResult<short> read = beckhoffAdsNet.ReadInt16( "M10" );
            short value = read.Content;

  此時的10的地址,就是指第10個字節的數據

2. 絕對地址

            OperateResult<short> read = beckhoffAdsNet.ReadInt16( "i=100002" );
            short value = read.Content;

  絕對地址以i=開頭的,后面的是數據的絕對地址,在內存里的絕對地址信息。

3, 標簽地址

            OperateResult<short> read = beckhoffAdsNet.ReadInt16( "s=MAIN.int1" );
            short value = read.Content;

  

 

無論讀取什么地址,都是必須知道類型的,然后就可以讀寫操作了。

關於標簽讀取的方式的情況下的加速操作。

標簽讀取的本質分成兩步,第一個根據標簽獲取到變量的絕對地址,然后根據絕對地址獲取到值。

 

現在只需要將 UseTagCache 設置為True , 就可以實現緩存功能,加速標簽的讀寫速度。

 


免責聲明!

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



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