news 2026/4/16 11:06:32

C#与欧姆龙PLC NX102-9000测试FINS通信,使用TCP连接方式,保证通信数据重要...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#与欧姆龙PLC NX102-9000测试FINS通信,使用TCP连接方式,保证通信数据重要...

C#与欧姆龙PLC NX102-9000测试FINS通信,使用TCP连接方式,保证通信数据重要性,实时监测是否断线;实时读取D0至D1000寄存器数据,实时读取W0至W500的实时数据,将本机数据写入到D11000至D12000数据寄存器,保证数据交换正常;在工业环境中上位机软件需要与PLC交换数据,获取数据上传至MES系统中。 FINS通信速度较快,数据量大,非常好用。 希望能帮下开始使用欧姆龙PLC的工控朋友们

工业现场最刺激的莫过于看着自己写的代码成功撩上PLC。最近刚用C#调通欧姆龙NX系列的FINS协议,实测这货在千兆网络下能飙到每秒10万点数据吞吐,比某些慢吞吞的协议靠谱多了。直接上干货:

C#与欧姆龙PLC NX102-9000测试FINS通信,使用TCP连接方式,保证通信数据重要性,实时监测是否断线;实时读取D0至D1000寄存器数据,实时读取W0至W500的实时数据,将本机数据写入到D11000至D12000数据寄存器,保证数据交换正常;在工业环境中上位机软件需要与PLC交换数据,获取数据上传至MES系统中。 FINS通信速度较快,数据量大,非常好用。 希望能帮下开始使用欧姆龙PLC的工控朋友们

先整个TCP通信框架,核心就Socket那套东西:

public class OmronFinsClient { private Socket _clientSocket; private byte[] _receiveBuffer = new byte[4096]; private bool _isConnected; //心跳包间隔 private const int HeartbeatInterval = 3000; private System.Timers.Timer _heartbeatTimer; public bool Connect(string ip, int port) { try { _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ip), port)); StartHeartbeat(); return _isConnected = true; } catch{ /*记日志*/ return false; } } }

注意这个心跳计时器是保命用的,产线网络说崩就崩。定时发个空包探探路:

private void StartHeartbeat() { _heartbeatTimer = new System.Timers.Timer(HeartbeatInterval); _heartbeatTimer.Elapsed += (s, e) => { if(!SocketConnected) { _isConnected = false; //触发重连逻辑 } }; _heartbeatTimer.Start(); }

读D区数据要构造FINS命令帧,重点看地址转换:

public byte[] BuildReadCommand(int startAddress, int length) { //命令头 var header = new byte[] { 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 }; //内存区标识:D区是0x82 byte[] addressBytes = BitConverter.GetBytes(startAddress).Reverse().ToArray(); //大端序 byte[] command = { 0x01, //读命令 0x82, //D区 addressBytes[0], addressBytes[1], //地址 0x00, //位地址 (byte)(length / 256), (byte)(length % 256) //读取长度 }; return header.Concat(command).ToArray(); }

这里Reverse()不是手滑,欧姆龙的地址排列是反人类的Big-endian(高位在前),必须把字节数组倒过来。比如D11000要转成0x00 0x02 0xAF 0xC8(别问我为什么,问就是日本人的脑回路)

处理响应数据时得注意粘包:

private void DataReceived(IAsyncResult ar) { int bytesRead = _clientSocket.EndReceive(ar); if(bytesRead > 0) { byte[] validData = new byte[bytesRead]; Buffer.BlockCopy(_receiveBuffer, 0, validData, 0, bytesRead); //解析数据头 if(validData.Length < 16) return; ushort dataLength = BitConverter.ToUInt16(new byte[]{validData[15], validData[14]}, 0); //提取有效数据 byte[] realData = validData.Skip(16).Take(dataLength).ToArray(); ProcessData(realData); //后续处理 } _clientSocket.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, SocketFlags.None, DataReceived, null); }

写寄存器要注意数据打包:

public void WriteDRegisters(int startAddr, ushort[] values) { byte[] addrBytes = BitConverter.GetBytes(startAddr).Reverse().ToArray(); List<byte> payload = new List<byte>{ 0x02, //写命令 0x82, //D区 addrBytes[0], addrBytes[1], 0x00 //位地址 }; foreach(var val in values) { payload.AddRange(BitConverter.GetBytes(val).Reverse()); } SendCommand(payload.ToArray()); }

实际应用中有几个坑要注意:

  1. W区(CIO区)地址从0x00开始计算,和D区不同
  2. 连续读取超过960字会触发PLC保护机制
  3. 写入D11000这种高位地址需要确认PLC内存分配
  4. MES对接时建议用JSON中间件做数据缓冲

最后甩个实时监控的代码片段:

//创建双缓冲队列 ConcurrentQueue<PlcData> _dataQueue = new ConcurrentQueue<PlcData>(); void StartMonitoring() { Task.Run(() => { while(_isConnected) { var dData = ReadRange(0, 1000, MemoryType.D); var wData = ReadRange(0, 500, MemoryType.W); _dataQueue.Enqueue(new PlcData{ Timestamp = DateTime.Now, DRegisters = dData, WRegisters = wData }); Thread.Sleep(100); //根据PLC扫描周期调整 } }); }

记住,工控编程最重要的是稳如老狗。下次可以聊聊怎么用CRC校验防止数据被电磁干扰搞崩,那才是真·刺激战场。代码拿走不谢,出问题别找我(狗头)

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

git.exe是什么?Git命令行入门与日常使用指南

Git是一款分布式版本控制系统&#xff0c;它已经成为现代软件开发中不可或缺的基础工具。理解git.exe——即Git的命令行程序——对于高效管理代码版本、协作开发和维护项目历史至关重要。掌握其核心操作&#xff0c;能够帮助开发者从简单的代码备份进阶到专业的团队协作流程。 …

作者头像 李华
网站建设 2026/4/16 15:54:09

[STM32L5] 【STM32L562 DK试用】GUI移植并测试(五)

有成果还没摸索明白图片切换模拟表盘--------------------- 作者&#xff1a;地瓜patch 链接&#xff1a;https://bbs.21ic.com/icview-3441590-1-1.html 来源&#xff1a;21ic.com 此文章已获得原创/原创奖标签&#xff0c;著作权归21ic所有&#xff0c;任何人未经允许禁止转载…

作者头像 李华
网站建设 2026/4/16 11:12:04

java+vue基于springboot人脸识别办公OA管理系统 会议室预约系统 员工考勤任务分配系统2u257jm6-Pycharm vue django项目源码

目录项目概述技术栈核心功能项目结构部署与运行扩展性适用场景开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;项目概述 该项目基于SpringBoot、Vue和Django技术栈&#xff0c;整合了人脸识别技术&#xff0c;实现了办公自动化…

作者头像 李华
网站建设 2026/4/15 18:19:25

交稿前一晚!降AIGC平台千笔 VS Checkjie,专科生专属高效降重神器!

在AI技术迅速发展的今天&#xff0c;越来越多的学生开始借助AI工具辅助论文写作&#xff0c;以提高效率和质量。然而&#xff0c;随着学术审查标准的不断提升&#xff0c;AI生成内容的痕迹越来越容易被识别&#xff0c;导致论文AI率超标、重复率过高&#xff0c;甚至影响最终成…

作者头像 李华
网站建设 2026/4/15 16:46:20

通俗理解U-Net架构

目录 引言&#xff1a;为什么U-Net如此重要&#xff1f;U-Net的历史背景与诞生故事CNN与FCN基础回顾&#xff1a;从图像分类到分割U-Net整体架构详解&#xff1a;那条经典的“U”形曲线编码器&#xff08;收缩路径&#xff09;深入解析&#xff1a;特征提取的“下沉”过程解码…

作者头像 李华