ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

工业通信基础——认识通信的本质(C# 视角)

工业通信基础——认识通信的本质(C# 视角)

工业通信基础——认识通信的本质(C# 视角)

一、通信的本质是什么?

通信 = 数据 + 传输 + 约定

任何一次通信,本质上都是三件事:

  1. 发送方把某些数据(0/1 比特流)变成物理信号发出去
  2. 接收方从物理信号里还原出数据
  3. 双方事先约定好:这串比特到底代表什么(协议)

用一句话概括:

通信的本质,是在两个独立系统之间,按照约定好的规则,可靠地搬运字节。

工业通信和普通网络通信没有本质区别,只是更强调实时性、可靠性、确定性。


二、从"字节"到"含义"的三层认知

层次关心什么举例
物理层电平、波形、光电RS-485 差分、以太网 PHY
传输层怎么把字节搬过去串口、TCP、UDP
应用层字节代表什么Modbus、Profinet、OPC UA

关键认知:串口/TCP 只负责搬字节,不负责含义。含义由协议定义。

这就是为什么你打开串口只看到一堆01 03 00 00 00 01—— 通信本身没问题,是你还没"翻译"它。


三、用 C# 亲手感受"通信"

1. 最小通信单元:一个字节的旅程

// 发送方:把一个字节变成信号bytedata=0x55;// 0101 0101// 经过 UART/网卡 → 变成电平/光/电磁波 → 传到对面// 接收方:把信号还原成字节bytereceived=0x55;

通信框架帮你做的,就是把这句"变成信号"和"还原信号"封装起来。

2. 串口通信(工业最基础)

usingSystem.IO.Ports;varport=newSerialPort("COM3",9600,Parity.None,8,StopBits.One);port.Open();// 发一个字节port.Write(newbyte[]{0x01},0,1);// 收一个字节intb=port.ReadByte();Console.WriteLine($"收到: 0x{b:X2}");port.Close();

注意:ReadByte读到的只是一个数字。它是什么含义?不知道。这就是"字节 ≠ 含义"。

3. TCP 通信(工业以太网基础)

usingSystem.Net.Sockets;// 服务端varlistener=newTcpListener(System.Net.IPAddress.Any,502);listener.Start();varclient=awaitlistener.AcceptTcpClientAsync();varstream=client.GetStream();byte[]buffer=newbyte[1024];intn=awaitstream.ReadAsync(buffer,0,buffer.Length);Console.WriteLine($"收到{n}字节:{BitConverter.ToString(buffer,0,n)}");

TCP 保证:字节按顺序、不丢、不重。但它不保证这些字节是什么意思——那是 Modbus 的事。


四、通信的四个核心问题

任何工业通信协议,都在解决这四个问题:

1. 寻址:发给谁?

  • 串口:站号(Modbus 从站地址)
  • 网络:IP + 端口
  • 现场总线:设备地址

2. 同步:从哪开始、到哪结束?

  • 串口:起始位/停止位、帧头帧尾
  • TCP:靠 TCP 自身分节
  • 自定义协议:AA 55 ... 校验 ... 0D 0A

3. 校验:传对了吗?

  • 奇偶校验、CRC16、校验和
  • 工业现场电磁干扰大,校验是刚需

4. 时序:什么时候能发?

  • 请求-应答(Modbus)
  • 周期广播(EtherCAT)
  • 令牌环(旧 Profibus)

五、一个完整的"本质"示例:手搓一个协议

假设我们要在 C# 里定义一个最简协议,把"字节"变成"含义":

// 协议约定: [0xAA][地址][功能][数据Hi][数据Lo][CRC][0x55]publicclassSimpleFrame{publicbyteAddress{get;set;}publicbyteFunction{get;set;}publicushortData{get;set;}publicbyte[]Encode(){varbody=newbyte[]{0xAA,Address,Function,(byte)(Data>>8),(byte)(Data&0xFF)};bytecrc=Crc8(body);returnbody.Concat(new[]{crc,0x55}).ToArray();}privatestaticbyteCrc8(byte[]data){bytecrc=0;foreach(varbindata)crc^=b;returncrc;}}

发送:

varframe=newSimpleFrame{Address=0x01,Function=0x03,Data=100};port.Write(frame.Encode(),0,7);

接收端解析:

// 收到 7 字节后if(buf[0]==0xAA&&buf[6]==0x55&&Crc8(buf.Take(5).ToArray())==buf[5]){ushortvalue=(ushort)((buf[3]<<8)|buf[4]);Console.WriteLine($"站{buf[1]}功能{buf[2]}数据{value}");}

这一刻,字节终于有了含义。这就是通信的本质被"显式"实现出来的样子。


六、认知升级:工业通信为什么"难"

普通通信工业通信
慢一点没关系必须确定性(周期抖动 < 1ms)
丢包重传很多场景不允许重传(运动控制)
通用协议专用协议(Modbus/Profinet/EtherCAT/OPC UA)
软件工程师搞定需要懂电气、EMC、实时性

所以在 C# 里做工业通信,你通常要面对:

  • 同步:lock、SemaphoreSlim保护串口/TCP
  • 超时:CancellationToken+Task.WhenAny
  • 粘包/拆包:TCP 是流,必须自己按帧切
  • 异常恢复:断线重连、心跳

七、总结:通信本质的一句话

通信 = 用约定的帧格式,把字节可靠地从 A 搬到 B,并让双方对"这些字节代表什么"达成一致。

  • 串口/TCP 解决"搬字节"
  • 协议解决"字节的含义"
  • C# 是你的工具,帮你把这两件事代码化

下一步建议:

  1. 用 C# 写一个 Modbus RTU 客户端(串口)
  2. 再用 C# 写一个 Modbus TCP 客户端(网络)
  3. 对比两者:同样的功能码,不同的搬运方式

你会瞬间理解"通信本质"——协议不变,传输可变。

返回列表