3、上位机通信协议:串口RS232/485配置、Modbus RTU指令解析、TCP/IP Socket编程基础
通信协议这东西,说白了就是设备和电脑之间约定好的「暗号」。你发一串字节过去,对方知道什么意思;对方回一串数据过来,你能正确解析。我刚开始做激光控制那会儿,最头疼的就是通信调不通——明明线接对了,波特率也设了,就是收不到数据。后来才发现,是校验位搞错了。
这一章,咱们就把上位机通信的三大件讲透:串口、Modbus、Socket。你把这些吃透了,激光控制系统的「神经」就算接上了。
3.1 串口RS232/485配置
串口通信,工业控制里最基础也最常用的方式。激光控制器大多都带串口接口,要么是RS232,要么是RS485。
3.1.1 RS232 vs RS485,怎么选?
我个人的习惯是:距离短、一对一,用RS232;距离长、多设备,用RS485。你想想看,RS232最远也就传15米左右,而且只能点对点。RS485就不一样了,最远能到1200米,还能挂32个设备。
| 参数 | RS232 | RS485 |
|---|---|---|
| 传输距离 | 约15米 | 约1200米 |
| 通信方式 | 全双工 | 半双工 |
| 节点数量 | 1对1 | 最多32个节点 |
| 抗干扰能力 | 较弱 | 强(差分信号) |
| 典型应用 | 近距离调试 | 现场总线、多轴控制 |
3.1.2 串口参数配置
配置串口,核心就五个参数:波特率、数据位、停止位、校验位、流控。激光控制器常用的配置是:9600-8-N-1,也就是波特率9600,8位数据,无校验,1位停止位。
嗯,这里要注意:波特率必须和设备完全一致,差一点都不行。我曾经遇到过一台设备,手册上写的是19200,结果实际是38400,折腾了我一上午。
// C# 串口配置示例
SerialPort laserPort = new SerialPort();
laserPort.PortName = "COM3"; // 端口号,看设备管理器
laserPort.BaudRate = 9600; // 波特率
laserPort.DataBits = 8; // 数据位
laserPort.StopBits = StopBits.One; // 停止位
laserPort.Parity = Parity.None; // 校验位
laserPort.Handshake = Handshake.None; // 无流控
try
{
laserPort.Open();
Console.WriteLine("串口打开成功");
}
catch (Exception ex)
{
Console.WriteLine("打开失败:" + ex.Message);
}
3.2 Modbus RTU指令解析
Modbus是工业控制领域的事实标准。激光控制器、PLC、变频器,几乎都支持。Modbus RTU是串口版,用二进制传输,效率高。
3.2.1 Modbus RTU报文结构
一条完整的Modbus RTU指令,长这样:
| 地址码 | 功能码 | 数据区 | CRC校验 |
| 1字节 | 1字节 | N字节 | 2字节 |
举个例子,读取激光器的当前功率:
- 地址码:0x01(设备地址,激光器设为1)
- 功能码:0x03(读取保持寄存器)
- 数据区:0x00 0x64 0x00 0x01(从地址0x0064开始,读1个寄存器)
- CRC校验:0x84 0x0A(低字节在前)
所以完整的发送报文是:01 03 00 64 00 01 84 0A
3.2.2 常用功能码
| 功能码 | 含义 | 激光控制中的应用 |
|---|---|---|
| 0x03 | 读取保持寄存器 | 读取当前功率、温度、状态 |
| 0x06 | 写单个寄存器 | 设置功率、开启/关闭激光 |
| 0x10 | 写多个寄存器 | 批量设置参数 |
3.2.3 指令解析实战
假设激光器返回了这样一串数据:01 03 02 03 E8 79 8A
我们来拆解一下:
- 01:设备地址
- 03:功能码(读取成功)
- 02:数据长度(2个字节)
- 03 E8:数据值,换算成十进制是1000,表示功率1000W
- 79 8A:CRC校验
// C# Modbus RTU 解析示例
byte[] response = new byte[] { 0x01, 0x03, 0x02, 0x03, 0xE8, 0x79, 0x8A };
// 提取数据
int power = (response[3] << 8) | response[4]; // 0x03E8 = 1000
Console.WriteLine($"当前功率:{power}W");
3.3 TCP/IP Socket编程基础
现在很多新型激光控制器都支持以太网通信了。相比串口,TCP/IP的优势很明显:速度快、距离远、可以跨网络。说白了,你坐在办公室就能控制车间里的激光器。
3.3.1 Socket通信模型
TCP Socket编程,核心就是「客户端-服务器」模型。激光控制器通常是服务器端,上位机是客户端。
// C# TCP客户端示例
using System.Net.Sockets;
using System.Net;
TcpClient client = new TcpClient();
try
{
// 连接激光控制器(IP: 192.168.1.100, 端口: 502)
client.Connect("192.168.1.100", 502);
NetworkStream stream = client.GetStream();
// 发送指令(Modbus TCP格式)
byte[] command = new byte[]
{
0x00, 0x01, // 事务标识符
0x00, 0x00, // 协议标识符
0x00, 0x06, // 数据长度
0x01, // 单元标识符
0x03, // 功能码
0x00, 0x64, // 起始地址
0x00, 0x01 // 寄存器数量
};
stream.Write(command, 0, command.Length);
// 接收响应
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
Console.WriteLine($"收到 {bytesRead} 字节数据");
stream.Close();
client.Close();
}
catch (Exception ex)
{
Console.WriteLine("连接失败:" + ex.Message);
}
3.3.2 串口 vs 以太网,怎么选?
我个人建议:
- 单台设备、近距离:用串口,简单可靠
- 多台设备、远距离、大数据量:用以太网
- 现场干扰严重:用以太网,光纤隔离更好
3.4 本章知识体系
下面这张图,把本章的核心逻辑串起来了。你一看就明白:
说白了,串口是物理层,Modbus是应用层协议,Socket是网络层接口。你搞清楚了这三者的关系,激光控制系统的通信部分就稳了。
- 串口配置记住「9600-8-N-1」,这是激光控制器的标配
- Modbus RTU指令一定要算CRC,不然设备不理你
- TCP编程注意粘包,加个简单的帧头帧尾就能解决
好了,这一章就到这里。代码示例都是我在项目中实际用过的,你直接拿去改改就能用。下一章咱们聊激光器的参数配置,到时候见。
公众号:蓝海资料掘金营,微信deep3321