如何实现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;
}
}
}
}
程序运行效果