zoukankan      html  css  js  c++  java
  • 基础类库积累--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;
            }
        }
    

    总结

    其实我也是第一次使用到这个,可能做上位机的经常会使用到,它是一种协议,让下位机和上位机之间建立某一种契约,上位机能给下位机发送命令,下位机执行命令,下位机返回信息给上位机,上位机处理。上位机监听下位机的点位信息。

  • 相关阅读:
    [bzoj4417] [洛谷P3990] [Shoi2013] 超级跳马
    [bzoj4011] [洛谷P3244] [HNOI2015] 落忆枫音
    [bzoj1875] [洛谷P2151] [SDOI2009] HH去散步
    [bzoj4827] [洛谷P3723] [Hnoi2017] 礼物
    [bzoj2326] [洛谷P3216] [HNOI2011] 数学作业
    [bzoj3105] [cqoi2013] 新Nim游戏
    [YTU]_2353 ( 长方柱类【C++ 类定义】)
    [YTU]_2627 (职工工资统计)
    [YTU]_2769( 结构体--成绩统计)
    [YTU]_2577( 小数计算——结构体)
  • 原文地址:https://www.cnblogs.com/2828sea/p/13743695.html
Copyright © 2011-2022 走看看