開源純C#工控網關+組態軟體(三)加入一個新驅動:西門子S7

來源:互聯網
上載者:User

標籤:rip   大小   過程   檔案夾   isp   class   開源庫   最優   描述   

一、   引子

        首先感謝部落格園:第一篇文章、第一個開源項目,算是旗開得勝。可以看到,項目大部分流量來自於部落格園,碼農樂園,名不虛傳^^。

園友給了我很多支援,並提出了很好的改進意見。現加入螢幕解析度自適應和OPC Server可CLSID和ProgID自適應載入功能。螢幕自適應本是普遍問題,因為之前都是標配硬體,舉手之勞,一懶就忽略了。

       

僅僅十天前,我還是上github只會點擊的菜鳥。Readme檔案如何編輯都是現學現賣。

第一次向github上傳倉庫,下載了發現居然沒有任何exe,dll,bak檔案!度之,更改忽略檔案。總之是趕鴨子上架,各種囧。

然則有園友捧場,我也就不揣淺陋,以見教於大方了。

二、   如何加入一個新驅動

  • 準備工作

我更新了dll檔案夾:增加了libnodave.dll、libnodave.net.dll、SiemensPLCDriver.dll。這個SiemensPLCDriver.dll,

就是西門子S7系列PLC的驅動程式(包括原始碼,在Program裡面)。請先同步或者重新下載最新版本

libnodave開源庫(https://github.com/netdata/libnodave)據說是來自西門子的德國大神所作。某前輩當年一句話:能搞定驅動就是大牛。

我找到了libnodave,封裝後成功的實現了與西門子200PLC通訊,很受鼓舞,也成為了項目的起點。

  • 註冊驅動

開啟變數管理器TagConfig,點註冊,雙擊【路徑】框,在dll檔案夾裡找到SiemensPLCDriver.dll。

如果出現在下方列表,打鉤,點註冊,一般會提示成功。

 這時候,右鍵點樹節點S1->參數設定,就會看到S7乙太網路協議已經成為可選項。

  • 驅動的載入

實際上述一系列動作,就是驅動dll的資訊,已經寫入了資料庫的RegisterModule表。

這張表就是為系統服務反射載入驅動程式提供基本資料:載入的位置、類名 、描述,以便執行個體化為具體的驅動類。

在DAServer內有一個AddDriver方法,就是Activator.CreateInstance載入驅動並轉換為IDriver。

使用反射載入,最大優點就是使用者可以自己實現一個驅動,或者引用第三方驅動,並用TagConfig註冊,而不需要改動原始碼。

三、   如何?一個新驅動

  •  驅動介面規範

[Description("S7 乙太網路協議")]

public sealed class SiemensTCPReader : IPLCDriver, IMultiReadWrite

我在前一篇文章裡提到,IPLCDriver 是所有PLC都實現的介面。IMultiReadWrite 是支援批量讀寫的下位機必須實現的介面。

因為PLC都具有可串連性、可讀寫性,同時西門子的協議還支援批量讀寫。

SiemensTCPReader 裡的Connect方法,就是對libnodave中connectPLC方法的封裝。

Dispose方法,就是釋放libnodave的非託管資源。

ReadBytes、ReadInt32、ReadBit、ReadFloat、WriteFloat等方法,就是對IReaderWriter介面的實現。也就是單獨讀寫。

ReadMultiple、WriteMultiple方法是對IMultiReadWrite 介面的實現,也是對libnodave中批量讀寫方法的封裝。

這個Description 屬性描述符,在註冊之後會被反射為驅動的描述字元,存入資料庫。

  •  為什麼要實現批量讀寫,如何?

批量讀寫的目的,就是為了提高效能。

很多人總是拿C#、.NET的所謂效能說事。首先我認為.NET效能優良。關鍵是你怎麼寫。

而對效能影響最大的往往不是語言、架構,而是IO。IO的效能成本往往是語言本身的十倍、百倍、甚至千倍。

在PLC通訊過程中,請求往返就是效能瓶頸。因為大部分下位機不支援訂閱-發布(推送)模式,只能採用定期輪詢方式。

既然是輪詢,如果變數很多,如果一個個去讀寫,讀1000個變數要輪詢1000次,一次往返起碼幾十毫秒,效率差的驚人,還佔用PLC大量資源。這是行不通的。

但如果你想一次就能讀入1000個變數,要考慮到變數可能是不連續的,散亂的。

所以,就一定要對變數的分布分析整理,類似送快遞,客戶雖然分布在各個小區,但並不能像醉漢一樣漫無目的的投遞,而是根據客戶的分布,執行最佳化的路線選擇。

整理的結果,就是將所有要讀寫的變數分割為塊,每塊大小不能超過PLC 的PDU。力求往返次數最少、一次讀入的區塊最大、包含的變數最多。

分割整理變數區塊的功能,就是PLCGroup 的UpdatePDUArea函數實現的。不過我在這裡只是進行簡單的地址歸納,並沒有做最優解。最優演算法肯定是存在的,但可能與現行方法出入不會太大。

四、   下面的計劃

寫一系列文章,把架構、原理講清楚。大致如下:

  • 網關層介面概述
  • 上下位機通訊原理
  • 如何?一個裝置驅動
  • 如何設計圖元
  • VS外掛程式模組及原理
  • 歸檔模組及檔案格式
  • 如何進行功能擴充
  • 組態Variant 運算式實現

github地址:https://github.com/GavinYellow/SharpSCADA。歡迎大家提出寶貴意見和建議!

開源純C#工控網關+組態軟體(三)加入一個新驅動:西門子S7

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.