<.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。
至于右侧的其他状态位如buzy,error,errorid,只要监控指令运行状态的,按照数据类型,分配个变量就行了,后面的其他指令,都会有这些变量,就不再多做说明。
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行业日新月异,飞速发展,随之带来的是数据吞吐量的急剧升高。大数据,大存储将成为未来数据通信的主流,建立快速、大容量的数据传输通道将成为电子系统的关键。随着集成技术和互连技术的发展,新的串口技术…...
网络安全等保测评指标一览表
什么是等保? 等保是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安全事件分等级响应、处…...
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虚拟机之类的生命周期-连接(验证、准备、解析)
一、类的生命周期 连接阶段之验证 连接阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了<Java虚拟机规范>中的约束。这个阶段一般是不需要程序员进行处理。 主要包含如下四个部分,具体详见<<Java虚拟机规范>>: 1、文件格…...

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

一个可商用私有化部署的基于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]:查看NetworkManager的状态2. n[etworking]:启用或禁用网络3. r[adio]:查看无线电状态(例如,Wi-Fi)4. c[onnection]:列出所有的网络连接…...

SpringBoot集成WebService
1)添加依赖 <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图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QUdpSocket组件实现基于UDP的网络通信…...

微信小程序小白易入门基础教程1
微信小程序 基本结构 页面配置 页面配置 app.json 中的部分配置,也支持对单个页面进行配置,可以在页面对应的 .json 文件来对本页面的表现进行配置。 页面中配置项在当前页面会覆盖 app.json 中相同的配置项(样式相关的配置项属于 app.js…...
D. Tandem Repeats? - 思维 + 双指针
题面 分析 s s s的范围很小,可以 O ( n 2 ) O(n^2) O(n2),在规定复杂度以内来完成枚举所有子串判断是否有满足条件的最大的子串,可以在第一层循环枚举子串长度 d d d,第二层循环枚举左右端点,通过双指针维护区间。对长…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...