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

modbus(二)用NModbus4库实现Modbus tcp从站

public class ModbusTcpSlaveDemo : IDisposable
{ILogger _Logger;public ModbusTcpSlaveDemo(ILogger<ModbusTcpSlaveDemo> logger){_Logger = logger;Start();}#region Modbus TCP 从站实现private TcpListener _listener;private ModbusSlave _slave;private bool _isRunning;public byte SlaveId { get; set; } = 1;public int Port { get; set; } = 502;public void Start(){if (_isRunning) return;try{// 创建TCP监听器_listener = new TcpListener(IPAddress.Any, Port);_listener.Start();// 创建Modbus TCP从站_slave = ModbusTcpSlave.CreateTcp(SlaveId, _listener);// 初始化测试数据到Modbus数据存储
            InitializeTestData();// 启动从站
            _slave.Listen();_isRunning = true;_Logger.LogInformation($"Modbus TCP从机启动成功");_Logger.LogInformation($"从站ID: {SlaveId}, 端口: {Port}");PrintTestDataInfo();}catch (Exception ex){_Logger.LogError(ex, $"Modbus TCP从机启动失败");throw;}}private void InitializeTestData(){// 获取数据存储var dataStore = _slave.DataStore;// 初始化保持寄存器 (地址 0-9) - 使用正确的APIfor (ushort i = 1; i < 10; i++){dataStore.HoldingRegisters[i] = (ushort)((i + 1) * 100);}// 初始化输入寄存器 (地址 0-9)for (ushort i = 1; i < 10; i++){dataStore.InputRegisters[i] = (ushort)((i + 1) * 50);}// 初始化线圈 (地址 0-9) - NModbus4 2.1.0 的正确API// 线圈使用 CoilDiscretes 而不是 Coilsfor (ushort i = 1; i < 10; i++){dataStore.CoilDiscretes[i] = (i % 2 == 0);}}private void PrintTestDataInfo(){var dataStore = _slave.DataStore;_Logger.LogInformation("测试数据已设置:");// 读取并显示保持寄存器var holdingValues = new List<string>();for (int i = 1; i < 5; i++){holdingValues.Add(dataStore.HoldingRegisters[i].ToString());}_Logger.LogInformation($"保持寄存器 (地址0-4): {string.Join(", ", holdingValues)}");// 读取并显示输入寄存器var inputValues = new List<string>();for (int i = 1; i < 5; i++){inputValues.Add(dataStore.InputRegisters[i].ToString());}_Logger.LogInformation($"输入寄存器 (地址0-4): {string.Join(", ", inputValues)}");// 读取并显示线圈var coilValues = new List<string>();for (int i = 1; i < 5; i++){coilValues.Add(dataStore.CoilDiscretes[i] ? "ON" : "OFF");}_Logger.LogInformation($"线圈 (地址0-4): {string.Join(", ", coilValues)}");}public void UpdateHoldingRegister(ushort address, ushort value){if (_isRunning){_slave.DataStore.HoldingRegisters[address] = value;_Logger.LogInformation($"更新保持寄存器地址{address} = {value}");}}public ushort ReadHoldingRegister(ushort address){if (_isRunning){return _slave.DataStore.HoldingRegisters[address];}return 0;}public void UpdateCoil(ushort address, bool value){if (_isRunning){_slave.DataStore.CoilDiscretes[address] = value;_Logger.LogInformation($"更新线圈地址{address} = {(value ? "ON" : "OFF")}");}}public bool ReadCoil(ushort address){if (_isRunning){return _slave.DataStore.CoilDiscretes[address];}return false;}public void Stop(){if (!_isRunning) return;try{_listener?.Stop();_isRunning = false;_Logger.LogInformation("Modbus TCP从机已停止");}catch (Exception ex){_Logger.LogError(ex, "停止Modbus从机时出错");}}public void Dispose(){Stop();}#endregion
}

 

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

相关文章:

  • 数位dp-模版
  • grub修复系统引导linux
  • 计算机字长与字节大小的发展历程
  • grub linux
  • #题解#洛谷 P 4375 Out of Sorts G#离散化#并查集#
  • Trae实操:连接Vizro MCP建立内容可视化
  • 2025年回收洋酒价格公司权威推荐榜单:洋酒回收价目表/哪里回收洋酒/洋酒回收价格源头公司精选
  • 2025年快递纸箱定做厂家权威推荐榜单:五层纸箱/重型纸箱/单层纸板箱源头厂家精选
  • 7-3 NCHU_单部电梯调度程序
  • 面向对象编程解决电梯调度问题
  • 2025年低音功放批发厂家权威推荐榜单:汽车音响改装功放/两路功放/四路功放源头厂家精选
  • 2025年镀锌角码实力厂家权威推荐榜单:万能立柱角码/角码连接件/钢结构预埋件源头厂家精选
  • Nmap 命令详细使用指南(官方参数全覆盖版) - 实践
  • B端界面设计之审批流程交互和UI界面——让审批“顺起来”
  • 从renderToString到hydrate,从0~1手写一个SSR框架 - 指南
  • grep用法linux
  • Matplotlib 电影票房分析挑战
  • selenium: 安装selenium
  • 基于单片机的故障检测自动保护智能防夹自动门设计及LCD状态显示架构
  • gpt安装 linux
  • 第2周作业
  • GRANT语句在MySQL中的权限继承策略
  • 轨道平面系与轨道姿态系 - 实践
  • Snipaste 桌面截图工具 易上手:桌面 贴 图神器,高效截图不费力
  • 【物联网控制体系项目实战】—— 整体架构流程与 WS 构建
  • SBD521S-30-ASEMI可直接替代安世1PS79SB10
  • 51单片机(markdown格式阅读) - 实践
  • NCHU_单部电梯调度程序设计分析_23207332
  • 【日记】博客爆炸了(1009 字)
  • 解决:部署mabayolo模型cd selective_scan pip install . cd ..报错 以及 torch.cuda.is_available()结果False