Exemple #1
0
        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>();
        }
Exemple #3
0
        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);
        }