<object id="seflp"></object>

    1. <object id="seflp"></object>
      <dfn id="seflp"></dfn>
          加入收藏 在線留言 聯系我們
          關注微信
          手機掃一掃 立刻聯系商家
          全國服務熱線17838383235

          SIEMENS西門子6SN1118-0NH01-0AA1模塊代理商

          更新時間
          2024-10-30 14:14:21
          價格
          請來電詢價
          西門子
          西門子授權代理商
          備件
          核心供貨商
          德國
          現貨
          聯系電話
          17838383235
          聯系手機
          17838383235
          聯系人
          徐嘉泉
          立即詢價

          詳細介紹

          一個連接西門子PLC設備的.net庫,搞自動化的有福了!

          【導讀】推薦一個連接西門子PLC的.net庫,包括使用方法以及代碼。

          圖片


          前言

          PLC在工業自動化領域是常用的控制器,一般在和上位機界面通訊時,經常使用組態軟件。


          以西門子PLC為例,上位機可以使用西門子的WINCC。但是當面對需求比較多樣化的需求時,WINCC難以勝任。而且作為量產的標準化產品,WINCC授權的費用一筆不小的成本。


          S7.Net.dll 是應用在 .NET平臺上和西門子PLC通訊的一個動態庫。大家可以到GitHub中直接去下載,或者直接搜索“S7.Net .dll”也可以找到下載的鏈接。文章后也會給出鏈接。


          (一)S7Net動態庫說明

          目前該動態庫支持的西門子PLC類型有S7-200,S7-300,S7-400,S7-1200和S7-1500,基本涵蓋了西門子所有的PLC產品。該庫可以直接讀寫PLC中的全局DB塊,作為通訊的接口。


          下面對需要的一些函數以及數據類型做簡單說明。構造函數:cpu 為枚舉類型,代表PLC類型。ip 為PLC地址,需要和PLC組態的地址一致,同時,和通訊的PC IP地址應在同一局域網段。rack 為導軌號,slot 為插槽號,均可在博途硬件組態處獲得。


          如下圖所示,ip=“192.168.0.5”。


          圖片


          如下圖所示,rack為0,slot為1。

          圖片

          public Plc(CpuType cpu, string ip, short rack, short slot); public enum CpuType {         S7200 = 0,         S7300 = 10,         S7400 = 20,         S71200 = 30,         S71500 = 40  }

          獲取是否連接成功:


          public bool IsConnected { get; }

          連接PLC:


          public void Open(); public Task OpenAsync();

          該類庫提供了兩個用于PLC連接的函數,區別在于第二個為異步連接,在請求連接的過程中,不會導致線程阻塞。我個人比較喜歡第二種方式。


          按位寫操作:參數db代表訪問的DB塊編號,如下圖所示UISendInt編號為3,UIReadInt編號為4。


          圖片


          startByteAdr是在數據塊內以字節為單位的起始地址,可以傳入0。bitAdr 為需要操作的位的偏移地址(以startByteAdr為基準),value 為寫入的值。dataType為枚舉類型,我們操作的是數據塊,傳入DataBlock。


          public void WriteBit(DataType dataType, int db, int startByteAdr, int bitAdr, bool value); public enum DataType {      Counter = 28,      Timer = 29,      Input = 129,      Output = 130,      Memory = 131,      DataBlock = 132  }

          按字節讀:count代表讀的字節數量。在進行按字節讀寫時,對于8位的單字節變量來說沒有任何問題。但是對于多字節比如在PLC中16位I的INT類型,需要注意大小端問題。在西門子PLC中以大端模式存儲數據,但是在Intel的X86架構的PC上,卻是以小端模式。所以,在從PLC讀取一個INT類型的變量,需要將讀取回來的字節數組高低字節調換,后面C#程序中會有詳細的實現代碼。


          public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count);

          按字節寫:value代表將要傳輸的數據轉換成的字節數組,如果要操作一個INT變量,需要提前將高低字節調換,后面C#程序中會有詳細的實現代碼。


          public void WriteBytes(DataType dataType, int db, int startByteAdr, byte[] value);

          (二)PLC設置

          實現外部程序可以訪問操作DB塊,需要對PLC部分做一些設置。首先對于要讀取或者訪問的DB塊,要將優化的塊訪問取消,默認為勾選的,選中塊右擊選擇屬性。


          圖片


          同時還要在硬件組態中,設置防護與安全中的連接機制。將“允許來自遠程對象的PUT/GET訪問”勾選。如下圖:

          圖片

          (三)C#程序

          在C#上位機軟件中,對通訊類庫的函數做一個簡單的包裝,以方便我們使用。首先新建一個類S7,在項目中需要引用S7.NET,并在該類中包含命名空間。


          using S7.Net;

          定義一個PLC類型變量PLC,并定義該類的構造函數和析構函數:


          Plc plc; public S7(S7DataType.CpuType cpuType,string ip,Int16 rack,Int16 slot) {     plc = new Plc((CpuType)cpuType,ip, rack,slot); } ~S7() {     this.plc.Close(); }

          定義連接函數以及關閉函數:


          public void OpenAsync() {        this.plc.OpenAsync();  } public void Close() {     this.plc.Close(); }

          定義讀寫函數:之所以加lock,是因為在應用中數據通訊很有可能在不同的線程去操作,比如單獨開一個線程定時從PLC更新數據。


          public byte[] PlcReadBytes(int db, int startByteAdr=0, int count=1) {       try       {           lock (this)           {               return this.plc.ReadBytes(DataType.DataBlock, db, startByteAdr, count);           }       }       catch       {           return new byte[2];       }         }    public void PlcWriteBytes(int db, byte[] value, int startByteAdr = 0) {         lock (this)         {             this.plc.WriteBytes(DataType.DataBlock, db, startByteAdr, value);         }     }  public void PlcWriteBit(int db, int bitAdr, bool value, S7DataType.DataType dataType =  S7DataType.DataType.DataBlock)  {      int temp1 = bitAdr / 8;      int temp2 = bitAdr % 8;      lock (this)      {          this.plc.WriteBit((DataType)dataType, db, temp1, temp2, value);      }  }

          定義字節和Int16類型之間的轉換函數(需要進行高低字節轉換):


          public static byte[] Int16ToBytes(Int16 data)  {       byte[] temp = new byte[2];       temp[0] =(byte) (data >> 8);       temp[1] = (byte)(data);       return temp;   } public static Int16 BytesToInt16(byte[] bytes)  {       Int16 temp;       temp =(Int16)( bytes[0] << 8 | bytes[1]);       return temp;   }




          聯系方式

          • 電  話:17838383235
          • 經理:徐嘉泉
          • 手  機:17838383235
          • 微  信:17838383235