• 视觉系统设计实例(halcon-winform)-10.PLC通讯


    工业视觉项目少不了与下位PLC进行数据通讯,例如产品就位通知视觉进行拍照检测,视觉开始触发光源相机拍照 进行图像处理,最后结果输出形成闭环,像我们常用的西门子PLC三菱PLC等等都有相应的通讯方式,大都是定义通讯标记的地址,进行地址轮询校验识进行对应的操作。本篇以西门子为例,西门子的S7协议,用了的Hsl的开源协议库封装了对S7协议的连接读写方法。

     

    NUGET安装类库7.0 属于免费版本。 

       public bool Connect(out ResultMessage resut, string serverUrl = "192.168.10.10", int port = 4000, PLCModelEnum pLCModel = PLCModelEnum.S7_1200)
            {
                if (pLCModel == PLCModelEnum.S7_1200)
                {
                    if (Plc == null)
                    {
                        Plc = new SiemensS7Net( SiemensPLCS.S1200,serverUrl)
                        {
                            ConnectTimeOut = 5000,
                            ReceiveTimeOut = 500
                        };
                    }
                    try
                    {
                        var open = Plc.ConnectServer();
                        if (open.IsSuccess)
                        {
                            IsConnect = true;
                            //PLC打开成功
                            resut = new ResultMessage()
                            {
                                IsSuccess = true,
                                ErrorMsg = open.Message
                            };
                            return true;
                        }
                        else
                        {
                            IsConnect = false;
                            Plc = null;
                            resut = new ResultMessage()
                            {
                                IsSuccess = false,
                                ErrorMsg = open.Message
                            };
                            return false;
                        }
                    }
                    catch (Exception ex)
                    {
                        IsConnect = false;
                        Plc = null;
                        resut = new ResultMessage()
                        {
                            IsSuccess = false,
                            ErrorMsg = $"Connect PLC Error:{ex.Message}"
                        };
                        return false;
                    }
                }
                else
                {
                    IsConnect = false;
                    resut = new ResultMessage()
                    {
                        IsSuccess = false,
                        ErrorMsg = "Unknow PLC Model"
                    };
                    return false;
                }

            }

     public T ReadNode(string tag, out ResultMessage result, ushort length = 0)
            {
                T ret = default;
                if (Plc == null)
                {
                    result = new ResultMessage()
                    {
                        IsSuccess = false,
                        ErrorMsg = "未初始化连接"
                    };
                    return ret;
                }
                result = default;
                Type type = typeof(T);
                switch (type.Name)
                {
                    case nameof(Boolean):
                        {
                            var r = Plc.ReadBool(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(Int16):
                        {
                            var r = Plc.ReadInt16(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(UInt16):
                        {
                            var r = Plc.ReadUInt16(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(Int32):
                        {
                            var r = Plc.ReadInt32(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(UInt32):
                        {
                            var r = Plc.ReadUInt32(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(Int64):
                        {
                            var r = Plc.ReadInt64(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(UInt64):
                        {
                            var r = Plc.ReadUInt64(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(Single):
                        {
                            var r = Plc.ReadFloat(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(Double):
                        {
                            var r = Plc.ReadDouble(tag);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(String):
                        {
                            //如果长度为0,这设为默认值1
                            if (length == 0)
                            {
                                length = 1;
                            }
                            var addressStr = tag;
                            var index = tag.IndexOf(".");
                            var lastIndex = tag.LastIndexOf(".");
                            if (lastIndex != index && lastIndex < tag.Length - 1)
                            {
                                try
                                {
                                    addressStr = tag.Substring(0, lastIndex);
                                    length = Convert.ToUInt16(tag.Substring(lastIndex + 1));
                                }
                                catch
                                {
                                }
                            }
                            // 读取时读取的字符往后偏移2位 
                            if (addressStr.IndexOf(".") > -1) { 
                                var addressArr = addressStr.Split('.');
                                addressStr = $"{addressArr[0]}.{addressArr[1].ToInt() + 2}";
                            }


                            var r = Plc.ReadString(addressStr, length);
                            result = new ResultMessage() { IsSuccess = r.IsSuccess, ErrorMsg = r.Message };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content, typeof(T));
                        }
                        break;
                    case nameof(Char):
                        {
                            var r = Plc.ReadString(tag, 1);
                            result = new ResultMessage()
                            {
                                IsSuccess = r.IsSuccess,
                                ErrorMsg = r.Message
                            };
                            if (r.IsSuccess)
                                ret = (T)Convert.ChangeType(r.Content.ToCharArray()[0], typeof(T));
                        }
                        break;
                    default: break;
                }


                return ret;
            }

    public bool WriteNode(string tag, object value, out ResultMessage result)
            {
                if (Plc == null)
                {
                    result = new ResultMessage()
                    {
                        IsSuccess = false,
                        ErrorMsg = "未初始化连接"
                    };
                    return false;
                }
                OperateResult ret = default;
                switch (value.GetType().Name)
                {
                    case nameof(Boolean):
                        {
                            ret = Plc.Write(tag, (bool)value);
                        }
                        break;
                    case nameof(Int16):
                        {
                            ret = Plc.Write(tag, (short)value);
                        }
                        break;
                    case nameof(UInt16):
                        {
                            ret = Plc.Write(tag, (ushort)value);
                        }
                        break;
                    case nameof(Int32):
                        {
                            ret = Plc.Write(tag, (int)value);
                        }
                        break;
                    case nameof(UInt32):
                        {
                            ret = Plc.Write(tag, (uint)value);
                        }
                        break;
                    case nameof(Int64):
                        {
                            ret = Plc.Write(tag, (long)value);
                        }
                        break;
                    case nameof(UInt64):
                        {
                            ret = Plc.Write(tag, (ulong)value);
                        }
                        break;
                    case nameof(Single):
                        {
                            ret = Plc.Write(tag, (float)value);
                        }
                        break;
                    case nameof(Double):
                        {
                            ret = Plc.Write(tag, (double)value);
                        }
                        break;
                    case nameof(String):
                        {
                            string strValue = (string)value;
                            var addressStr = tag;
                            var index = tag.IndexOf(".");
                            var lastIndex = tag.LastIndexOf(".");
                            if (lastIndex != index && lastIndex < tag.Length - 1)
                            {
                                try
                                {
                                    addressStr = tag.Substring(0, lastIndex);
                                    int len = tag.Substring(lastIndex+1).ToInt();
                                    if (value.ToString().Length < len) {
                                        strValue = strValue.PadRight(len,'\0');
                                    }
                                }
                                catch
                                {
                                }
                            }
                            ret = Plc.Write(addressStr, strValue);
                        }
                        break;
                    default: break;
                }
                result = new ResultMessage()
                {
                    IsSuccess = ret.IsSuccess,
                    ErrorMsg = ret.Message
                };
                return ret.IsSuccess;

            }

  • 相关阅读:
    TypeScript的安装与简单使用(第一篇)
    非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.8 接口
    软件设计不是CRUD(17):低耦合模块设计理论——总结
    【算法3.5】Dijkstra求最短路(完结)
    使用Redis控制表单重复提交控制接口访问频率
    牛客网刷题记录 || 链表
    python 分类问题 画roc曲线实战
    Java-面向对象
    2022美亚个人赛复盘
    SVN服务器迁移方法(Windows环境)
  • 原文地址:https://blog.csdn.net/u011540323/article/details/125944889