如何实现PLC对Halcon程序的控制

我们都知道机器视觉一般应用于工业现场,而PLC是用于自动化的控制,两者配合使用就实现了机器视觉的自动化控制。机器视觉在自动化中充当了传感器的角色。本篇就来举个简单的用PLC对Halcon程序的控制。实现的功能是用PLC控制打开RGB图转成灰度图为例。

、打开MVTec HALCON HDevelop视频处理软件,打开一个RGB图片并通过代码转成灰度图片。

此时这个简单的色彩转换程序就算完成了。并将程序导出为C#程序。导出完以后需要关闭MVTec HALCON HDevelop程序,否则在C#开发程序中运行可能会出错。

、打开博途软件新建一个工程,设置IP地址,连接机制中的允许来自远程对象的PUT/GET通信访问要勾选。

新建一个二进制变量,此变量的变化触发Halcon程序中的图像变化。并将这个监控变量添加到监控表中。

三、新建一具VS项目,并命名为PLC控制Halcon程序

在左侧的工具箱中添加HalconDotNet库

添加三个按钮分别是启动按钮、处理数据、关闭程序、文字标签、输入输出IO域、和WindowControl控件用于图片的显示。

在NuGet解决方案中添加S7.Net库并安装,要连接网络下载。此库用于PLC的通讯库。

在VS中的功能实现代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
using S7.Net;
using System.Diagnostics;

namespace PCHM通信实例
{
    public partial class Form1 : Form
    {
        public HObject ho_Image, ho_GrayImage;
        public Form1()
        {
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            config1.START((Control)this, System.Reflection.Assembly.GetExecutingAssembly(), null);
        }

        private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs e)
        {
            string _resName = "PCHM通信实例.DLL." + new System.Reflection.AssemblyName(e.Name).Name + ".dll";
            using (var _stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(_resName))
            {
                byte[] _data = new byte[_stream.Length];
                _stream.Read(_data, 0, _data.Length);
                return System.Reflection.Assembly.Load(_data);
            }
        }
        //启动按钮
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(Read_CPU);
            thread.Start();
            button1.Enabled = false;
        }
        //处理数据
        private void button2_Click_1(object sender, EventArgs e)
        {
            if (label1.Text=="True")
            {
                HOperatorSet.ReadImage(out ho_Image, "F:/图片/桌面背景/e.jpg");
                HOperatorSet.Rgb1ToGray(ho_Image, out ho_GrayImage);
                hWindowControl1.HalconWindow.DispObj(ho_GrayImage);
                button1.Enabled = true;
            }
            else hWindowControl1.HalconWindow.ClearWindow();       
        }

        private void Form1_Close(object sender, EventArgs e)
        {

        }
        //关闭程序
        private void button3_Click(object sender, EventArgs e)
        {
            Process.GetCurrentProcess().Kill();
        }

        public void Read_CPU()
        {
            Read read = new Read();
            read.Read_message();

            while (true)
            {
                read.Read_m10();
                label1.Text = read.M10.ToString();
            }
        }

    }
}

下面是通讯连接的类Read

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using S7.Net;

namespace PCHM通信实例
{
    class Read
    {
        bool m10 = false;

        Plc CPU = new Plc(CpuType.S71500, "192.168.0.1", 0, 1);

        public bool M10 { get => m10; set => m10 = value; }

        public void Read_m10()
        {
            if (CPU.IsConnected)
            {
                M10 = (bool)CPU.Read("M10.0");
            }
        }

        public void Read_message()
        {           
            try
            {
                CPU.Open();                
            }
            catch (Exception)
            {
                MessageBox.Show($"PLC连接错误!!!");
                return;
            }
        }
    }
}

程序运行效果

转载请注明出处:  https://www.cntworld.cn
智能工控 » 如何实现PLC对Halcon程序的控制

发表回复

提供最优质的资源集合

立即查看 了解详情