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

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

在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个命名空间:

using HslCommunication.Profinet.Keyence;
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

地址的格式在在线文档里:http://118.24.36.220:8080/html/04bd2a21-7ab0-2fb9-f7f1-e0f0ecaf9227.htm

演示项目


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

https://github.com/dathlin/RemoteMonitor

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

基恩士PLC篇(本组件支持二进制和ASCII通讯,两者只是类名不同,具体的地址,方法都是一模一样的)


初始化访问PLC对象

注意:如果你采用了二进制读写,那么就实例化KeyenceMcNet类,如果采用ASCII来读写数据,请使用KeyenceMcAsciiNet类
如果想使用本组件的数据读取功能,必须先初始化数据访问对象,根据实际情况进行数据的填入。 下面仅仅是测试中的数据:

private KeyenceMcNet keyence_net = new KeyenceMcNet( "192.168.8.13", 5000 );

  

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

keyence_net.ConnectServer( );

  

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

    OperateResult connect = keyence_net.ConnectServer( );if (connect.IsSuccess){MessageBox.Show( "连接成功!" );}else{MessageBox.Show( "连接失败!" );}

  

说明:对象应该放在窗体类下面,此处仅仅针对读取一台设备的plc,也可以在访问的方法中实例化局部对象, 初始化数据,然后读取,该对象几乎不损耗内存,内存垃圾由CLR进行自动回收。此处测试方便,窗体的多个按钮均连接同一台PLC 设备,所以本窗体实例化一个对象即可。

展示一些简单实用基础数据读写,这些数据的读写没有进行严格的是否成功判断(判断方法参照后面的代码),一般网络良好的情况下都会成功,但不排除失败,以下代码仅作测试,所有没有严格判断是否成功:

            short d100_short = keyence_net.ReadInt16( "D100" ).Content;ushort d100_ushort = keyence_net.ReadUInt16( "D100" ).Content;int d100_int = keyence_net.ReadInt32( "D100" ).Content;uint d100_uint = keyence_net.ReadUInt32( "D100" ).Content;long d100_long = keyence_net.ReadInt64( "D100" ).Content;ulong d100_ulong = keyence_net.ReadUInt64( "D100" ).Content;float d100_float = keyence_net.ReadFloat( "D100" ).Content;double d100_double = keyence_net.ReadDouble( "D100" ).Content;// need to specify the text lengthstring d100_string = keyence_net.ReadString( "D100", 10 ).Content;keyence_net.Write( "D100", (short)5 );keyence_net.Write( "D100", (ushort)5 );keyence_net.Write( "D100", 5 );keyence_net.Write( "D100", (uint)5 );keyence_net.Write( "D100", (long)5 );keyence_net.Write( "D100", (ulong)5 );keyence_net.Write( "D100", 5f );keyence_net.Write( "D100", 5d );// length should Multiples of 2 keyence_net.Write( "D100", "12345678" );

如下方法演示读取了M200-M209这10个M的值,注意:读取长度必须为偶数,即时写了奇数,也会补齐至偶数,读取和写入的最大长度为7168,否则报错。如需实际需求确实大于7168的,请分批次读取。
返回值解析:如果读取正常则共返回10个字节的数据,以下示例数据进行批量化的读取

        private void test1(){OperateResult<bool[]> read = keyence_net.ReadBool( "M100", 10 );if(read.IsSuccess){bool m100 = read.Content[0];// and so onbool m109 = read.Content[9];}else{// failed}}

  

写入Bool的操作

bool[] values = new bool[] { true, false, true, true, false, true, false, true, true, false };OperateResult read = keyence_net.Write( "M100", values );if (read.IsSuccess){// success}else{// failed}

高级的批量数据读取(针对连续的地址的时候效率非常的高):

        private void test5( ){OperateResult<byte[]> read = keyence_net.Read( "D100", 10 );if(read.IsSuccess){int count = keyence_net.ByteTransform.TransInt32( read.Content, 0 );float temp = keyence_net.ByteTransform.TransSingle( read.Content, 4 );short name1 = keyence_net.ByteTransform.TransInt16( read.Content, 8 );string barcode = Encoding.ASCII.GetString( read.Content, 10, 10 );}}

  

麻烦之处需要自己写代码解析数据信息

更多详细的读写信息请关注本项目学习。

转载于:https://www.cnblogs.com/dathlin/p/10470490.html

C#读写基恩士PLC 使用TCP/IP 协议 MC协议相关推荐

  1. 基恩士MC协议 虚拟服务器,C#读写基恩士PLC 使用TCP/IP 协议 MC协议

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

  2. java android 读写三菱PLC 使用TCP/IP 协议

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

  3. 信捷PLC使用TCP/IP协议通讯

    文章目录 前言 一.TCP/IP通讯的优势的优/劣 二.PLC的TCP/IP通讯配置 1.首先确定PLC的IP 2.程序建立连接 三.实例说明 附上文提到的标志寄存器功能表 前言 信捷PLC的以太网机 ...

  4. 【详解】以下关于TCP/IP协议栈中协议和层次的对应关系正确的是()

    以下关于TCP/IP协议栈中协议和层次的对应关系正确的是 解析: TCP协议和UDP协议都是基于IP协议的. 基于TCP的应用层协议:FTP.Telnet.SMTP.HTTP.POP3与DNS 基于U ...

  5. http与https与socket tcp/IP与UDP 协议等

    网络由下往上分为:   物理层--                       数据链路层-- 网络层--                       IP协议 传输层--               ...

  6. 常见TCP/IP、HTTP协议以及三次握手和四次挥手

    面试常见TCP/IP.HTTP协议以及三次握手和四次挥手 IP(Internet Protocol):网际协议 IP协议是用于将多个包交换网络连接起来的,它在源地址和目的地址之间传送一种称之为数据包的 ...

  7. 计算机网络(OSI、TCP/IP、网络协议、常见网络设备工作原理)

    目录 OSI模型 TCP/IP模型 网络协议 IP协议 IP数据报格式 IP数据报分片 IPv4地址 NAT协议 ARP/RARP协议 ARP RARP DHCP协议 ICMP协议 ICMP差错报告报 ...

  8. TCP/IP篇(1)--协议模型

    TCP/IP参考模型分为四个层次:应用层.传输层.网络互连层和主机到网络层. (1)主机到网络层:实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层-网络互连层一个访问接口, ...

  9. TCP/IP通俗易懂网络协议

    昨晚在一个博主那里看懂一篇关于TCP/IP通俗易懂网络协议的文章,感觉写的非常不错,在这里就顺便做一下笔记吧.... 最简单的理解:TCP面向连接的,可靠的数据传输,建立连接需要三次握手,会造成del ...

最新文章

  1. Spring Security 实战干货:实现自定义退出登录
  2. Java Script 之 Promise
  3. python 视频转场_视频剪辑什么鬼?Python 带你高效创作短视频
  4. 在JS中如何判断undefined和null
  5. 长安渝北工厂机器人_探秘长安UNI-T生产基地 智造工厂机器人24小时不休
  6. linux 字符转int,如何在Linux内核中将char []字符串转换为int?
  7. matlab strfind用法,findstr和strfind区别
  8. c#XML的基本使用
  9. 算法中的算子是什么意思,图像处理一样理解
  10. 小于等于0_从0开始学ARMARM汇编指令其实很简单
  11. Bailian3244 跳水比赛【水题】
  12. c# 的多页打印 [用 PrintDocument 不用水晶报表]
  13. BZOJ4152 AMPPZ2014 The Captain 【最短路】【贪心】*
  14. 这才叫会PS,普通照片分分钟P成好莱坞海报!
  15. creo绘图属性模板_creo绘图属性
  16. 相机标定——标定图片拍摄规范
  17. 拥有百万粉丝的大牛讲述学Android的历程程。看看你缺了哪些?
  18. centos8搭建ftp虚拟用户登录
  19. 数据结构(一)--ArrayList and LinkerList
  20. 嘀嗒出行再闯IPO:千军万马我无懈

热门文章

  1. UnityShader之毛绒绒效果
  2. msysgit简单使用教程
  3. SEO点击软件是否对网站排名有帮助
  4. 如何判断一个用户是否在O365上还是本地Exchange服务器上
  5. c语言ceiling的使用方法,C# Math.Ceiling()用法及代码示例
  6. 7-3 城市间紧急救援(Dijkstra)
  7. restTemplate接受文件流
  8. 【u-boot】u-boot源码分析笔记(06)| 启动过程中的gd分析
  9. 谷歌chrome浏览器扩展Fatkun图片批量下载
  10. SQL 多表联合查询,收藏直接起飞!