news 2026/7/16 3:46:02

C#上位机与汇川全系列PLC走ModbusTCP通信实例源码 C#上位机读写PLC案例,TCP...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#上位机与汇川全系列PLC走ModbusTCP通信实例源码 C#上位机读写PLC案例,TCP...

C#上位机与汇川全系列PLC走ModbusTCP通信实例源码 C#上位机读写PLC案例,TCP通信,通讯部分封装成类,没有加密,都是源码,注释齐全,纯源码,此版本支持汇川全系列PLC的ModebusTCP通讯的读写操作。 C# socket编程 上位机一键修改plc参数 汇川TCP/UDP socket通讯示例,亲测可用,适合学习 通讯相关程序写成库,都是源码,可以直接复用 关键代码注释清晰 支持汇川全系列plc的modbusTCP通讯, 可以导入导出变量表

搞工控的朋友们应该都懂,自己动手撸一套稳定可靠的PLC通讯程序有多酸爽。最近刚好用C#给汇川全系PLC做了个ModbusTCP通讯库,实测能跑在H3U/H5U/AM400这些机型上,今天就把裤裆里的干货掏出来给大家瞧瞧。

先上点硬货,整个通讯核心就封装在这个HCPLCClient类里。咱不玩虚的,直接看连接部分的代码:

public class HCPLCClient : IDisposable { private Socket _socket; private string _ip; private int _port; private bool _isConnected; // 心跳包间隔(秒) private const int HeartbeatInterval = 5; private Timer _heartbeatTimer; public bool Connect(string ip, int port = 502) { try { _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _socket.Connect(new IPEndPoint(IPAddress.Parse(ip), port)); // 启动心跳线程 _heartbeatTimer = new Timer(HeartbeatCallback, null, HeartbeatInterval*1000, Timeout.Infinite); _isConnected = true; return true; } catch (Exception ex) { // 记录日志 Debug.WriteLine($"连接异常:{ex.Message}"); return false; } } // 心跳回调 private void HeartbeatCallback(object state) { if (!ReadKeepAlive()) { Reconnect(); } _heartbeatTimer.Change(HeartbeatInterval*1000, Timeout.Infinite); } }

这段代码有几个关键点:

  1. 用原生Socket而不是第三方库,保证通讯效率
  2. 内置心跳机制,5秒发一次保活包
  3. 自动重连策略藏在Reconnect方法里(篇幅所限没贴出来)
  4. 异常处理直接吞了异常,实际项目里记得加日志

读写函数才是重头戏,看这个万能读取方法:

public short[] ReadHoldingRegisters(ushort startAddress, ushort length) { var request = new byte[12]; // 事务标识符 BitConverter.GetBytes((ushort)DateTime.Now.Second).CopyTo(request, 0); // 协议标识符 BitConverter.GetBytes((ushort)0x0000).CopyTo(request, 2); // 剩余长度 BitConverter.GetBytes((ushort)6).CopyTo(request, 4); // 单元标识符 request[6] = 0x01; // 功能码 request[7] = 0x03; // 起始地址 BitConverter.GetBytes(startAddress).Reverse().ToArray().CopyTo(request, 8); // 寄存器数量 BitConverter.GetBytes(length).Reverse().ToArray().CopyTo(request, 10); _socket.Send(request); var response = new byte[9 + 2 * length]; _socket.Receive(response); // 解析响应数据... }

这里有个坑要注意:汇川PLC的寄存器地址需要高低字节交换,所以用Reverse()处理。比如要读D100寄存器,实际发的是0x0064,但得转成字节数组[0x00,0x64]再反转成[0x64,0x00]发送。

C#上位机与汇川全系列PLC走ModbusTCP通信实例源码 C#上位机读写PLC案例,TCP通信,通讯部分封装成类,没有加密,都是源码,注释齐全,纯源码,此版本支持汇川全系列PLC的ModebusTCP通讯的读写操作。 C# socket编程 上位机一键修改plc参数 汇川TCP/UDP socket通讯示例,亲测可用,适合学习 通讯相关程序写成库,都是源码,可以直接复用 关键代码注释清晰 支持汇川全系列plc的modbusTCP通讯, 可以导入导出变量表

变量表导入导出是项目亮点,看看XML配置长啥样:

<VariableList> <Variable> <Name>Temperature</Name> <Address>D100</Address> <DataType>Short</DataType> <Remark>炉温监测</Remark> </Variable> <Variable> <Name>Pressure</Name> <Address>D102</Address> <DataType>Float</DataType> <Remark>压力传感器</Remark> </Variable> </VariableList>

对应的解析代码用了XML序列化:

public void ExportVariableTable(string filePath) { var serializer = new XmlSerializer(typeof(List<PlcVariable>)); using (var writer = new StreamWriter(filePath)) { serializer.Serialize(writer, _variables); } }

实际使用时,控制台程序这么玩:

static void Main(string[] args) { using var plc = new HCPLCClient(); if (!plc.Connect("192.168.1.10")) { Console.WriteLine("连接失败!"); return; } // 读取D100开始的2个寄存器 var data = plc.ReadHoldingRegisters(100, 2); Console.WriteLine($"D100: {data[0]}, D101: {data[1]}"); // 写入单个寄存器D200 plc.WriteSingleRegister(200, 1500); // 导入变量表 plc.ImportVariableTable("config.xml"); // 按变量名读取 var temp = plc.GetVariableValue<float>("Temperature"); }

几个实战经验:

  1. 每次读写建议加200ms延时,PLC处理需要时间
  2. 批量读取不要超过100个寄存器,容易超时
  3. 浮点数处理记得用BitConverter.ToSingle()
  4. 用using语句确保连接及时释放

源码里还藏了个彩蛋——UDP广播搜索PLC设备的功能,适合现场调试时快速找IP。这玩意儿在车间里比什么扫描工具都好使,谁用谁知道。

项目在GitHub上已经收获200+星,老铁们在实际项目中用这套代码对接过注塑机、CNC、机械手,稳定性经受住了72小时连续运行的考验。需要源码的直接私,注释写得比高考作文还详细,保准你看得明明白白。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 3:46:01

vLLM部署千问72B大模型实战:从Docker镜像到API调用的完整避坑指南

vLLM实战&#xff1a;千问72B大模型高效部署与API服务优化指南 在人工智能技术快速迭代的今天&#xff0c;百亿参数级别的大模型已成为企业智能化转型的核心竞争力。如何高效部署这些"庞然大物"&#xff0c;使其在实际业务中发挥价值&#xff0c;是每个技术团队面临的…

作者头像 李华
网站建设 2026/7/14 13:53:53

all-MiniLM-L6-v2效率提升:用这个小模型让搜索响应快3倍

all-MiniLM-L6-v2效率提升&#xff1a;用这个小模型让搜索响应快3倍 1. 为什么需要轻量级嵌入模型 在构建现代搜索和推荐系统时&#xff0c;文本嵌入模型扮演着核心角色。传统的大型语言模型虽然性能出色&#xff0c;但在实际生产环境中常常面临三大挑战&#xff1a; 响应延…

作者头像 李华
网站建设 2026/7/14 13:54:12

零基础也能玩转!丹青识画AI艺术系统快速上手指南

零基础也能玩转&#xff01;丹青识画AI艺术系统快速上手指南 1. 开篇&#xff1a;当科技遇见东方美学 想象一下&#xff0c;你随手拍的一张照片&#xff0c;转眼间就变成了一幅配有优雅书法题跋的艺术作品。这不是魔法&#xff0c;而是"丹青识画"AI艺术系统带来的神…

作者头像 李华
网站建设 2026/7/14 13:54:10

多臂机器人协同控制技术:从原理到实践的全栈开发指南

多臂机器人协同控制技术&#xff1a;从原理到实践的全栈开发指南 【免费下载链接】lerobot &#x1f917; LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot 引言&#xff1a…

作者头像 李华
网站建设 2026/7/14 13:54:11

从破窗理论看单元测试:用Unity框架重构遗留C代码的5个真实案例

从破窗理论看单元测试&#xff1a;用Unity框架重构遗留C代码的5个真实案例 当一栋建筑的窗户被打破后无人修理&#xff0c;很快就会有更多窗户被打破&#xff0c;最终整栋建筑陷入失修状态——这就是著名的"破窗理论"。在软件工程中&#xff0c;这一现象同样存在&…

作者头像 李华