工业视觉项目少不了与下位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<T>(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;

}

视觉系统设计实例(halcon-winform)-10.PLC通讯相关推荐

  1. codesys 串口通讯实例_常见的PLC程序实例,车库自动门的PLC控制!

    点击箭头处"工业之家",选择"关注公众号"! PLC控制车库自动门实例 车库自动门控制 (1)明确系统控制要求 系统要求车库门在车辆进出时能自动打开关闭,车库门 ...

  2. 丰田工机PLC,丰田TOYOPUC通讯组态王,实例教程,组态王通讯

    丰田工机PLC,丰田TOYOPUC通讯组态王,实例教程,组态王通讯 ID:698636128686987SCADA许大虾

  3. 无需编程PLC与PLC通讯实例方案

    无需编程PLC与PLC通讯实例方案三菱PLC与三菱PLC进行通讯或PLC与MODBUS通讯设备通讯怎么样才不用写程序?我们做一个工程中常会用到系统与系统之间数据进行传输,为了方便使用及灵活的后期服务, ...

  4. LabVIEW视觉尺寸测量 范例包含尺寸测量和数据库工具带三菱plc通讯

    LabVIEW视觉尺寸测量 范例包含尺寸测量和数据库工具带三菱plc通讯. 包含一份软件调试说明书及调试操作视频! 现有:69100614186286191苏州工控代理商

  5. 变频器与PLC通讯的精简设计

     1.引言 在工业自动化控制系统中,最为常见的是PLC和变频器的组合应用,并且产生了多种多样的PLC控制变频器的方法,其中采用RS-485通讯方式实施控制的方案得到广泛的应用:因为它抗干扰能力强.传输 ...

  6. 基于OPC协议的上位机PLC通讯 (一)

    OPC技术是通常是用于PLC和上位机通讯的一个基于COM的一个通讯组件.比如某个项目是用西门子系列的PLC控制的自动化系统通过西门子的中间件通常会安装S7-200 PC Access或者Simatic ...

  7. C#与西门子PLC通讯

    1.0  通讯组件概述 通讯组件用于PC与可编程控制器(PLC).智能仪表等进行数据通讯,适用于基于PC高级语言的工业自动化控制系统.组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工程里 ...

  8. PLC通讯之串口转以太网/WIFI的透传模块(DTU)的专用OPC软件和DLL通讯组件

    http://blog.sina.com.cn/s/blog_16d7d3ecb0102x33a.html 一.概述 在工业4.0的趋势影响下,很多串口型PLC控制的机器设备,须要满足信息化的要求,以 ...

  9. PLC通讯实现-C#访问OpcUa实现读写PLC(十)

    PLC通讯实现-C#访问OpcUa实现读写PLC(十) 背景 概念 特点 依赖 配置OpcUA Server 关键代码 代码下载 背景 由于工厂设备种类多.分阶段建设,工控程序开发通常面临对接多种PL ...

  10. python足球分析系统_NAO足球/高尔夫比赛视觉系统设计(python初级版)

    初级版的内容主要分为两部分,第一部分是如何利用NAO的视觉传感器,即上下摄像头,来获取图片及如何利用opencv显示获得的图片.第二部分是如何利用opencv里面的视觉算法从NAO获取的图片中找到所需 ...

最新文章

  1. android找不到aar包
  2. 算术运算符举例java_Java的算术运算符简介
  3. MyBatis-24MyBatis缓存配置【集成EhCache】
  4. AI:一个20年程序猿的学习资料大全—前端/后端/架构师/运维各种很多教程资料——只有你不想要的,没有你找不到的
  5. Use Chunks.groupsIterable and filter by instanceof Ent rypoint instead
  6. 初步了解学习将传统单机应用改造成Dubbo服务的过程
  7. 在js中如何判断一个对象是否为空
  8. mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
  9. Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法笔记-协议与分类...
  10. 写了 10 年代码之后,我学到的 7 个绝对真理
  11. 使用新操作码在比特币现金上进行首次原子竞猜
  12. CopyTranslator(复译)-外文辅助阅读翻译解决方案
  13. 江苏省谷歌高清卫星地图下载
  14. DDR3各个频率详解
  15. 没有PPT,一文带你了解元宇宙
  16. 使用tkinter实现 loading 等待效果
  17. m3u8视频格式下载并转换为mp4(ffmpeg)
  18. 怎么把视频内存压缩小?视频内存过大怎么压缩?
  19. Mac更新系统后提示xcrun error
  20. pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas

热门文章

  1. unity-MMD制作
  2. CentOS 7 - Securing OpenSSH(二)
  3. html中最小规格字体,font-size【CSS 字体大小】文字大小尺寸
  4. 机器学习——周志华(1)
  5. 总时差与自由时差的计算
  6. mysql进销存表设计_数据库设计:数据库进销存管理系统(包含有仓库出库入库触发器)...
  7. Ubuntu20.04安装有道云词典
  8. MiroTik 路由器配置无线中继模式(超细教程)
  9. 从零开始学OpenCV(一)——OpenCV的安装
  10. python评分卡模型 简书_评分卡模型开发-定量特征筛选