UInt16[] ReadRegisters(MBFunction func, Int32 addr, UInt16 count) { var cmd = new ModbusEntity(); cmd.Function = func; var buf = new Byte[4]; buf.WriteUInt16(0, addr); buf.WriteUInt16(2, count); cmd.Data = buf; var rs = Process(cmd, 1 + count * 2); if (rs == null) { return(null); } count = rs.Data[0]; if (1 + count > rs.Data.Length) { count = (UInt16)(rs.Data.Length - 1); } var ds = new UInt16[count / 2]; for (var i = 0; i < ds.Length; i++) { ds[i] = rs.Data.ReadUInt16(1 + i * 2); } return(ds); }
public ModbusCollectDevice(ITransport transport, byte host, MBFunction function) { if (transport == null) { throw new ArgumentNullException(nameof(transport)); } if (base.Transport == null) { base.Transport = transport; } if (_master == null) { _master = new ModbusMaster { Transport = base.Transport, Host = host #if DEBUG , EnableDebug = true #endif }; } this.Host = host; this.Function = function; Registers = new List <int>(); Values = new List <ushort>(); }
Boolean[] ReadInputs(MBFunction func, Int32 addr, UInt16 count) { var cmd = new ModbusEntity { Function = func }; var buf = new Byte[4]; buf.WriteUInt16(0, addr); buf.WriteUInt16(2, count); cmd.Data = buf; var rLen = 1 + count / 8; if (count % 8 != 0) { rLen++; } var rs = Process(cmd, rLen); if (rs == null || rs.Data == null || rs.Data.Length < 1) { return(null); } // 特殊处理单个读取,提高效率 if (count == 1) { return new Boolean[] { rs.Data[1] == 1 } } ; var flags = new Boolean[count]; // 元素存放于m字节n位 Int32 m = 0, n = 0; for (var i = 0; i < flags.Length && 1 + m < rs.Data.Length; i++) { if (((rs.Data[1 + m] >> n) & 0x01) == 1) { flags[i] = true; } if (++n >= 8) { m++; n = 0; } } return(flags); }