opc读取ab的plc数据_C#读写 AB PLC 直接通过节点来读写数据 读写 AllenBradley PLC

本文将使用一个Github开源的组件库技术来读写AB PLC,使用的是基于以太网的实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作

本类库绝对是ab最强的通讯库

github地址:https://github.com/dathlin/HslCommunication

      

                     如果喜欢可以star或是fork,还可以打赏支持。打赏请认准源代码项目。

从NUGET安装

Install-Package HslCommunication

准备

本文将展示怎样使用代码来访问PLC数据,希望给有需要的人解决一些实际问题。主要对AB PLC的节点数据进行读写,您在应用工业生产使用之前,应该应该详细的测试,以免造成不必要的损失

此处使用到了2个命名空间:

using HslCommunication.Profinet.AllenBradley;

using HslCommunication;

随便聊聊

当我们一个上位机需要读取100台西门子PLC设备(此处只是举个例子,凡是都是使用Modbus tcp的都是一样的)的时候,你采用服务器主动去请求100台设备的机制对性能来说是个极大的考验,如果开100个线程去轮询100台设备,那么性能损失将是非常大的,更不用说再增加设备,如果搭建Modbus tcp服务器,就可以完美的解决性能问题,因为连接的压力将会平均分摊给每一台PLC,服务器端只要新增一个时间戳就可以知道客户端有没有连接上。

我们在100台PLC里都增加发送Modbus tcp方法,将数据发送到服务器的ip和端口上去,服务器根据站号来区分设备。这样就可以搭建一个高性能总站。 本组件支持快速搭建一个高性能的Modbus tcp总站。

关于两种模式

在PLC端,包括三菱,西门子,欧姆龙,AB以及Modbus Tcp客户端的访问器上,都支持两种模式,短连接模式和长连接模式,现在就来解释下什么原理。

短连接:每次读写都是一个单独的请求,请求完毕也就关闭了,如果服务器的端口仅仅支持单连接,那么关闭后这个端口可以被其他连接复用,但是在频繁的网络请求下,容易发生异常,会有其他的请求不成功,尤其是多线程的情况下。

长连接:创建一个公用的连接通道,所有的读写请求都利用这个通道来完成,这样的话,读写性能更快速,即时多线程调用也不会影响,内部有同步机制。如果服务器的端口仅仅支持单连接,那么这个端口就被占用了,比如三菱的端口机制,西门子的Modbus tcp端口机制也是这样的。以下代码默认使用长连接,性能更高,还支持多线程同步。

在短连接的模式下,每次请求都是单独的访问,所以没有重连的困扰,在长连接的模式下,如果本次请求失败了,在下次请求的时候,会自动重新连接服务器,直到请求成功为止。另外,尽量所有的读写都对结果的成功进行判断。

关于日志记录

不管是三菱的数据访问类,还是西门子的,还是Modbus tcp访问类,都有一个LogNet属性用来记录日志,该属性是一个接口类,ILogNet,凡事继承该接口的都可以用来记录日志,该日志会在访问失败时,尤其是因为网络的原因导致访问失败时会进行日志记录(如果你为这个 LogNet属性配置了真实的日志记录器的话):如果你想使用该记录日志的功能,请参照如下的博客进行实例化:

访问测试项目

下面的一个项目是这个组件的访问测试项目,您可以进行初步的访问的测试,免去了您写测试程序的麻烦,三菱的界面和西门子的界面几乎是一致的。可以同时参考。该项目位于本篇文章开始处的Gitbub源代码里面的

演示项目,和本项目的信息无关,示例为采集西门子PLC数据

下面演示了具体如何去访问PLC的数据,我们在访问完成后,通常需要进行处理,以下的示例项目就演示了后台从PLC读取数据后,前台显示并推送给所有在线客户端的功能,客户端并进行图形化显示,具有一定的参考意义,并且推送给网页前端,项目地址为:

它应该和PLC直接连接并接入局域网,然后把数据推送给客户端显示。注意:一个复杂高级的程序就应该把处理逻辑程序和界面程序分开,比如这里的服务器程序实现数据采集,推送,存储。让客户端程序去实现数据的整理,分析,显示,这样即使客户端程序因为BUG奔溃,服务器端仍然可以正常的工作。

初始化访问PLC对象

如果想使用本组件的数据读取功能,必须先初始化数据访问对象,根据实际情况进行数据的填入。 下面仅仅是测试中的数据

private AllenBradleyNet allenBradleyNet = new AllenBradleyNet( "192.168.0.110" );

连接PLC信息

实例化之后应该启动PLC的连接操作。

OperateResult connect = allenBradleyNet.ConnectServer( );

if (connect.IsSuccess)

{

MessageBox.Show( "连接成功!" );

}

else

{

MessageBox.Show( "连接失败!" + connect.ToMessageShowString( ) );

}

断开PLC连接

allenBradleyNet.ConnectClose( );

读取PLC信息

需要参照设备的节点信息来查看:

需要注意的是,我们在读取一个节点名称之前,需要先查看该节点在PLC的数据类型,比如上面图片里的,B2是 REAL 类型,那么我们就需要使用float读取,当你的类型选择错误时,有可能会读取不到正确的信息。

float value = allenBradleyNet.ReadFloat( "B2" ).Content

类型选择的对应关系如下: bool 类型对应 bool    byte类型 对应  byte   DINT类型代表int等等。

批量读取PLC信息

将读取的节点变成一个数组信息传入进去

public OperateResult Read( string[] address )

结果提取稍微麻烦一点,多个节点的数据拼接结果。例如下面:

OperateResult read = allenBradleyNet.Read( new string[] { "B1", "B2" } );

if (read.IsSuccess)

{

int B1 = allenBradleyNet.ByteTransform.TransInt32( read.Content, 0 );

float B2 = allenBradleyNet.ByteTransform.TransSingle( read.Content, 4 );

}

写入PLC信息

写入操作的类型也是要和PLC进行对应的,当类型不正确的时候,是不能写入操作的。

OperateResult write = allenBradleyNet.Write("B2", 123.456f);

if(write.IsSuccess)

{

// 成功

}

else

{

// 失败

}

自定义写入方法:

///

/// 使用指定的类型写入指定的节点数据

///

/// 节点地址数据

/// 类型代码,详细参见上的常用字段

/// 实际的数据值

/// 是否写入成功

public OperateResult WriteTag( string address, ushort typeCode, byte[] value )

如果你清楚类型代码及数据内容可以实现更复杂的数据写入功能。

针对数组的数据读取:

比如图片中的 Array 数组,是一个short的数组数据,长度为6,如果想要读取这6个数据

OperateResult readResult = allenBradleyNet.ReadInt16( "Array", 6 );

当然也支持读取指定索引的数据

OperateResult readResult = allenBradleyNet.ReadInt16( "Array[1]" );

写入也是支持的

本方法是组件 5.5.2及之后开始支持,其中,后面的6可以写成0-6的任意数字。你写多少,就读多少长度的数组。读取的类型也要和实际的匹配,才能完美的读取。

针对数组的写入操作:

OperateResult write = allenBradleyNet.Write( "Array", new short[] { 101, 102, 103, 104, 105, 106 } );

结果如下:

更多的操作和细节可以参照DEMO项目和源代码项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言建立动态链表ppt,C语言链表讲解.ppt

第十一章 链表;例:跳马。依下图将每一步跳马之后的位置(x,y)放到一个“结点”里,再用“链子穿起来”,形成一条链,相邻两结点间用一个指针将两者连到一起。;依上图有7个结点;11.7 用指针处理链表;1249;链表中结点的定义;链表的基本…

c 语言new运算符重载,c – 当我们重载new运算符时,是否需要重载放置new运算符?...

通常不会,因为它不经常使用.但它可能是必要的,因为当你在类中重载operator new时,它会隐藏global :: operator new的所有重载.因此,如果您想在该类的对象上使用placement new,请执行;否则不要.同样适用于新的.如果您刚刚更改了分配方案,并且您感到惊讶的是某个地方某人正在使用…

supersocket缓冲区_supersockets接收过滤器(ReceiveFilter)

接收过滤器(ReceiveFilter)用于将接收到的二进制数据转化成请求实例(RequestInfo)。实现一个接收过滤器(ReceiveFilter), 你需要实现接口 IReceiveFilter:public interface IReceiveFilterwhere TRequestInfo : IRequestInfo{/// /// Filters received data of the …

android网络盒子改,有什么办法可以把淘汰下来的安卓手机改造成电视盒子用?...

基本上谁家都会有一两部旧的手机,其实并不是不能用或者坏了,只是配置有些低。我们只需要简单改造一下,就可以将旧手机改造成电视盒子,而且比普通的网络盒子性能更强大。有线方式我们需要准备一根MHL线,大部分的安卓手机…

心电信号越界怎么回事_心电监护仪常见故障分析与排除

心电监护仪常见故障分析与排除心电监护仪是一种连续实时的无创伤监测患者多种生理参数的监护仪器。本文结合EM-6多参数仪(北京康宏兴业科技发展有限公司生产)在临床使用巾经常出现的故障现象以及故障的排除方法予以分析.供大家参考。1屏幕无显示1.1故障现…

android palette组件用法,Android Support Palette使用详解

使用Palette API选择颜色良好的视觉设计是app成功所必不可少的, 而色彩设计体系是设计的基础构成. Palette包是支持包, 能够从图片中解析出突出的颜色, 从而帮助你创建出视觉迷人的应用你能够使用Palette包设计布局主题, 并把自定义色彩应用到可视化元素中. 比如, 你可以根据专…

pdf文件如何生成目录 wps_wps制作pdf文档的详细方法

一些用户在使用wps软件的时候,wps怎样制作pdf文档?你们知道怎么操作的吗?对此感兴趣的伙伴们可以去下文看看wps制作pdf文档的详细方法。wps制作pdf文档的详细方法一、打开或生成原始文件本文选择用WPS打开《岳飞传.txt》,并进行智能格式整理。二、添加…

ecshop活动页_ECSHOP团购活动,ECSHOP团购列表

网店的团购活动和现实中的团购差不多。都是希望大量的人参与进来,从而以一个相对优惠的价格买的商品。下面介绍下网店的团购活动。进入后台 > 促销管理 > 团购活动如果已经添加过团购活动的话,这里会看到添加过的所有团购活动。点击右上角的 添加团…

android studio aspectj使用,androidStudio中使用 AspectJ

关于 AOP 的详细介绍请参考 深入理解Android之AOP本文主要介绍 怎么在 AndroidStudio 中使用 AspectJ1 . 在android studio 中新建一个项目 MyApplication2. 在 app 目录下 的 build.gradle 中完成如下配置:apply plugin: com.android.applicationimport org.aspectj.bridge.IM…

ndnsim r语言 ubuntu_Ubuntu14.04安装配置ndnSIM

Ubuntu14.04安装配置ndnSIM预环境Ubuntu14.04官方系统请先使用sudo apt-get update更新一下源列表安装步骤安装boost-libsudo apt-get install build-essential libsqlite3-dev libcrypto-devsudo apt-get install libboost-all-dev其中,build-essential和libboost是…

android ui stencil kit 下载,实用的iOS6/iPhone5 GUI/iPad PSD以及其它版本素材

实用的iOS6/iPhone5 GUI/iPad PSD以及其它版本素材10月 16, 2012评论 (1)Sponsor现在使用Apple旗下产品越来越多,比如iPhoneiPad等,正因如此,我们需要设计这类的apps应用也相对多了,所以如果有一些现用素材的话可以帮助设计师快速…

华为acl怎么生效_华为ACL配置教程(一)

一、ACL基本配置1、ACL规则生效时间段配置(需要先配置设备的时间,建议用ntp同步时间)某些引用ACL的业务或功能需要限制在一定的时间范围内生效,比如,在流量高峰期时启动设备的QoS功能。用户可以为ACL创建生效时间段,通过在规则中引…

android 中文参数,(原)Android: 启动另外的APP及传递参数

有时候需要从一个APP中启动另外一个APP,比如Twitter/微信等。如果你不知道那个APP的Activity,但是知道包名(package name),那么可以使用如下的方法:Intent LaunchIntent getPackageManager().getLaunchIntentForPackage("co…

kafka 主动消费_Kafka核心API——Consumer消费者

Consumer之自动提交在上文中介绍了Producer API的使用,现在我们已经知道如何将消息通过API发送到Kafka中了,那么现在的生产者/消费者模型就还差一位扮演消费者的角色了。因此,本文将介绍Consumer API的使用,使用API从Kafka中消费消…

android下拉弹性gif,android-pulltorefresh 下拉加载中使用gif动图

效果预览:xml布局xmlns:ptr"http://schemas.android.com/apk/res-auto"android:layout_width"fill_parent"android:layout_height"fill_parent"android:divider"#00000000"android:cacheColorHint"#00000000"and…

linux本地时间与utc不一致_Linux下CST和UTC时间的区别以及不一致的解决方法

1.在linux中,用date查看时间的时候显示:2013年 2月 17日 星期三 19:04:14 CST世界协调时间(Universal Time Coordinated,UTC):GPS 系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的…

ios uiview 如何刷新_ios-如何在Swift中刷新imageview而无需重新加载页面?

我有一个更新照片按钮,该按钮连接到facebookgraphAPI并下载当前用户的个人资料图片.我希望刷新视图上的图像,而无需重新加载viewController.有什么办法可以做到这一点?我知道tableview具有reloadData和refreshcontrol,但是我没有使用tableview.class ProfileViewCon…

unity3d android aar,Android Stuido导出AAR 给Unity3D调用注意事项

1. 导出 AAR过程需要注意,依赖的文件并没有打进去,所以要收到拷入到 Unity项目中,如下图中的 support包,是我项目中要用到的:2.删除aar包中重复的 libs下的 jar文件和 jni下的 .so文件,否则调用的时候会报…

识别产品外观的合格软件_产品外观质量视觉检测系统.PDF

产品外观质量视觉检测系统产品外观质量视觉检测系统北京大恒图像视觉有限公司Beijing Daheng Image Vision Co., Ltd公司简介中国大恒(集团)有限公司是中国科学院于 1987 年报经国务院批准创办的高新技术企业,公司于 1996 年至2007 年连续十二年进入全国电子百强企业…

html中图片响应式怎么写,如何使用 HTML5 的picture元素处理响应式图片

图片在响应式网页设计中是出了名的最具挑战性的方面之一。今天我们就来看看如何使用元素来处理响应式图片.让我们先了解一下问题固定宽度,像素完美的网站设计已经离我们远去了。在宽屏显示器,互联网电视,多尺寸的平板电脑和智能手机的今天&am…