『7x24小时有问必答』
首先,Socket  通信可以这样理解:Socket不是一种具体协议,而是应用程序使用  TCP/IPUDP/IP进行网络通信的编程接口
也就是说,TCPUDP  是通信协议;Socket  是程序调用这些协议的入口。
一、Socket到底是什么?
Socket  中文常翻译为:套接字
这个名字比较抽象,可以先用一个类比:
现实通信
网络通信
电话号码
IP地址
分机号
端口号
电话机
Socket
通话规则
TCP/UDP协议
比如:192.168.1.10:502
含义是:
IP地址:192.168.1.10端口号:502
这个组合就能定位到网络中的某个设备上的某个通信服务。
二、Socket    OSI  七层模型的关系
Socket  主要工作在:
应用层程序      ↓

Socket
接口

      ↓

TCP / UDP

      ↓

      IP

      ↓

以太网
对应  OSI  模型大概是:
<b>层级
内容
应用层
你的程序、PLC通信程序、上位机软件
传输层
TCP / UDP
网络层
IP
数据链路层
EthernetMAC
物理层
网线、光纤、电信号
所以  Socket  本身不是  OSI  的某一层协议,而是应用程序访问传输层协议的一套接口
三、Socket通信的核心三要素
一个  Socket  通信,最核心的是:IP地址  +  端口号  +  协议类型
例如:192.168.1.20 : 502 : TCP
含义是:和  192.168.1.20  这台设备的  502  端口,通过  TCP  协议通信
再比如:192.168.1.30 : 10000 : UDP
含义是:和  192.168.1.30    10000  端口,通过  UDP  协议通信
四、TCP Socket  UDP Socket  的区别
Socket  常见有两类:
TCP Socket
UDP Socket
1. TCP Socket
TCP  是面向连接的通信。
它的特点是:
先建立连接
再发送数据
最后断开连接
类似打电话:拨号  →  对方接听  →  双方通话  →  挂断
TCP Socket  特点
特点
说明
可靠
数据会确认、重传
有连接
通信前要建立连接
有顺序
数据按顺序到达
稳定
适合重要数据
开销较大
  UDP  慢一些
TCP Socket  适合场景
场景
举例
上位机和PLC通信
Modbus TCP
文件传输
FTP
数据库通信
MySQLSQL Server
MES系统通信
工位数据上传
设备状态采集
设备报警、产量、节拍
在自动化设备中,很多上位机通信、本地设备通信、机器人控制通信,都大量使用  TCP Socket
2. UDP Socket
UDP  是无连接通信。
它的特点是:不建立连接,直接发数据
类似寄快递或喊话:我把数据发出去,不一定确认你收没收到
UDP Socket  特点
特点
说明
延迟低
无连接
不需要握手
不保证可靠
可能丢包
不保证顺序
先发的不一定先到
开销小
适合实时性要求高的场景
UDP Socket  适合场景
场景
举例
实时广播
设备发现
视频流
工业相机视频流
状态广播
多设备状态同步
低延迟控制
某些实时数据传输
局域网设备搜索
扫描在线设备
工业现场中,很多设备发现、广播、实时数据采集,会用  UDP
五、Socket通信的基本流程
1. TCP服务端流程
服务端一般是等别人来连
典型流程:
创建Socket        ↓

绑定IP和端口

        ↓

监听端口

        ↓

等待客户端连接

        ↓

接收数据

        ↓

发送响应

        ↓

关闭连接
对应程序逻辑:
socket()
bind()
listen()
accept()
recv()
send()
close()
<b>2. TCP客户端流程
客户端一般是主动连接别人
典型流程:
创建Socket        ↓

连接服务器IP和端口

        ↓

发送数据

        ↓

接收响应

        ↓

关闭连接
对应程序逻辑:
socket()
connect()
send()
recv()
close()
<b>六、举一个工业现场例子:上位机读取PLC数据
假设:
PLC IP192.168.1.10
PLC端口:502
协议:Modbus TCP
上位机IP192.168.1.100
通信过程是:
上位机创建Socket           ↓

上位机连接  PLC    502  端口

           ↓

TCP
三次握手成功

           ↓

上位机发送Modbus读寄存器命令

           ↓

PLC
返回寄存器数据

            ↓

上位机解析数据
这里要注意:
Socket只负责把数据发出去和收回来
Modbus协议负责规定数据内容怎么组织
也就是说:
Socket =  运输通道
Modbus =  货物格式
<b>七、Socket  Modbus TCP  的关系
很多人容易混淆:
Socket  通信  ≠ Modbus TCP
Modbus TCP  是跑在  TCP Socket  上的一种应用层协议
可以这样理解:
Ethernet:底层网络
IP:找到哪台设备
TCP:建立可靠连接
Socket:程序调用TCP的接口
Modbus TCP:规定数据格式
Modbus TCP  报文大概是:[MBAP] + [功能码] + [地址] + [数据]
例如读保持寄存器:功能码  03
写单个寄存器:功能码  06
写多个寄存器:功能码  16
Socket  本身不关心这些功能码,它只负责发送一串字节。
八、Socket通信的本质:发送和接收字节流
Socket  通信最底层的本质是:
发送字节
接收字节
比如你发送:
01 03 00 00 00 02
对方收到以后,要根据协议解释:
01:站号
03:功能码
00 00:起始地址
00 02:读取数量
如果双方没有约定协议,Socket  收到的就只是一堆字节,没有意义。
所以工程里一定要区分:
通信通道是否正常
数据协议是否正确
这两个是不同问题。
九、Socket常见通信模式
1.  一问一答模式
最常见。
客户端:发请求
服务端:回响应
例如:
上位机读取PLC寄存器
PLC返回数据
适合:
Modbus TCP
扫码枪通信
仪表通信
MES查询
2.  长连接模式
连接建立后一直保持。
连接一次
长期收发
不断开
适合:
PLC和上位机持续通信
机器人状态实时采集
设备数据持续上传
优点:
响应快
不用反复建立连接
缺点:
要处理断线重连
要处理心跳检测
3.  短连接模式
每次通信都重新连接。
连接
发送
接收
断开
适合:
偶尔通信
低频数据上传
简单设备查询
优点:
逻辑简单
资源占用少
缺点:频繁建立连接,效率低
4.  心跳模式
长连接中非常重要。
每隔一段时间发一次心跳包
目的是判断:
对方还在不在线?
网络有没有断?
连接是不是假连接?
例如:
  1  秒发送一次状态查询
连续  3  次无响应,认为通信断开
十、Socket通信中的客户端和服务端
Socket  通信里经常有两个角色:
Server:服务端
Client:客户端
服务端
特点:
固定IP
固定端口
等待别人连接
例如:
PLC作为Modbus TCP Server
上位机作为Modbus TCP Client
客户端
特点:
主动连接服务端
主动发送请求
例如:
上位机主动连接PLC
MES主动连接设备
机器人主动连接上位机
十一、工业自动化中  Socket  的典型应用
1. PLC  与上位机通信
常见形式:
PLC作为Server
上位机作为Client
应用:
读取设备状态
写入工艺参数
采集报警信息
上传产量数据
2. PLC  与扫码枪通信
扫码枪扫到二维码后,通过  TCP Socket  或串口发送数据:
二维码内容  → Socket发送  → PLC/上位机接收
应用:
产品追溯
载具识别
工单绑定
防错检测
3.  视觉系统与PLC通信
视觉软件识别完成后,发送结果:
OK/NG
坐标X/Y/角度
二维码内容
缺陷类型
通信方式可能是:
TCP Socket
UDP Socket
Modbus TCP
EtherNet/IP
Profinet
4.  机器人与上位机通信
例如机器人需要接收上位机下发的目标点:
X=120.5
Y=80.2
Z=30.0
R=45.0
Socket  用来传输这些数据。
5.  设备与MES通信
设备把数据上传到MES
设备编号
产品SN
测试结果
时间戳
报警代码
生产节拍
MES返回:
是否允许生产
工艺参数
产品型号
工单信息
十二、Socket通信常见问题
1. Ping通,但Socket连不上
这很常见。
说明:网络层是通的,但传输层可能有问题
可能原因:
端口没开
服务端程序没启动
防火墙拦截
IP对了但端口错了
服务端只允许指定客户端连接
对应  OSI
Ping:主要看L3网络层
Socket连接:看L4传输层和应用服务
2. Socket能连上,但没有数据
可能原因:
协议格式不对
对方等你先发
双方都在等对方发
报文结束符不对
编码格式不对
数据长度不对
例如扫码枪常见问题:
扫码枪发送字符串后需要加  \r\n
但接收端没有按  \r\n  解析
3.  数据粘包
TCP  是字节流协议,不是消息包协议。
这句话非常重要。
比如你发送两次:
发送1ABC
发送2DEF
接收方可能一次收到:ABCDEF
也可能分两次收到:
AB
CDEF
所以  TCP Socket  通信必须设计数据边界。
常见解决方法:
方法
示例
固定长度
每条消息固定64字节
分隔符
每条消息以  \r\n  结束
长度头
4个字节表示后面数据长度
标准协议
Modbus TCPHTTP
4.  连接突然断开
可能原因:
网线松动
交换机异常
对方程序崩溃
设备重启
网络超时
防火墙断开空闲连接
工程上必须做:
断线检测
自动重连
心跳机制
异常日志
十三、Socket调试常用工具
工业现场常用:
工具
用途
Ping
IP是否通
Telnet
测端口是否通
NetAssist
TCP/UDP调试
SocketTool
Socket测试
Wireshark
抓包分析
Modbus Poll
Modbus TCP测试
Modbus Slave
模拟Modbus设备
现场排查顺序建议:
Ping
再测端口
再用Socket工具连
再抓包
最后分析协议内容
十四、最小C# Socket通信示例
1. TCP服务端示例
using System;using System.Net;

using System.Net.Sockets;

using System.Text;

class TcpServerDemo

{

static void Main()

       {

             TcpListener server = new TcpListener(IPAddress.Any, 9000);

             server.Start();

             Console.WriteLine("TCP Server started on port 9000...");

             TcpClient client = server.AcceptTcpClient();

             Console.WriteLine("Client connected.");

             NetworkStream stream = client.GetStream();

             byte[] buffer = new byte[1024];

             int length = stream.Read(buffer, 0, buffer.Length);

             string received = Encoding.ASCII.GetString(buffer, 0, length);

             Console.WriteLine("Received: " + received);

             byte[] response = Encoding.ASCII.GetBytes("OK\r\n");

             stream.Write(response, 0, response.Length);

             client.Close();

             server.Stop();

       }

}
<b>2. TCP客户端示例
using System;using System.Net.Sockets;

using System.Text;

class TcpClientDemo

{

static void Main()

       {

             TcpClient client = new TcpClient();

            client.Connect("192.168.1.10", 9000);

             NetworkStream stream = client.GetStream();

             byte[] data = Encoding.ASCII.GetBytes("HELLO\r\n");

             stream.Write(data, 0, data.Length);

             byte[] buffer = new byte[1024];

             int length = stream.Read(buffer, 0, buffer.Length);

             string response = Encoding.ASCII.GetString(buffer, 0, length);

             Console.WriteLine("Response: " + response);

             client.Close();

       }

}
这个例子里:
服务端监听9000端口

客户端连接服务端9000端口

客户端发送HELLO

服务端返回OK
<b>十五、工程上设计Socket通信,必须考虑这些问题
1.  报文格式
必须明确:
一条消息从哪里开始?
到哪里结束?
包含哪些字段?
字段长度是多少?
用什么编码?
比如:<stx>SN=ABC123;RESULT=OK;<etx>
或者:长度头  +  命令字  +  数据区  +  校验
2.  超时时间
必须设计:
连接超时
发送超时
接收超时
响应超时
例如:
连接超时:3
读取超时:1
心跳周期:1
连续3次失败判定断线
3.  异常处理
必须处理:
连接失败
对方断开
接收为空
数据格式错误
超时无响应
端口被占用
4.  日志记录
工业设备里,Socket日志非常重要。
建议记录:
连接时间
断开时间
发送内容
接收内容
异常信息
重连次数
通信耗时
否则现场出了问题,很难追溯。
十六、Socket通信和工业总线的区别
对比项
Socket通信
EtherCAT / Profinet / CANopen
本质
通用网络编程接口
工业通信协议/现场总线
实时性
一般
更强
开放性
依赖协议栈/设备
使用难度
灵活但要自己定义协议
标准化更强
典型场景
上位机、扫码枪、MES、视觉
伺服、IO、运动控制
数据结构
自己定义或基于协议
通常由协议规定
一句话:Socket适合做设备之间的普通数据交互;实时运动控制更适合  EtherCATProfinet IRTCANopen  等工业总线。
十七、最终总结
Socket通信可以归纳为一句话:Socket  是程序进行网络通信的接口,它通过  IP  地址找到设备,通过端口号找到应用服务,通过  TCP/UDP  完成数据传输。
在自动化设备里,Socket非常常见,尤其用于:
PLC  上位机
PLC  视觉软件
PLC  扫码枪
设备    MES
机器人    PC控制软件
设备  设备
但是做工程时一定要记住:
Socket只解决数据怎么传
协议解决数据是什么意思
程序逻辑解决收到后怎么处理
这三件事不要混在一起。

---

往期热门文章:
</etx></stx></b></b></b></b></b></b>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码