基礎類庫積累--SiemensS7NetClient類


前言

這個類是針對S7協議的類,如果你是做上位機,和下位機(PLC)交互,可能會給你帶來幫助。

代碼

使用NuGet引入第三方庫(HslCommunication)

HslCommunication

HslCommunication的簡介:

       HSL專注於解決工業網絡間的復雜的數據通信問題,解決多個獨立程序之間的數據通信,甚至是不同的操作系統,平台的網絡通信問題, 可以用來構建各種各樣的應用程序,下至通信小軟件,上位機軟件,CS架構的聊天系統,上至ERP系統,歷史追述系統,生產管理系統,MES系統, 無論你的開發環境是Visual Studio, Visual Studio Code, IntelliJ IDEA, Eclipse, Labview, Android Studio等等

HslCommunication的使用:

  /// <summary>
    /// 西門子S7協議的PLC客戶端操作類
    /// </summary>
    public class SiemensS7NetClient
    {
        /// <summary>
        /// 獲取西門子S7協議的客戶端
        /// </summary>
        /// <param name="ip">下位機IP地址</param>
        /// <returns>SiemensS7Net實例</returns>
        public static SiemensS7Net GetInstance(string ip)
        {
            return new SiemensS7Net(SiemensPLCS.S1200, ip)
            {
                ConnectTimeOut = 200
            };
        }

        /// <summary>
        /// 獲取下位機單點數據
        /// </summary>
        /// <param name="client">西門子S7協議的客戶端實例</param>
        /// <param name="dataType">數據類型</param>
        /// <param name="block">數據塊</param>
        /// <param name="offset">偏移量</param>
        /// <param name="value">輸出參數:點位值(成功);</param>
        /// <param name="errorMessage">輸出參數:空字符(成功);錯誤信息(失敗)</param>
        /// <returns>返回是否獲取成功</returns>
        public static bool GetPlcSingleData(SiemensS7Net client, string dataType, string block, decimal offset, ref object value, ref string errorMessage)
        {
            bool result = false;
            if (client != null)
            {
                if (dataType.ToLower() == "int")
                {
                    var operateResult = client.ReadInt16(block + "." + offset);
                    if (operateResult.IsSuccess)
                    {
                        value = operateResult.Content;
                        errorMessage = "";
                        result = true;
                    }
                    else
                    {
                        errorMessage = operateResult.Message;
                    }
                }
                else if (dataType.ToLower() == "bool")
                {
                    var operateResult = client.ReadBool(block + "." + offset);
                    if (operateResult.IsSuccess)
                    {
                        value = operateResult.Content;
                        result = true;
                    }
                    else
                    {
                        value = operateResult.Message;
                    }
                }
                else if (dataType.ToLower() == "usint")
                {
                    var operateResult = client.ReadUInt16(block + "." + offset);
                    if (operateResult.IsSuccess)
                    {
                        value = operateResult.Content;
                        result = true;
                    }
                    else
                    {
                        value = operateResult.Message;
                    }
                }
                else if (dataType.ToLower() == "word")
                {
                    var operateResult = client.Read(block + "." + offset, 2);
                    if (operateResult.IsSuccess)
                    {
                        value = operateResult.Content;
                        result = true;
                    }
                    else
                    {
                        value = operateResult.Message;
                    }
                }
                else if (dataType.ToLower() == "wstring")
                {
                    var operateResult = client.Read(block + "." + offset, 254);
                    if (operateResult.IsSuccess)
                    {
                        value = operateResult.Content;
                        result = true;
                    }
                    else
                    {
                        value = operateResult.Message;
                    }
                }
            }
            else
            {
                errorMessage = "連接下位機的客戶端引擎未初始化";
            }
            return result;
        }

        /// <summary>
        /// 設置下位機單點數據
        /// </summary>
        /// <param name="client">西門子S7協議的客戶端實例</param>
        /// <param name="dataType">數據類型</param>
        /// <param name="block">數據塊</param>
        /// <param name="offset">偏移量</param>
        /// <param name="value">寫入的值</param>
        /// <param name="errorMessage">輸出參數:空字符(成功);錯誤信息(失敗)</param>
        /// <returns>返回是否設置成功</returns>
        public static bool SetPlcSingleData(SiemensS7Net client, string dataType, string block, decimal offset, object value, ref string errorMessage)
        {
            bool result = false;
            if (client != null)
            {
                if (dataType.ToLower() == "int")
                {
                    var operateResult = client.Write(block + "." + offset, Convert.ToInt16(value));
                    if (operateResult.IsSuccess)
                    {
                        errorMessage = "";
                        result = true;
                    }
                    else
                    {
                        errorMessage = operateResult.Message;
                    }
                }
                else if (dataType.ToLower() == "bool")
                {
                    var operateResult = client.Write(block + "." + offset, Convert.ToBoolean(value));
                    if (operateResult.IsSuccess)
                    {
                        result = true;
                    }
                    else
                    {
                        errorMessage = operateResult.Message;
                    }
                }
                else if (dataType.ToLower() == "usint")
                {
                    var operateResult = client.Write(block + "." + offset, Convert.ToByte(value));
                    if (operateResult.IsSuccess)
                    {
                        errorMessage = "";
                        result = true;
                    }
                    else
                    {
                        errorMessage = operateResult.Message;
                    }
                }
            }
            else
            {
                errorMessage = "連接下位機的客戶端引擎未初始化";
            }
            return result;
        }

        /// <summary>
        /// 獲取下位機批量數據
        /// </summary>
        /// <param name="client">西門子S7協議的客戶端實例</param>
        /// <param name="startAddress">讀取的起始地址(例如:DB1.46.0)</param>
        /// <param name="length">讀取數據的個數(1個數據2個字節)</param>
        /// <param name="values">輸出參數:點位值字節數組(成功);</param>
        /// <param name="errorMessage">輸出參數:空字符(成功);錯誤信息(失敗)</param>
        /// <returns></returns>
        public static bool GetPlcBatchData(SiemensS7Net client, string startAddress, ushort length, ref byte[] values, ref string errorMessage)
        {
            bool result = false;
            if (client != null)
            {
                OperateResult<byte[]> read = client.Read(startAddress, length);
                {
                    if (read.IsSuccess)
                    {
                        values = read.Content;
                        errorMessage = "";
                        result = true;
                    }
                    else
                    {
                        errorMessage = read.Message;
                    }
                }
            }
            else
            {
                errorMessage = "連接下位機的客戶端引擎未初始化";
            }
            return result;
        }
    }

總結

其實我也是第一次使用到這個,可能做上位機的經常會使用到,它是一種協議,讓下位機和上位機之間建立某一種契約,上位機能給下位機發送命令,下位機執行命令,下位機返回信息給上位機,上位機處理。上位機監聽下位機的點位信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM