using Common.Attributes; using DeviceCommand.Base; using Model.Models; using NModbus; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DeviceCommand.Devices { /// /// IO 继电器板卡(一对一控制),基于 Modbus TCP 协议通过线圈(Coil)读写控制继电器输出。 /// 由于多块板卡的点位映射不完全一致,实际业务中使用 统一调度三块板卡。 /// //[ACPCommand] public class IOBoard : ModbusTcp { /// /// 构造函数,初始化 Modbus TCP 连接配置。 /// /// TCP 连接配置(IP、端口等) public IOBoard(TcpConfig config) : base(config) { } /// /// 写入单个输出开关(线圈)状态。 /// /// Modbus 从站站号 /// 线圈地址(0 起始) /// 开关状态(true: 吸合/开启, false: 断开/关闭) public async Task 写输出开关(byte 站号, ushort 开始地址, bool data) { await Modbus.WriteSingleCoilAsync(站号, 开始地址, data); } /// /// 批量写入输出开关状态。先读出全部 16 个线圈当前状态, /// 在内存中修改指定偏移段的值后再整体写回,避免影响其他点位。 /// /// Modbus 从站站号 /// 起始线圈地址(0 起始) /// 要写入的开关状态数组,按顺序从开始地址写入 public async Task 批量写输出开关(byte 站号, ushort 开始地址, bool[] datas) { var 批量写入 = await Modbus.ReadCoilsAsync(1, 0, 16); for (int i = 0; i < datas.Length; i++) { if (开始地址 + i < 批量写入.Length) { 批量写入[开始地址 + i] = datas[i]; } } await Modbus.WriteMultipleCoilsAsync(站号, 0, 批量写入); } /// /// 读取单个输出开关(线圈)状态。 /// /// Modbus 从站站号 /// 线圈地址(0 起始) public async Task 读输出开关(byte 站号, ushort 开始地址) { await Modbus.ReadCoilsAsync(站号, 开始地址, 1); } /// /// 批量读取输出开关(线圈)状态。 /// /// Modbus 从站站号 /// 起始线圈地址(0 起始) /// 要读取的线圈数量 /// 线圈状态数组,true 表示吸合/开启 public async Task 批量读输出开关(byte 站号, ushort 开始地址,ushort 数量) { return await Modbus.ReadCoilsAsync(站号, 开始地址, 数量); } } }