当前位置: 首页 > 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.rkmt.cn/news/57310.html

相关文章:

  • 计算机字长与字节大小的发展历程
  • 2025年快递纸箱定做厂家权威推荐榜单:五层纸箱/重型纸箱/单层纸板箱源头厂家精选
  • 2025年镀锌角码实力厂家权威推荐榜单:万能立柱角码/角码连接件/钢结构预埋件源头厂家精选
  • Nmap 命令详细使用指南(官方参数全覆盖版) - 实践
  • selenium: 安装selenium
  • 基于单片机的故障检测自动保护智能防夹自动门设计及LCD状态显示架构
  • gpt安装 linux
  • GRANT语句在MySQL中的权限继承策略
  • 轨道平面系与轨道姿态系 - 实践
  • 51单片机(markdown格式阅读) - 实践
  • 【日记】博客爆炸了(1009 字)
  • 解决:部署mabayolo模型cd selective_scan pip install . cd ..报错 以及 torch.cuda.is_available()结果False
  • CMake构建学习笔记30-Ceres Solver库的构建
  • curl 命令使用笔记
  • 2025年口碑好的电厂清淤机器人厂家最新用户好评榜
  • 2025年靠谱的极低压抗污染反渗透膜厂家最新TOP排行榜
  • 2025年11月留学生回国求职机构推荐榜单:权威机构列表与选择指南
  • 2025年11月留学生回国求职机构推荐:五大权威机构榜单与选择指南
  • 2025年评价高的快速离心浓缩干燥器TOP品牌厂家排行榜
  • 2025年比较好的组合式恒温 振荡培养箱最新TOP品牌厂家排行
  • 2025年专业的输送机高评价厂家推荐榜
  • 2025年诚信的镁制硅晶防火风管厂家推荐及选购指南
  • 2025年靠谱的试验机行业内知名厂家排行榜
  • 2025年11月留学生找实习机构推荐:权威市场报告解读与口碑机构列表
  • 2025年质量好的自动叠皮机厂家推荐及采购指南
  • 2025年耐用的钢板预处理线TOP品牌厂家排行榜
  • 2025年口碑好的F40喷涂四氟厂家最新TOP排行榜
  • 2025年评价高的鲜面条生产线厂家最新TOP排行榜
  • 2025年比较好的佛山负氧离子床垫行业内口碑厂家排行榜
  • 聚焦2025:食品冻干机厂家推荐大比拼,果蔬冷冻干燥机推荐