<object id="ayu7o"></object>

      <object id="ayu7o"></object>

    1. <menuitem id="ayu7o"></menuitem>
      <object id="ayu7o"></object>
      加入收藏 在線留言 聯系我們
      關注微信
      手機掃一掃 立刻聯系商家
      全國服務熱線18475208684
      公司新聞
      一個連接西門子plc設備的.net庫,搞自動化的有福了!
      發布時間: 2024-03-16 23:16 更新時間: 2024-12-02 08:00

      (一)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
      }
    2. 1

    3. 2

    4. 3

    5. 4

    6. 5

    7. 6

    8. 7

    9. 8

    10. 9

    11. 獲取是否連接成功:

      public bool IsConnected { get; }
    12. 1

    13. 連接PLC:

      public void Open();
      public Task OpenAsync();
    14. 1

    15. 2

    16. 該類庫提供了兩個用于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
      }
    17. 1

    18. 2

    19. 3

    20. 4

    21. 5

    22. 6

    23. 7

    24. 8

    25. 9

    26. 10

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

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

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

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

    31. (二)PLC設置

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

      圖片

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

      (三)C#程序

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

      using S7.Net;
    32. 1

    33. 定義一個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();
      }
    34. 1

    35. 2

    36. 3

    37. 4

    38. 5

    39. 6

    40. 7

    41. 8

    42. 9

    43. 10

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

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

      public void Close()
      {
         this.plc.Close();
      }
    45. 1

    46. 2

    47. 3

    48. 4

    49. 5

    50. 6

    51. 7

    52. 8

    53. 9

    54. 定義讀寫函數:之所以加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);
          }
      }
    55. 1

    56. 2

    57. 3

    58. 4

    59. 5

    60. 6

    61. 7

    62. 8

    63. 9

    64. 10

    65. 11

    66. 12

    67. 13

    68. 14

    69. 15

    70. 16

    71. 17

    72. 18

    73. 19

    74. 20

    75. 21

    76. 22

    77. 23

    78. 24

    79. 25

    80. 26

    81. 27

    82. 28

    83. 29

    84. 30

    85. 31

    86. 32

    87. 33

    88. 34

    89. 定義字節和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;
       }

      (四)S7Net動態庫下載

      https://download.csdn.net/download/m0_37763193/11721737

      28:56



      聯系方式

      • 電  話:13922889745
      • 經理:向小姐
      • 手  機:18475208684
      • 微  信:18475208684