视觉系统设计实例(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<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通讯相关推荐
- codesys 串口通讯实例_常见的PLC程序实例,车库自动门的PLC控制!
点击箭头处"工业之家",选择"关注公众号"! PLC控制车库自动门实例 车库自动门控制 (1)明确系统控制要求 系统要求车库门在车辆进出时能自动打开关闭,车库门 ...
- 丰田工机PLC,丰田TOYOPUC通讯组态王,实例教程,组态王通讯
丰田工机PLC,丰田TOYOPUC通讯组态王,实例教程,组态王通讯 ID:698636128686987SCADA许大虾
- 无需编程PLC与PLC通讯实例方案
无需编程PLC与PLC通讯实例方案三菱PLC与三菱PLC进行通讯或PLC与MODBUS通讯设备通讯怎么样才不用写程序?我们做一个工程中常会用到系统与系统之间数据进行传输,为了方便使用及灵活的后期服务, ...
- LabVIEW视觉尺寸测量 范例包含尺寸测量和数据库工具带三菱plc通讯
LabVIEW视觉尺寸测量 范例包含尺寸测量和数据库工具带三菱plc通讯. 包含一份软件调试说明书及调试操作视频! 现有:69100614186286191苏州工控代理商
- 变频器与PLC通讯的精简设计
1.引言 在工业自动化控制系统中,最为常见的是PLC和变频器的组合应用,并且产生了多种多样的PLC控制变频器的方法,其中采用RS-485通讯方式实施控制的方案得到广泛的应用:因为它抗干扰能力强.传输 ...
- 基于OPC协议的上位机PLC通讯 (一)
OPC技术是通常是用于PLC和上位机通讯的一个基于COM的一个通讯组件.比如某个项目是用西门子系列的PLC控制的自动化系统通过西门子的中间件通常会安装S7-200 PC Access或者Simatic ...
- C#与西门子PLC通讯
1.0 通讯组件概述 通讯组件用于PC与可编程控制器(PLC).智能仪表等进行数据通讯,适用于基于PC高级语言的工业自动化控制系统.组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工程里 ...
- PLC通讯之串口转以太网/WIFI的透传模块(DTU)的专用OPC软件和DLL通讯组件
http://blog.sina.com.cn/s/blog_16d7d3ecb0102x33a.html 一.概述 在工业4.0的趋势影响下,很多串口型PLC控制的机器设备,须要满足信息化的要求,以 ...
- PLC通讯实现-C#访问OpcUa实现读写PLC(十)
PLC通讯实现-C#访问OpcUa实现读写PLC(十) 背景 概念 特点 依赖 配置OpcUA Server 关键代码 代码下载 背景 由于工厂设备种类多.分阶段建设,工控程序开发通常面临对接多种PL ...
- python足球分析系统_NAO足球/高尔夫比赛视觉系统设计(python初级版)
初级版的内容主要分为两部分,第一部分是如何利用NAO的视觉传感器,即上下摄像头,来获取图片及如何利用opencv显示获得的图片.第二部分是如何利用opencv里面的视觉算法从NAO获取的图片中找到所需 ...
最新文章
- android找不到aar包
- 算术运算符举例java_Java的算术运算符简介
- MyBatis-24MyBatis缓存配置【集成EhCache】
- AI:一个20年程序猿的学习资料大全—前端/后端/架构师/运维各种很多教程资料——只有你不想要的,没有你找不到的
- Use Chunks.groupsIterable and filter by instanceof Ent rypoint instead
- 初步了解学习将传统单机应用改造成Dubbo服务的过程
- 在js中如何判断一个对象是否为空
- mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
- Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法笔记-协议与分类...
- 写了 10 年代码之后,我学到的 7 个绝对真理
- 使用新操作码在比特币现金上进行首次原子竞猜
- CopyTranslator(复译)-外文辅助阅读翻译解决方案
- 江苏省谷歌高清卫星地图下载
- DDR3各个频率详解
- 没有PPT,一文带你了解元宇宙
- 使用tkinter实现 loading 等待效果
- m3u8视频格式下载并转换为mp4(ffmpeg)
- 怎么把视频内存压缩小?视频内存过大怎么压缩?
- Mac更新系统后提示xcrun error
- pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas
热门文章
- unity-MMD制作
- CentOS 7 - Securing OpenSSH(二)
- html中最小规格字体,font-size【CSS 字体大小】文字大小尺寸
- 机器学习——周志华(1)
- 总时差与自由时差的计算
- mysql进销存表设计_数据库设计:数据库进销存管理系统(包含有仓库出库入库触发器)...
- Ubuntu20.04安装有道云词典
- MiroTik 路由器配置无线中继模式(超细教程)
- 从零开始学OpenCV(一)——OpenCV的安装
- python评分卡模型 简书_评分卡模型开发-定量特征筛选