码迷,mamicode.com
首页 > Windows程序 > 详细

C# 读写倍福plc beckhoff , 使用ADS协议实现读取plc

时间:2019-12-16 22:26:27      阅读:862      评论:0      收藏:0      [点我收藏+]

标签:ams   参数   如何   完美   ref   搭建   run   打赏   manage   

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

 github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持,打赏请认准源代码项目。

联系作者及加群方式:http://www.hslcommunication.cn/Cooperation 

 

在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:

 

Install-Package HslCommunication

  

  

 如果需要教程:Nuget安装教程:http://www.cnblogs.com/dathlin/p/7705014.html

 

组件的完整信息和API介绍参照:http://www.cnblogs.com/dathlin/p/7703805.html   组件的使用限制,更新日志,都在该页面里面。

 

如果你需要在读取PLC数据之后,还要群发客户端来实现远程办公室同步监视,可以参考如下的项目(基于该组件扩展起来的,带有账户验证,版本控制,数据群发,公告管理等等功能)

https://github.com/dathlin/ClientServerProject

 

本文将展示如何配置网络参数及怎样使用代码来访问PLC数据,希望给有需要的人解决一些实际问题。主要对基恩士的数据进行读写操作,具体的参照下面的地址信息

此处使用了网线直接的方式,如果PLC接进了局域网,就可以进行远程读写了^_^

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

1
2
using HslCommunication.Profinet.Beckhoff;
using HslCommunication;

  

 

随便聊聊


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

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

http://www.cnblogs.com/dathlin/p/7782315.html

 

关于两种模式


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

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

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

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

 

关于日志记录


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

http://www.cnblogs.com/dathlin/p/7691693.html

 

访问测试项目


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

下载地址为:HslCommunicationDemo.zip 

技术图片

 

 

演示项目


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

https://github.com/dathlin/RemoteMonitor

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

技术图片

 

 

 

 

配置篇


 

倍福的配置

在使用组件和倍福plc通讯之前,需要进行相关的配置,

 

STEP1 选择system manager

SETP2选择 choose 

技术图片

 

技术图片

 

技术图片

 

 

技术图片

 

 输入用户名和密码后点击OK添加完成

注意
连接ADS时必须要填密码

如果没有请去创建一个

技术图片

 

 

技术图片

 

 

 点击AMS标签页

可以看到本机的AMSnet 和路由状况

技术图片

 

 注意,plc的IP地址,不是ams net id

电脑的ip地址,也不是ams net id。

 

 

读写数据篇


 

初始化访问PLC对象

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

 

            BeckhoffAdsNet beckhoffAdsNet = new BeckhoffAdsNet( "192.168.182.131", 48898 );
            beckhoffAdsNet.SetTargetAMSNetId( "192.168.182.131.1.1:801" );
            beckhoffAdsNet.SetSenderAMSNetId( "192.168.235.128.1.1" );

  

打开连接,并可以判断是否连接上

  

beckhoffAdsNet.ConnectServer( );

  

如果需要判断,那么按照如下的操作

  

            OperateResult connect = beckhoffAdsNet.ConnectServer( );
            if (connect.IsSuccess)
            {
                // connect success
            }
            else
            {
                // failed
            }

  

 那么现在可以读写数据了,数据分为三种类型

1. I.Q.M地址,这三个是同理的

  

            OperateResult<bool> read = beckhoffAdsNet.ReadBool( "M100" );
            bool value = read.Content;

  此时的100是第100个位的数据

当然了,也可以读取字数据

            OperateResult<short> read = beckhoffAdsNet.ReadInt16( "M10" );
            short value = read.Content;

  此时的10的地址,就是指第10个字节的数据

2. 绝对地址

            OperateResult<short> read = beckhoffAdsNet.ReadInt16( "i=100002" );
            short value = read.Content;

  绝对地址以i=开头的,后面的是数据的绝对地址,在内存里的绝对地址信息。

3, 标签地址

            OperateResult<short> read = beckhoffAdsNet.ReadInt16( "s=MAIN.int1" );
            short value = read.Content;

  

 

无论读取什么地址,都是必须知道类型的,然后就可以读写操作了。

 

C# 读写倍福plc beckhoff , 使用ADS协议实现读取plc

标签:ams   参数   如何   完美   ref   搭建   run   打赏   manage   

原文地址:https://www.cnblogs.com/dathlin/p/12051529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!