日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7

發布時間:2023/12/4 C# 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、???引子

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

園友給了我很多支持,并提出了很好的改進意見。現加入屏幕分辨率自適應和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中批量讀寫方法的封裝。

GetDeviceAddress/GetAddress方法很重要,在TagConfig里編輯的地址是西門子約定俗成的,比如DB3,DD122.1,要翻譯成下位機理解的設備地址DeviceAddress。

這個Description?屬性描述符,在注冊之后會被反射為驅動的描述字符,存入數據庫。

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

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

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

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

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

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

但如果你想一次就能讀入1000個變量,要考慮到變量地址可能是不連續的,散亂的。而每次讀取的大小受PDU所限。

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

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

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

四、???下面的計劃

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

  • 網關層接口概述

  • 上下位機通訊原理

  • 如何實現一個設備驅動

  • 如何設計圖元

  • VS插件模塊及原理

  • 歸檔模塊及文件格式

  • 如何進行功能擴展

  • 組態變量表達式實現

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


相關文章:?

  • .NET十年回顧

  • 開源純C#工控網關+組態軟件

原文地址:http://www.cnblogs.com/evilcat/p/7647775.html


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

總結

以上是生活随笔為你收集整理的开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。