当前位置: 首页 > news >正文

<.Net>VisaulStudio2022下用VB.net实现socket与汇川PLC进行通讯案例(Eazy521)

前言
此前,我写过一个VB.net环境下与西门子PLC通讯案例的博文:
VisaulStudio2022下用VB.net实现socket与西门子PLC进行通讯案例(优化版)
最近项目上会用到汇川PLC比较多,正好有个项目有上位机通讯需求,于是就自己这边先测试了一下汇川PLC和上位机通过socket进行数据通讯。

配置:
平台:windows
工具:visual studio 2022
语言:VB.net
通讯协议:socket
PLC型号:汇川Eazy521系列
固件版本:6.1.2.0
PLC软件:汇川Autoshop V4.8.2.4

其实,与PLC进行通讯来说,上位机侧的程序几乎不用改变,主要是PLC端的使用有些不同,像西门子、信捷的PLC,在进行socket通讯时,虽然使用协议都是一样的,但不同厂家,其编程指令和PLC程序写出来是不一致的,其中还涉及数据类型的转换。

本篇将侧重于介绍汇川PLC这边的设置及编程,上位机将在之前的基础上稍作修改。

一、PLC侧设置

汇川PLC进行socket协议通讯的指令,在它的工具箱-通讯指令-以太网指令下:
在这里插入图片描述
大致介绍下指令:
1、TCP_listen:PLC作为服务器端时,监听客户端指令
2、TCP_accept:PLC作为服务器端时,在开启了监听模式后,用于监测客户端的连接指令。如果检测到有客户端请求连接,则会产生一个connected_socket,并存储在队列里,这个connected_socket就是客户端的请求,后面的收发数据,都用它进行。
3、TCP_connect:PLC作为客户端时,与服务器连接的指令。
4、TCP_receive:当连接成功建立后,使用此指令从远程设备接收数据。
5、TCP_send:同上,发送数据。
6、TCP_close:用于关闭监听或者连接。

下面,以PLC作为服务器端为例,来说明一下指令具体如何使用:

1、TCP_listen:

在这里插入图片描述
如上图,这个指令的触发位Execute,其实使用上升沿脉冲即可,当触发后,Active位会变成ON。
其中,左侧的socket接口,根据汇川官方文档,是应该填写sSocekt数据类型的,详细如下:
在这里插入图片描述
但是目前Autoshop软件中目前还不支持自定义这种数据类型,所以要用INT[20]数组来代替,实例中如下:
在这里插入图片描述
port接口是填写本地端口后,可以直接填写常数,如2000,在PLC中表示为K2000,即十进制2000。也可以使用变量,只要将数据类型设置为DINT即可。但官方文档有提示,尽量不要使用特殊端口号,如502。
至于右侧的其他状态位如buzyerrorerrorid,只要监控指令运行状态的,按照数据类型,分配个变量就行了,后面的其他指令,都会有这些变量,就不再多做说明。

2、TCP_accept:

在这里插入图片描述
当监听开启后,就需要用accept来监测客户端的连接请求。
如上图,这个指令左侧有一个ListeningSocket参数,这里填写和TCP_listen指令一样的数据即可。
其右侧有一个Connected位,如果客户端发起了连接请求,且无故障,那么这个位将会变为ON。同时,右侧还有一个Connected_socket参数,这个参数也是sSocket类型,此处也是用INT[20]数组来代替。但要注意,这个和TCP_listen不能是同一个,这个相当于是服务器端监听到了客户端,产生的客户端反馈。
accept指令可以多次使用,以接收多个客户端的连接。本例只按照一个客户端连说明。

3、TCP_receive:

在这里插入图片描述
此指令用于接收远程设备(本例中就是客户端)发送的数据,其左侧接口有一个Socket参数,此处填写前面accept指令右侧的Connected_socket一样的数据即可。
接着是Buffer,即数据接收过来,存放在哪里?
你可以自己新建一个buffer区,buffer区是一个连续数组,汇川PLC支持两种数据类型:
INT[0…n]或者Byte[0…n],使用哪种看自己需要,一般常用byte即可。
接下来是Size参数,因为我们不一定需要所有发送过来的数据,所以可设置接收数据长度,但要注意,Size的值不能超过buffer区的大小。
右侧参数,done代表指令接收完成,可以使用这个状态位来编写一些逻辑程序,如数据传送等。
还有一个ReceivedSize参数,表示实际接收的数据长度,虽然设置了数据接收长度,但发过来的数据可能小于设置值,比如设置了10字节,但发送过来的只有2个字节,这个长度就是实际长度,会显示在ReceivedSize中。

4、TCP_send:

在这里插入图片描述
此指令用于发送数据,与TCP_receive指令类似,其左侧的Socket参数,填写accept指令右侧的Connected_socket一样的参数。
buffer填写自定义的发送数据缓冲区,Size为发送长度,右侧的sentsize标识实际发送的数据长度。

5、TCP_close:

在这里插入图片描述
关闭指令非常简单,用于关闭socket连接,但要注意,本例是将PLC作为服务器端,所以关闭连接时,除了要关闭服务器的监听socket,还需要关闭客户端的请求socket(假如已成功建立连接)。

以上就是汇川PLC端的程序编写,汇川的官方文档也给了示例,但实际使用时,会涉及数据转换问题,这里提一个注意点:
我这边使用时,需要在PLC这边将浮点数(32位)发送到上位机,但我们在前面说了,TCP_send的buffer区只能是Byte[]或者INT[]这两种,所以,就需要将浮点数先转为整数类型或者字节类型。
但是,如果你直接使用汇川的INT或者DINT这个指令,它会将浮点数转换为四舍五入后的整数,并不是真正的无损转换。
我在指令文档找了半天,才发现汇川要实现将浮点数完全转换为字节,需要使用MCPY这个指令。
官方解释:

该指令是较为高阶的应用,需谨慎使用!
该指令是数据复制操作,数据本身无变化,可以实现内存复制拷贝;如果使用巧妙,可以实现类型变换的操
作。
n是待复制的数据的长度,以字节为单位,比如,两个16位数据赋值给一个32位数据,n=4;把两个32位整
数,复制给同样大小的结构体或16位整数数组,n=8;
当操作数S或D为位元件时,位元件的地址必须按字节对齐,否则会发生寻址错误;例如,MCPY M1 M15
K1,会报“无效变量地址,访问的变量不存在”错误。

实际应用:
在这里插入图片描述
这样转换后的数据,在通过socket发送到上位机后,上位机端使用字节转浮点指令,如python中可以使用:

data_float=struct.unpack('f',datarecv[0:4])[0] 

转换后和PLC发送的数据是一致的。

二、上位机侧程序

在这里插入图片描述
上位机侧采用的是VB.net语言编写,其中socket通讯方面使用的是System.Net.Sockets库,直接导入即可:

Imports System.Net.Sockets  

说一下几个关键步骤:
1、socket连接

   Private Sub socket_client_connect()        Tryip = IPAddress.Parse(TextBox1.Text)port = Integer.Parse(TextBox2.Text)ipe = New IPEndPoint(ip, port)soc_client.Connect(ipe)Console.WriteLine("connect ok")If soc_client.Connected Then'如果连接成功,状态变为绿色huayuan(PictureBox1, Color.LimeGreen)'如果连接成功,则启动数据接收,为了防止阻塞线程,采用新线程Dim th1 As New Thread(AddressOf socket_client_recvievedata)  '多线程th1.Start()                               '线程启动,防止socket阻塞End IfCatch ex As ExceptionConsole.WriteLine(ex.Message)MsgBox(ex.Message + vbCrLf +"请检查IP设置或目标PLC是否保持通讯正常?",MsgBoxStyle.OkOnly, "tips!")End TryEnd Sub

使用socket.connect()函数向服务器发送连接请求,可以使用socket.connected状态位来判断连接是否成功。

2、socket接收

 Private Sub socket_client_recvievedata()  '定义接收区字节数组Dim recbyt(1024) As Byte'循环接收While TrueTryDim reclength = soc_client.Receive(recbyt, 200, SocketFlags.None)'recvdata = Encoding.GetEncoding("gb2312").GetString(recbyt)Dim tt1 As Test_data'recvdata = Encoding.ASCII.GetString(recbyt, 0, 30)'以下是对所接收的所有数据进行解析,可以根据实际情况变化'下面的仅作为参考'ax1.axis_status = BitConverter.ToInt16(recbyt, 0)'ax1.axis_xunhuanmoshi = BitConverter.ToInt16(recbyt, 2)'ax1.axis_runing = BitConverter.ToInt16(recbyt, 4)'ax1.axis_error = BitConverter.ToInt16(recbyt, 6)Console.WriteLine(reclength.ToString())'tt1.test1 = Encoding.GetEncoding("utf-8").GetString(recbyt)'tt1.test2 = Encoding.GetEncoding("utf-8").GetString(recbyt)tt1.temp_float1 = BitConverter.ToSingle(recbyt, 0)'Console.WriteLine(recdata1)'将解析的数据通过委托的方式传递给主线程,以更新主线程的UIDim socket_invoke_1 As New socket_invoke(AddressOf socket_recv_data_invoke)Me.Invoke(socket_invoke_1, tt1)Catch ex As ExceptionExit SubMsgBox(ex.Message, MsgBoxStyle.OkOnly, "tips!")End TryEnd WhileEnd Sub

接收数据使用socket.receive(),为了循环接收,可以使用while指令,但是如果直接使用,会阻塞主线程即UI,所以最好在新线程中使用。注意上述代码中的后面几行:

'将解析的数据通过委托的方式传递给主线程,以更新主线程的UI
Dim socket_invoke_1 As New socket_invoke(AddressOf socket_recv_data_invoke) Me.Invoke(socket_invoke_1, tt1)

此处采用的是.Net中的委托,即为了不阻塞主线程,我们采用委托的形式,将socket循环接收的数据发送给UI,这样既可以传送数据,又不会阻塞线程。

3、socket发送数据
发送数据则非常简单,使用socket.send()即可。

  Private Sub socket_client_senddata()   TryIf soc_client.Connected Thensoc_client.Send(sendbytes_client, 200, SocketFlags.None)End IfCatch ex As ExceptionMsgBox(ex.Message, MsgBoxStyle.YesNoCancel, "tips!")End TryEnd Sub

视频演示

汇川PLC与上位机通讯演示

相关文章:

<.Net>VisaulStudio2022下用VB.net实现socket与汇川PLC进行通讯案例(Eazy521)

前言 此前,我写过一个VB.net环境下与西门子PLC通讯案例的博文: VisaulStudio2022下用VB.net实现socket与西门子PLC进行通讯案例(优化版) 最近项目上会用到汇川PLC比较多,正好有个项目有上位机通讯需求,于是…...

漫途桥梁结构安全监测方案,护航桥梁安全!

桥梁作为城市生命线的重要组成部分,承载着城市交通、物流输送、应急救援等重要职能。然而,随着我国社会经济的飞速发展,桥梁所承载的交通流量逐年增长,其安全性所面临的挑战亦日益严峻。例如恶劣的外部环境、沉重的荷载以及长期使…...

LAMP架构部署--yum安装方式

这里写目录标题 LAMP架构部署web服务器工作流程web工作流程 yum安装方式安装软件包配置apache启用代理模块 配置虚拟主机配置php验证 LAMP架构部署 web服务器工作流程 web服务器的资源分为两种,静态资源和动态资源 静态资源就是指静态内容,客户端从服…...

关于PXIE3U18槽背板原理拓扑关系

如今IT行业日新月异,飞速发展,随之带来的是数据吞吐量的急剧升高。大数据,大存储将成为未来数据通信的主流,建立快速、大容量的数据传输通道将成为电子系统的关键。随着集成技术和互连技术的发展,新的串口技术&#xf…...

网络安全等保测评指标一览表

什么是等保? 等保是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安全事件分等级响应、处…...

C语言中函数的递归

在C语言中,递归是一种解决问题的方法,其中函数直接或间接地调用自身来解决问题。递归通常用于解决那些可以分解为更小、更简单的同类问题的问题。递归有两个关键部分:基本情况(base case)和递归情况(recurs…...

01|模型IO:输入提示、调用模型、解析输出

Model I/O 可以把对模型的使用过程拆解成三块,分别是输入提示(对应图中的Format)、调用模型(对应图中的Predict)和输出解析(对应图中的Parse)。这三块形成了一个整体,因此在LangCha…...

Android Studio实现内容丰富的安卓民宿酒店预订平台

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看民宿 3.民宿预订 4.民宿预订支付, 5.支付订单 6.评论管…...

SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程…...

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.03.10-2024.03.15

论文目录~ 1.3D-VLA: A 3D Vision-Language-Action Generative World Model2.PosSAM: Panoptic Open-vocabulary Segment Anything3.Anomaly Detection by Adapting a pre-trained Vision Language Model4.Introducing Routing Functions to Vision-Language Parameter-Efficie…...

路由器端口转发远程桌面控制:一电脑连接不同局域网的另一电脑

一、引言 路由器端口转发:指在路由器上设置一定的规则,将外部的数据包转发到内部指定的设备或应用程序。这通常需要对路由器进行一些配置,以允许外部网络访问内部网络中的特定服务和设备。端口转发功能可以实现多种应用场景,例如远…...

sparksession对象简介

什么是sparksession对象 spark2.0之后,sparksession对象是spark编码的统一入口对象,通常我们在rdd编程时,需要SparkContext对象作为RDD编程入口,但sparksession对象既可以作为RDD编程对象入口,在sparkcore编程中可以通…...

2、Java虚拟机之类的生命周期-连接(验证、准备、解析)

一、类的生命周期 连接阶段之验证 连接阶段的第一个环节是验证&#xff0c;验证的主要目的是检测Java字节码文件是否遵守了<Java虚拟机规范>中的约束。这个阶段一般是不需要程序员进行处理。 主要包含如下四个部分,具体详见<<Java虚拟机规范>>: 1、文件格…...

IPD集成产品开发:塑造企业未来竞争力的关键

随着市场竞争的日益激烈&#xff0c;企业对产品开发的要求也越来越高。如何在快速变化的市场环境中&#xff0c;既保证产品的批量生产效率&#xff0c;又满足客户的个性化需求&#xff0c;成为了企业面临的重要挑战。IPD&#xff08;集成产品开发&#xff09;模式&#xff0c;作…...

一个可商用私有化部署的基于JAVA的chat-gpt网站

目录 介绍一、核心功能1、智能对话2、AI绘画3、知识库4、一键思维导图5、应用广场6、GPTS 二、后台管理功能1、网站自定义2、多账号登录支持3、商品及会员系统4、模型配置5、兑换码生成6、三方商户用户打通 结语 介绍 java语言的私有化部署的商用网站还是比较少的 这里给大家介…...

nmcli --help(nmcli -h)nmcli文档、nmcli手册

文章目录 nmcli --helpOPTION解释OBJECT解释1. g[eneral]&#xff1a;查看NetworkManager的状态2. n[etworking]&#xff1a;启用或禁用网络3. r[adio]&#xff1a;查看无线电状态&#xff08;例如&#xff0c;Wi-Fi&#xff09;4. c[onnection]&#xff1a;列出所有的网络连接…...

SpringBoot集成WebService

1&#xff09;添加依赖 <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.3.4</version><exclusions><exclusion><groupId>javax.validation<…...

C++ Qt开发:QUdpSocket网络通信组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的网络通信…...

微信小程序小白易入门基础教程1

微信小程序 基本结构 页面配置 页面配置 app.json 中的部分配置&#xff0c;也支持对单个页面进行配置&#xff0c;可以在页面对应的 .json 文件来对本页面的表现进行配置。 页面中配置项在当前页面会覆盖 app.json 中相同的配置项&#xff08;样式相关的配置项属于 app.js…...

D. Tandem Repeats? - 思维 + 双指针

题面 分析 s s s的范围很小&#xff0c;可以 O ( n 2 ) O(n^2) O(n2)&#xff0c;在规定复杂度以内来完成枚举所有子串判断是否有满足条件的最大的子串&#xff0c;可以在第一层循环枚举子串长度 d d d&#xff0c;第二层循环枚举左右端点&#xff0c;通过双指针维护区间。对长…...

第十三届蓝桥杯省赛CC++ 研究生组

蓝桥杯2022年第十三届省赛真题-裁纸刀 蓝桥杯2022年第十三届省赛真题-灭鼠先锋 蓝桥杯2022年第十三届省赛真题-质因数个数 求个数&#xff0c;则只需要计数即可。求啥算啥&#xff0c;尽量不要搞多余操作 蓝桥杯2022年第十三届省赛真题-选数异或 蓝桥杯2022年第十三届省赛真题…...

Oracle中的commit与rollback

SQL语言分为五大类&#xff1a; DDL(数据定义语言:DataDefinitionLanguage) - Create、Alter、Drop 这些语句自动提交&#xff0c;无需用Commit提交。 DQL(数据查询语言:DataQueryLanguage) - Select 查询语句不存在是否提交问题。 DML(数据操纵语言:DataManipulationLangua…...

鸿蒙Harmony应用开发—ArkTS声明式开发(画布组件:OffscreenCanvasRenderingContext2D)

使用OffscreenCanvasRenderingContext2D在Canvas上进行离屏绘制&#xff0c;绘制对象可以是矩形、文本、图片等。离屏绘制是指将需要绘制的内容先绘制在缓存区&#xff0c;然后将其转换成图片&#xff0c;一次性绘制到canvas上&#xff0c;加快了绘制速度。 说明&#xff1a; 从…...

Redis如何实现主从复制?主从复制的作用是什么?Redis集群是如何工作的?它有哪些优点和缺点?

Redis如何实现主从复制&#xff1f;主从复制的作用是什么&#xff1f; Redis的主从复制是一种数据复制机制&#xff0c;其中一个Redis实例作为主节点&#xff08;master&#xff09;&#xff0c;而其他Redis实例作为从节点&#xff08;slave&#xff09;。主从复制的实现过程如…...

【Numpy】(2)numpy对象和random模块

numpy.array对象 numpy.array 对象是 NumPy 库的核心&#xff0c;它提供了一种高效的方式来存储和操作同质数据类型的多维数组。每个 numpy.array 对象都有一系列的属性&#xff0c;这些属性提供了关于数组的重要信息。理解这些属性对于有效地使用 NumPy 和进行数据分析是非常…...

[QJS xmake] 非常简单地在Windows下编译QuickJS!

文章目录 前言准备C编译器xmake编译包 工程准备修改版本号第一遍编译第二遍编译效果 前言 quickjs是个很厉害的东西啊&#xff0c;我一直想编译一下的&#xff0c;奈何一直没成功。现在找了点时间成功编译了&#xff0c;写篇文章记录一下。当前版本&#xff1a;2024-1-13 应该…...

Ubuntu双系统/home分区扩容

一、Windows系统中利用磁盘管理分出空闲区域&#xff0c;如果多就多分一些 二、插入安装Ubuntu的U盘启动盘&#xff0c;lenovo电脑F12&#xff08;其他电脑可选择其他类似方式&#xff09;选择U盘启动项&#xff0c;然后选择ubuntu&#xff0c;出现安装界面&#xff0c;再选择t…...

0基础学习VR全景平台篇第145篇:图层控件功能

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01;这期&#xff0c;我们将为大家介绍如何使用图层控件功能。 一.如何使用图层控件功能&#xff1f; 进入作品编辑页面&#xff0c;点击左边的控件后就可以在右边进行相应设置。 二.图层控件有哪些功能&am…...

一文看懂套利的那些事儿

我们经常在投资中都有提到套利策略&#xff0c;经常听到某某套利&#xff0c;或者借用什么套利工具&#xff0c;股票可以套利&#xff0c;基金期货期权也可以套利&#xff0c;套利到底是什么&#xff1f;套利到底是如何运用的&#xff1f; 今天我们一文解读套利市场&#xff01…...

【工具】Mermaid + 大模型画流程图

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 引入使用画TCP三次握手了解历史人物 总结 引入 最近看面试文章关于TCP三次握手和…...

python开发做网站/视频专用客户端app

(Python编写的“情人节”表白软件)情人节到了&#xff0c;首先祝天下有情人终成眷属&#xff0c;Happy Valentines Day! 下面用Python制作一款非常简单的“情人节”表白软件&#xff0c;大体分为以下三个步骤&#xff1a;准备工作&#xff1a;除了Python自带的tkinter库之外&am…...

毕业设计答辩网站开发原理/关键词优化有哪些作用

点击上方蓝字关注我们之前正运动技术与大家分享了&#xff0c;运动控制器的固件升级、ZBasic程序开发、ZPLC程序开发、与触摸屏通讯和输入/输出IO的应用、运动控制器数据与存储的应用、运动控制器ZCAN、EtherCAT总线的使用等。今天&#xff0c;我们来讲解一下正运动技术运动控制…...

做系统去哪个网站好/qq群排名优化软件官网

文章目录文章参考file-loader应用场景安装案例 —— 引入字体库的配置url-loader(升级版)安装案例——图片打包file-loader 与 url-loader 的区别&#xff1f;webpack打包html里面img后src为“[object Module]”问题?文章参考 url-loader github file-loader 官方解释&…...

网站建设的概念/网站建设技术托管

展开全部回答不能插入代码格式&#xff0c;比较乱。e68a843231313335323631343130323136353331333433633433我截图给你看吧。package com.test;import javax.swing.*;import java.awt.*;public class DrawTest extends JFrame {public static void main(String[] args) {DrawTe…...

网站搜索排名优化怎么做/网络营销推广方法十种

2019独角兽企业重金招聘Python工程师标准>>> Linux mmseg 同义词/复合分词处理&#xff1a; 其基本使用状况为&#xff1a; 词库包含&#xff1a; 南京西路、南京、西路 索引时&#xff1a; 文本中的“南京西路”会被同时索引为以上三者 查询时&#xff1a; 输入南京…...

网站 做购物车/口碑营销的成功案例

在arcgis做SOE的时候,由于ArcGIS的问题,计算机名称不能是带有 "-" 的,所以在更改了计算机名后,arcGIS Server就会失效. 即打开http://localhost:8399/arcgis/rest/services 总显示404,其SOM SoCMonitor SMS(Server Manager Service) 三个服务都是打开状态的.其打开顺…...