当前位置: 首页 > news >正文

(十)多UnitId模拟:一个网关下面挂多个从站怎么测

GitHub 项目地址:https://github.com/lidecong133/YModbus

单个从站模拟能解决很多问题,但还不够。

现场经常遇到这种结构:一台 TCP 网关下面挂多台 RTU 仪表,或者一条 RS485 总线上挂了多个从站。主站连的 IP、端口或串口都一样,变化的是 UnitId / SlaveId。

这时候要测试主站轮询逻辑,就需要多站号模拟。

YModbus 里对应的是:

  • ModbusTcpSlaveNetwork
  • ModbusRtuSlaveNetwork
  • ModbusAsciiSlaveNetwork

UnitId和SlaveId先别混

TCP 里常叫 Unit ID。

RTU / ASCII 里常叫 Slave ID。

名字不同,本质都是目标站号。

TCP 网关场景下,host + port只是连接到网关,UnitId 才是网关后面的设备。

RTU 总线场景下,串口参数只是打开总线,SlaveId 才是总线上的目标设备。

这个概念没分清,多站号调试一定会乱。

TCP多UnitId示例

下面这个例子在本机127.0.0.1:1502上模拟两个 UnitId。

usingSystem.Net;usingYModbus.Slave;ModbusSlaveDataStoreunit1Store=new(pointCount:100);unit1Store.SetHoldingRegister(0,1234);unit1Store.SetHoldingRegister(1,5678);ModbusSlaveDataStoreunit2Store=new(pointCount:100);unit2Store.SetHoldingRegister(0,2222);unit2Store.SetHoldingRegister(1,3333);awaitusingModbusTcpSlaveNetworknetwork=new(newModbusTcpSlaveNetworkOptions{ListenAddress=IPAddress.Loopback,Port=1502});network.AddSlave(newModbusSlaveDefinition{UnitId=1,PointCount=100},unit1Store);network.AddSlave(newModbusSlaveDefinition{UnitId=2,PointCount=100},unit2Store);awaitnetwork.StartAsync();Console.WriteLine("TCP slave network is running on 127.0.0.1:1502.");Console.ReadLine();awaitnetwork.StopAsync();

主站读 1 号站,返回12345678

主站读 2 号站,返回22223333

同一个端口,不同 UnitId,数据区不同。这就是 TCP 网关测试的核心。

主站侧用MultiUnitClient更顺

这种场景主站侧建议用ModbusMultiUnitClient

usingYModbus.Clients;awaitusingModbusMultiUnitClientclient=awaitModbusClientFactory.CreateTcpMultiUnitAsync(host:"127.0.0.1",port:1502);ushort[]unit1=awaitclient.ReadHoldingRegistersAsync(1,0,2);ushort[]unit2=awaitclient.ReadHoldingRegistersAsync(2,0,2);

第一个参数就是 UnitId。

这样代码和现场结构能对上:同一个网关,多个站号。

运行中修改某个站号的数据

测试主站轮询时,经常要模拟某个设备数据变化。

可以通过TryGetDataStore拿到对应站号的数据区:

if(network.TryGetDataStore(1,outIModbusSlaveDataStore?store)&&storeisnotnull){store.SetHoldingRegister(0,9999);}

主站下一轮读 UnitId 1,就会读到新值。

这可以模拟温度变化、报警置位、计数器增加。比拿真实设备反复造条件方便很多。

RTU多SlaveId

RTU 多站号网络使用同一个串口通道。

usingSystem.IO.Ports;usingYModbus.Serial;usingYModbus.Slave;usingSerialPortport=new("COM3",9600,Parity.None,8,StopBits.One);port.Open();awaitusingModbusRtuSlaveNetworknetwork=new(newSerialPortChannel(port,leaveOpen:true));network.AddSlave(newModbusSlaveDefinition{SlaveId=1,PointCount=100});network.AddSlave(newModbusSlaveDefinition{SlaveId=2,PointCount=100});awaitnetwork.StartAsync();Console.ReadLine();awaitnetwork.StopAsync();

RTU 请求的第一个字节就是 SlaveId。网络会按这个字节把请求路由到不同数据区。

ASCII 多站号写法类似,只是换成ModbusAsciiSlaveNetwork

awaitusingModbusAsciiSlaveNetworknetwork=new(newSerialPortChannel(port,leaveOpen:true));network.AddSlave(newModbusSlaveDefinition{SlaveId=1,PointCount=100});network.AddSlave(newModbusSlaveDefinition{SlaveId=2,PointCount=100});awaitnetwork.StartAsync();

多站号最该看报文

多站号出错时,最先看的不是寄存器值,而是请求里的站号。

TCP 请求里,UnitId 会出现在 MBAP 后面。RTU 请求里,第一个字节就是 SlaveId。

如果你以为主站在读 2 号站,但从站报文里看到的是 1 号站,那问题就很明确。

可以给 network 挂 Traffic 事件:

network.Traffic+=(_,traffic)=>{Console.WriteLine($"{traffic.Direction}{traffic.Message}{Convert.ToHexString(traffic.Frame)}");};

主站和从站两边都看报文,能少很多猜测。

适合做自动化回归

多 UnitId 模拟还有一个很实用的用途:给主站程序做回归测试。

你可以固定一套模拟环境:

UnitId 1: 温度设备 UnitId 2: 压力设备 UnitId 3: IO 模块

每个设备放一组固定数据。主站跑一轮轮询,检查解析结果。

以后改主站代码,再跑同一套模拟环境,就能知道有没有把多站号逻辑改坏。

到这里

单个从站解决“模拟一个设备”。

多 UnitId / 多 SlaveId 网络解决“模拟一组设备”。

如果你的项目里有 TCP 网关、RS485 多仪表轮询、多设备采集,建议尽早用这套方式把测试环境搭起来。

http://www.jsqmd.com/news/1007811/

相关文章:

  • MC56F825x/824x DSC双12位ADC配置与电机控制实战解析
  • 开发日志(十一):多模态菜单 RAG 系统实战
  • 26年春季学期学习记录第44天
  • 数据分析工具选型指南:选对工具,效率直接翻倍! - 品牌测评鉴赏家
  • 猫抓浏览器扩展终极指南:三步搞定网页视频音频下载
  • 基于设备标识重置技术的Cursor Pro功能绕过实现深度解析
  • 星露谷物语SMAPI终极指南:5分钟学会安全安装模组框架
  • 鸿蒙数学108篇 第八十二篇:微积分基本定理
  • 深入解析MC92603千兆以太网PHY芯片:8B/10B编码、冗余链路与时钟恢复实战
  • Maya glTF导出插件深度解析:构建高效3D格式转换工作流实战指南
  • 打破常规:NSK“黑科技”如何重塑滚动轴承的寿命预测?
  • 会议视频快速转文字、提取音频!2026实测5款靠谱工具 - 品牌测评鉴赏家
  • WorkshopDL:跨平台玩家的终极Steam创意工坊下载指南
  • 5分钟掌握ncmdump:轻松解锁网易云音乐NCM加密文件
  • JAVA常见API
  • 《我劝你先别创业,除非你先测过这个》
  • 2026无锡瓷砖空鼓翘边拱起根治全攻略|苏易修缮本地工况专属修复指南 - 苏易修缮
  • AI视频工具实测:Seedance/可灵/HappyHorse谁最能打?
  • 聊聊3款不同定位的数据分析工具:百度文库、腾讯文档、Tableau的真实使用场景 - 品牌测评鉴赏家
  • 3步掌握Kazumi硬件解码优化:告别手机视频卡顿的终极指南
  • 【会议征稿通知 | 深圳大学主办 | AP出版 | EI 、Scopus稳定检索】第四届管理创新与经济发展国际学术会议(MIED 2026)
  • 2026年张家港二手手机店大起底:这家企业为何脱颖而出? - 资讯速览
  • 课件资料存在哪里随时查看使用?多款实用工具汇总 - 品牌测评鉴赏家
  • [企业AI落地] Windows 11 下快速搭建 Ollama + Hermes + Codex + Open WebUI 本地 Agent 体系
  • 用户交互体验优化:缩放、拖拽、日志、错误提示
  • 用C语言循环搞定PTA编程题:统计Tom、Jerry和Spike的选票(附完整代码和测试用例)
  • ArcGIS新手必看:用‘渔网’工具搞定土地利用统计,从创建格网到计算占比保姆级教程
  • 告别无效加班!职场日常办公工具测评,选对效率翻倍 - 品牌测评鉴赏家
  • 终极免费视频下载神器:yt-dlp-gui Windows图形界面完整指南
  • 有声书制作配音用什么工具音色多?2026通通无印免费多音色AI配音教程 - 科技大爆炸