在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PLC遇見IT:C#+S7Net+PLCSIM實現西門子PLC仿真通訊

智能制造之家 ? 來源:CSDN-虛夢年華 ? 2023-01-04 11:43 ? 次閱讀

PLCSIM Advanced 簡介

PLCSIM Advanced是西門子推出的一款功能強大的仿真軟件,目前最新發布的版本為4.0,但鑒于新版本可能存在未知的bug,故本文使用V3.0。

V3.0支持仿真1500PLC及ET 200SP,可實現Socket網絡通訊功能,也可實現PLC之間、PLC與設備直接的ModbusTCP等通訊。

V3.0安裝時需要先安裝WinPcap_4_1_3,V4.0則不需要。

以下為兩個版本的官網下載鏈接,下載時需要西門子賬號,可以免費注冊。

以下為V3.0下載鏈接:

PLCSIM Advanced V3.0

V3.0的兩個升級包(可選安裝)

以下為V4.0下載鏈接

PLCSIM Advanced V4.0

S7 Net Plus 簡介

西門子PLC通訊庫,支持200、200smart、300、400、1200、1500系列PLC。

說明文檔

配置PLCSIM Advanced

打開PLCSIM Advanced V3.0,如下圖:

d0bfc0ec-8660-11ed-bfe3-dac502259ad0.png

Online Access要選擇右邊的PLCSIM Virtual Eth.Adapter,左側的PLCSIM不支持外部網絡訪問。

TCP/IP communication with 可選以太網或者是本地虛擬網卡。local即為本地虛擬網卡,是在安裝PLCSIM Advanced時自動安裝的網絡適配器。打開控制面板-->網絡和 Internet-->網絡連接,Siemens PLCSIM Virtual Ethernet Adapter就是此虛擬網卡。使用虛擬網卡只能在本機進行通訊仿真,而使用以太網則可以在局域網內進行仿真通訊。

Start Virtual S7-1500 PLC為PLC設置,包括IP地址、子網掩碼、默認網關及PLC型號。設置完成后點擊Start按鈕則會生成一個PLC實例。創建成功后就可以開始通訊仿真了。

Virtual SIMATIC Memory Ca為打開保存PLC歷史記錄的文件夾的按鈕。

如下圖所示,在Active PLC Instance(s)可以看到已成功創建的PLC。

d0d7b710-8660-11ed-bfe3-dac502259ad0.png

下載測試DB塊

TIA Protal軟件中,添加一個S7-1511的設備,然后在程序塊中添加一個新的DB塊,DB號設置為10。

打開設備的屬性 --> 防護與安全 -->連接機制,勾選“允許來自遠程對象的PUT/GET通訊訪問”。

打開設備的屬性 --> PROFINET 接口 [X1] -->以太網地址,按需設置PLC的IP地址。

打開DB10的屬性,取消勾選“優化塊的訪問”,并在DB10中新建如下圖所示的變量,編譯完成后則可以得到每個變量的偏移量,即此變量在DB10上的地址。

d0ede5bc-8660-11ed-bfe3-dac502259ad0.png

設置完成后,下載到剛剛使用PLCSIM Advanced創建的仿真PLC中,需要注意網段要設置成與仿真PLC同一網段。

引用S7NetPlus

創建一個測試程序,此處創建的是一個控制臺應用程序。

在NuGet下載S7NetPlus,如下圖所示,版本可按需選擇

d102489a-8660-11ed-bfe3-dac502259ad0.png

新建一個名為PLCInstance的類,創建PLC單例。

    class PLCInstance
    {
        private PLCInstance()
        {
            plcObj = new Plc(CpuType.S71500, "192.168.10.230", 0, 1);
        }


        /// 
        /// PLC單例
        /// 
        public static PLCInstance Instance
        {
            get
            {
                return Nested.instance;
            }
        }


        /// 
        /// 防止調用此類靜態方法時,創建新的實例
        /// 
        private class Nested
        {
            internal static readonly PLCInstance instance = null;
            static Nested()
            {
                instance = new PLCInstance();
            }
        }


        /// 
        /// 私有PLC單例對象
        /// 
        private static Plc plcObj;


        /// 
        /// 連接至PLC并返回連接狀態
        /// 
        /// 
        private bool ConnectToPLC()
        {
            try
            {
                plcObj.Open();
                return plcObj.IsConnected ? true : false;
            }
            catch (Exception)
            {


                return false;
            }


        }


        /// 
        /// 關閉連接
        /// 
        private void Disconnect()
        {
            plcObj.Close();
        }
    }

讀寫數據

S7NetPlus提供了多種讀寫的方式,可以讀取字節自行解析或者按照指定格式寫入字節,也可以指定地址進行讀寫,還可以使用變量、結構體或者類進行單個或者批量讀寫。

1、指定地址讀寫

這種方法可以在Read方法中以字符串形式傳入需要讀取的地址,返回的是Object類型的值,需要使用者自行做類型轉換。Write方法則同理,以字符串的形式指定需要寫入的地址,并在第二個參數傳入需要寫入的值,但是需要注意西門子PLC內的數據類型與C#的數據類型的對應。以下為讀寫DB10的0.0地址上的布爾量的值示例,此方式均支持讀取與寫入。

//讀取
bool result = (bool)plc.Read("DB10.DBX0.0");


//寫入
plc.Write("DB10.DBX0.0",!result);

雖然這種方式比較簡單且方便,但是它是作者不推薦的方式,文檔中原文如下:

This method reads a single variable from the plc, by parsing the string and returning the correct result. While this is the easiest method to get started, is very inefficient because the driver sends a TCP request for every variable.

意思就是,這種方法會通過解析傳入的地址字符串來獲取需要讀寫的地址,對于使用者來說是非常簡單的使用方式,但是S7NetPlus會為每個通過這種方式讀寫的變量生成一個新的TCP請求,因此在讀寫多個變量時,執行效率會比較低。

S7NetPlus使用的通訊本質上是西門子的S7通訊,通過發送七層通訊報文來建立與西門子PLC的TCP連接,后續也是根據S7通訊的通訊協議生成并發送報文來實現PLC的數據讀寫。所以當使用這種方式讀寫多個變量的時候,S7NetPlus內部為每個變量重復建立新的S7連接與發送讀寫報文的操作,而不是單個連接成功建立后在這個連接上進行批量的讀寫。

簡單理解就是這種方式效率比較低,會占用更多的資源。

2、解析讀寫

這種方法需要指定DB的類型、DB號、起始地址、PLC數據類型及讀取數量。雖然它需要傳入的參數變多了,但是當需要讀取多個地址連續且類型相同的變量時,僅需修改最后的讀取數量,S7NetPlus就會自動讀取這一連串的地址,并按照指定的變量類型解析出對應的值,文檔中后面說到的多類型變量批量讀取也是基于這種方法的。不過這種方式讀取PLC內的字符串類型時,仍存在bug,所以當需要讀寫字符串的時候,推薦使用本文后面提及的字節讀寫的方式。

示例如下:

//讀取
bool result = (bool)plc.Read(DataType.DataBlock, 10, 0, VarType.Bit, 1);


//寫入
plc.Write(DataType.DataBlock, 10, 0, true);

Read:

第一個參數是DB的數據類型,可以是DB、定時器、計數器、Merker(內存)、輸入、輸出。

第二個參數是DB號。

第三個參數是起始地址。

第四個參數是PLC內該變量的類型。

第五個參數是需要讀取的個數。

Write:

第一個參數是DB的數據類型,可以是DB、定時器、計數器、Merker(內存)、輸入、輸出。

第二個參數是DB號。

第三個參數是起始地址。

第四個參數是需要寫入的值。

3、字節讀寫

這種方法將會讀取指定DB塊上一段連續的地址上的字節,不做任何解析直接以字節數組的形式返回。

第一個參數是DB的數據類型,可以是DB、定時器、計數器、Merker(內存)、輸入、輸出。

第二個參數是DB號。

第三個參數是起始地址。

第四個參數是讀取的字節數。

要使用這種方式讀寫數據,則需要非常熟悉PLC內各類型數據存儲的格式,可以自行將讀取上來的字節進行解析以獲得所需數據。

雖然這種方式理論上能讀寫任意的數據,但是解析數據的過程會比較麻煩,所以若非萬不得已,個人建議盡量少用。

此處僅提供PLC內String類型及WString類型的讀取示例。

//String讀取
byte[] data = plc.ReadBytes(DataType.DataBlock, 10, 2, 254);
string result = Encoding.Default.GetString(data);
//Wstring讀取
byte[] data = plc.ReadBytes(DataType.DataBlock, 10, 4, 508);
string result = Encoding.BigEndianUnicode.GetString(data);

在S7-1500中,一個String類型的變量占用256個字節,但是第一個字節是總字符數,第二個字節是當前字符數,所以真正的字符數據是從第三個字節開始的,共254個字節。

同理,WString類型其實就是雙字節的Sring,也就是說一個字符占用兩個字節,所以一個WString類型的變量占用512個字節,第一、二個字節是總字符數,第三、四個字節是當前字符數,真正的字符數據是從第五個字節開始的,共508個字節。

按照以上示例的方法,讀取上來的字符串后面會帶很多個"?"的字符,那是因為后面的空字節也讀取上來了,正式使用時可以考慮使用.Replace("?", "")來去除,或者解析第二個字節來獲取字符長度進而轉碼。

當寫入字符串時,則需要根據不同的數據類型來生成對應字符串的字節數組,然后將該數組寫入到指定地址中即可。

需要注意的是,String類型的編碼格式對應的是ASCII,而WString的則是C#中的BigEndianUnicode格式。在WString中,由于總長度與當前字符數是都是雙字節數,所以在轉換成字節數組的時候存在高低字節順序問題。在這里就有一個大坑:這兩個變量在C#中轉換出來的字節數組跟PLC中存儲的,高低字節是反過來的。這也就是為什么下面的WString的示例中需要對總字符數和當前字符數的兩個字節數組進行反轉。

此處提供一種生成String類型和WString的字節數組的方法,可供參考:

        /// 
        /// 獲取西門子PLC字符串數組--String
        /// 
        /// 
        /// 
        private byte[] GetPLCStringByteArray(string str)
        {
            byte[] value = Encoding.Default.GetBytes(str);
            byte[] head = new byte[2];
            head[0] = Convert.ToByte(254);
            head[1] = Convert.ToByte(str.Length);
            value = head.Concat(value).ToArray();
            return value;
        }


        /// 
        /// 獲取西門子PLC字符串數組--WString
        /// 
        /// 
        /// 
        private byte[] GetPLCWStringByteArray(string str)
        {
            byte[] value = Encoding.BigEndianUnicode.GetBytes(str);
            byte[] head = BitConverter.GetBytes((short)508);
            byte[] length = BitConverter.GetBytes((short)str.Length);
            Array.Reverse(head);
            Array.Reverse(length);
            head = head.Concat(length).ToArray();
            value = head.Concat(value).ToArray();
            return value;
        }

使用示例如下:

//寫入String 
string str = "Example";
plc.Write(DataType.DataBlock, 10, 0, GetPLCStringByteArray(str));
//寫入WString
string str = "示例";
plc.Write(DataType.DataBlock, 10, 0, GetPLCWStringByteArray(str));

4、舊版本的字節讀取注意事項

舊版本的單次字節讀取是有字節數限制的,每一次讀取的最大字節數為200,如果需要讀寫更多的字節,則需要多次讀寫并進行拼接,以下提供兩種方法,可供參考:

        /// 
        /// 循環讀取
        /// 
        /// 要讀取的字節數
        /// DB號
        /// 起始地址
        /// 
        private byte[] CyclicReadMultipleBytes(int numBytes, int db, int startByteAdr = 0)
        {
            byte[] resultBytes = new byte[0];
            int index = startByteAdr;
            while (numBytes > 0)
            {
                var maxToRead = Math.Min(numBytes, 200);
                byte[] bytes = plc.ReadBytes(DataType.DataBlock, db, index, maxToRead);
                if (bytes == null)
                    return null;
                resultBytes = resultBytes.Concat(bytes).ToArray();
                numBytes -= maxToRead;
                index += maxToRead;
            }
            return resultBytes;
        }


        /// 
        /// 遞歸讀取
        /// 
        /// 要讀取的字節數
        /// DB號
        /// 起始地址
        /// 
        public static byte[] RecursiveReadMultipleBytes(int numBytes, int db, int startByteAdr = 0)
        {
            byte[] result = new byte[0];
            if (numBytes > 200)
            {
                byte[] temp = plc.ReadBytes(DataType.DataBlock, db, startByteAdr, 200);
                numBytes -= 200;
                result = temp.Concat(RecursiveReadMultipleBytes(numBytes, db, startByteAdr + 200)).ToArray();
            }
            else
            {
                byte[] temp = plc.ReadBytes(DataType.DataBlock, db, startByteAdr, numBytes);
                result = result.Concat(temp).ToArray();
                return result;
            }


            return result;
        }

在讀取一兩千個字節的情況下,這兩種方法速度都差不多,遞歸會稍微快一點點。不過新版本沒有單次讀取限制,所以正常情況下是不需要這兩個方法的。

5、其余讀取方式

其它的讀取方式可參考文檔,本文不再贅述。

讀取數據示例

PLCInstance:

using S7.Net;
using System;
using System.Text;


namespace S7NetPlusExample
{
    class PLCInstance
    {
        private PLCInstance()
        {
            plcObj = new Plc(CpuType.S71500, "192.168.10.230", 0, 1);
        }


        /// 
        /// PLC單例
        /// 
        public static PLCInstance Instance
        {
            get
            {
                return Nested.instance;
            }
        }


        /// 
        /// 防止調用此類靜態方法時,創建新的實例
        /// 
        private class Nested
        {
            internal static readonly PLCInstance instance = null;
            static Nested()
            {
                instance = new PLCInstance();
            }
        }


        /// 
        /// 私有PLC單例對象
        /// 
        private static Plc plcObj;


        /// 
        /// 連接至PLC并返回連接狀態
        /// 
        /// 
        private bool ConnectToPLC()
        {
            try
            {
                plcObj.Open();
                return plcObj.IsConnected ? true : false;
            }
            catch (Exception)
            {


                return false;
            }


        }


        /// 
        /// 關閉連接
        /// 
        private void Disconnect()
        {
            plcObj.Close();
        }


        /// 
        /// 讀取示例數據
        /// 
        /// 
        public string GetPLCInfo()
        {
            if (ConnectToPLC())
            {
                StringBuilder sbr = new StringBuilder();


                //讀取BOOL值
                bool boolResult = (bool)plcObj.Read(DataType.DataBlock, 10, 0, VarType.Bit, 1);


                //讀取Int值
                int intResult = (short)plcObj.Read(DataType.DataBlock, 10, 2, VarType.Int, 1);


                //讀取Real值
                float realResult = (float)plcObj.Read(DataType.DataBlock, 10, 4, VarType.Real, 1);


                //讀取String值
                byte[] stringData = plcObj.ReadBytes(DataType.DataBlock, 10, 10, 254);
                string stringResult = Encoding.Default.GetString(stringData);


                //讀取WString
                byte[] wstringData = plcObj.ReadBytes(DataType.DataBlock, 10, 268, 508);
                string wstringResult = Encoding.BigEndianUnicode.GetString(wstringData);


                Disconnect();


                sbr.AppendLine($"{boolResult}");
                sbr.AppendLine($"{intResult}");
                sbr.AppendLine($"{realResult}");
                sbr.AppendLine($"{stringResult}");
                sbr.AppendLine($"{wstringResult}");


                return sbr.ToString();                
            }
            else
            {
                return "連接PLC失敗";
            }           
        }
    }
}

主程序:

using System;


namespace S7NetPlusExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(PLCInstance.Instance.GetPLCInfo());


            Console.ReadKey();
        }
    }
}

運行結果:

d11a93b4-8660-11ed-bfe3-dac502259ad0.png

結尾

本文簡單介紹了S7 Net Plus和PLCSIM Advanced的使用,以上內容均由本人親自實踐得出的結果,但仍有可改進的的地方。S7NetPlus的文檔也有非常詳細的介紹,如有更復雜的讀寫需求,可以參考文檔。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • plc
    plc
    +關注

    關注

    5011

    文章

    13299

    瀏覽量

    463397
  • 西門子
    +關注

    關注

    94

    文章

    3039

    瀏覽量

    115881
  • 仿真
    +關注

    關注

    50

    文章

    4082

    瀏覽量

    133613
  • Advanced
    +關注

    關注

    1

    文章

    34

    瀏覽量

    23245

原文標題:PLC遇見IT:C#+S7Net+PLCSIM實現西門子PLC仿真通訊

文章出處:【微信號:智能制造之家,微信公眾號:智能制造之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    S7-200西門子PLC視頻教程大全

    以下是西門子S7-200PLC視頻教程,全文共有36個視頻。詳細介紹了西門子S7-200PL的各種概念,基礎的知識,及各案例的講解。 1、S7
    發表于 09-26 09:15 ?12w次閱讀

    西門子S7-200PLC西門子變頻器MM440通訊程序實例

    西門子S7-200PLC西門子變頻器MM440通訊程序實例
    的頭像 發表于 05-04 09:54 ?5053次閱讀
    <b class='flag-5'>西門子</b><b class='flag-5'>S7-200PLC</b>與<b class='flag-5'>西門子</b>變頻器MM440<b class='flag-5'>通訊</b>程序實例

    西門子S7-PLCSIM仿真軟件的應用

    本文主要介紹了西門子S7-PLCSIM仿真軟件的應用。
    發表于 04-11 14:44 ?109次下載

    西門子S7-200 PLC應用100例

    西門子S7-200 PLC應用100例》主要以西門子S7-200 PLC為主體,按基礎知識、擴
    發表于 09-17 10:02 ?698次下載
    <b class='flag-5'>西門子</b><b class='flag-5'>S7</b>-200 <b class='flag-5'>PLC</b>應用100例

    西門子S7-200使用教程

    西門子S7-200 PLC仿真軟件超詳細使用教程西門子S7-200使用教程
    發表于 05-06 16:43 ?0次下載

    西門子S7-1200-PLC-Modbus通訊實例

    西門子S7-1200-PLC-Modbus通訊實例免費下載。
    發表于 04-21 14:46 ?113次下載

    西門子S7-200PLC通訊技術培訓

    西門子S7-200PLC通訊技術培訓資料下載。
    發表于 04-30 10:36 ?77次下載

    西門子PLC工作原理及仿真

    西門子(SIEMENS)公司生產的可編程序控制器在我國的應用也相當廣泛,在冶金、化工、印刷生產線等領域都有應用。西門子(SIEMENS)公司的PLC產品包括 LOGO、S7-200、
    發表于 04-17 15:12 ?2次下載
    <b class='flag-5'>西門子</b><b class='flag-5'>PLC</b>工作原理及<b class='flag-5'>仿真</b>

    Unity3D與西門子PLC通訊

    本文是做實體PLC和Unity的通訊,如果沒有實體PLC可以參考我之前的博文上位機與西門子博途TIA的PROFINET通訊
    發表于 04-19 11:43 ?6次下載
    Unity3D與<b class='flag-5'>西門子</b><b class='flag-5'>PLC</b><b class='flag-5'>通訊</b>

    C#使用西門子S7協議讀寫PLC DB塊

    教大家使用C#如何方便快速的讀寫西門子DB塊的值,實現上位機跟plc進行通訊的流程 使用的西門子
    發表于 04-19 10:05 ?21次下載
    <b class='flag-5'>C</b>#使用<b class='flag-5'>西門子</b><b class='flag-5'>S7</b>協議讀寫<b class='flag-5'>PLC</b> DB塊

    西門子PLCC#程序的S7.net通信

    1、導入S7.net通信文件:打開工具->NuGet包管理器->管理解決方案得NuGet程序包,入下圖搜索S7,安裝S7netplus。在程序中引用S7.Net文件建立
    發表于 04-20 14:30 ?7次下載
    <b class='flag-5'>西門子</b><b class='flag-5'>PLC</b>與<b class='flag-5'>C</b>#程序的<b class='flag-5'>S7.net</b>通信

    西門子1200PLC之間的ModbusTCP通訊如何實現

    西門子1200PLC通過以太網通訊與其它設備進行數據交互,西門子1200PLC可以和西門子系列
    發表于 07-30 14:49 ?9834次閱讀
    <b class='flag-5'>西門子</b>1200<b class='flag-5'>PLC</b>之間的ModbusTCP<b class='flag-5'>通訊</b>如何<b class='flag-5'>實現</b>?

    天拓分享:西門子plc S7-300/400系列的PLC通訊

    今天看一下西門子plc S7-300/400系列的PLC通訊西門子
    的頭像 發表于 08-03 16:35 ?4136次閱讀
    天拓分享:<b class='flag-5'>西門子</b><b class='flag-5'>plc</b> <b class='flag-5'>S7</b>-300/400系列的<b class='flag-5'>PLC</b><b class='flag-5'>通訊</b>

    仿真神器—S7-PLCSIM Advanced知識詳解

    S7-PLCSIM Advanced是西門子公司推出的一款PLC仿真軟件,其中“PLCSIM”是“PLC
    的頭像 發表于 12-18 09:33 ?1.2w次閱讀
    <b class='flag-5'>仿真</b>神器—<b class='flag-5'>S7-PLCSIM</b> Advanced知識詳解

    S7協議讀取西門子S7-200 Smart PLC數據

    西門子S7-200 Smart PLC因其穩定性和易用性而廣泛應用。通過使用S7協議,可以實現PLC
    的頭像 發表于 07-11 11:55 ?5813次閱讀
    <b class='flag-5'>S7</b>協議讀取<b class='flag-5'>西門子</b><b class='flag-5'>S7</b>-200 Smart <b class='flag-5'>PLC</b>數據
    主站蜘蛛池模板: 福利视频第一区| 特级毛片aaaa级毛片免费| 四虎影永久在线观看网址| 国模精品一区二区| 久久免费香蕉视频| 综合网天天| 玖玖精品国产| 欧美黄又粗暴一进一出抽搐| 性猛交╳xxx乱大交| 日本成人在线网址| 天天射天| 精品视频一二三区| 久久婷婷一区二区三区| 九九热最新| 亚洲人毛茸茸bbxx| 国产tube| 黄色大秀| 欧美一区二区三区四区在线观看 | 免费视频久久看| 色综合天天五月色| 狠狠干精品| 黄 色 毛片免费| 99热色| 特级a毛片| 新版天堂8在线天堂| 色视频在线观看完整免费版| 欧美女人天堂| 国产手机在线看片| 四虎成人在线视频| 天天操天天干天天摸| 一级做a爰片久久毛片图片| 国产成人在线网址| 国产成人啪午夜精品网站男同| 日韩免费| 久久久免费的精品| 四虎国产精品永久免费网址| 天天射天天搞| 亚洲福利二区| 五月天婷婷网亚洲综合在线| 99热久久久久久久免费观看| 高颜值大长腿美女啪啪|