Ejemplo n.º 1
0
        public Item <ushort>[] ReadUShorts(DeviceAddress deviceAddress, ushort length)
        {
            var datas   = readyBytes(deviceAddress, 2 * length);
            var ushorts = UnsafeNetConvert.BytesToUShorts(datas, 0, length, deviceAddress.ByteOrder);

            return(NetConvert.ToItems(ushorts, 0, length));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Read Hold Register Rely
        /// Fucntion:0x03
        /// </summary>
        /// <param name="address">40001~49999</param>
        /// <param name="count">less than 128</param>
        /// <returns></returns>
        private byte[] readHoldRegisterRely(int address, int count)
        {
            byte[] dataBuffer = new byte[count * 2];
            byte[] relyBuffer = new byte[count * 2 + 3]; //addtion SlaveId,Function,Count
            IPointMapping <ushort> _ushortMapping = _mapping as IPointMapping <ushort>;


            var ushortData = new ushort[count];

            for (int i = 0; i < count; i++)
            {
                var addressString = string.Format("{0:D5}", address + i + 1 + 40000);//地址偏移+1
                if (_mapping.Find(addressString))
                {
                    ushortData[i] = _ushortMapping.GetValue(addressString)[0];
                }
                else
                {
                    return(errorRely(FunctionCode.ReadHoldRegister, ErrorCode.LllegalDataAddress));
                };
            }
            dataBuffer = UnsafeNetConvert.UShortsToBytes(ushortData, ByteOrder.BigEndian);

            relyBuffer[0] = (byte)_salveId;
            relyBuffer[1] = (byte)FunctionCode.ReadHoldRegister;
            relyBuffer[2] = (byte)dataBuffer.Length;
            Array.Copy(dataBuffer, 0, relyBuffer, 3, dataBuffer.Length);
            return(relyBuffer);
        }
Ejemplo n.º 3
0
        public Item <float>[] Readfloats(DeviceAddress deviceAddress, ushort length)
        {
            var datas  = readRegister(deviceAddress, 2 * length);
            var bdatas = UnsafeNetConvert.BytesToFloats(datas, 0, length, deviceAddress.ByteOrder);

            return(NetConvert.ToItems(bdatas, 0, length));
        }
Ejemplo n.º 4
0
        public Item <int>[] ReadInts(DeviceAddress deviceAddress, ushort length)
        {
            var datas = readyBytes(deviceAddress, 4 * length);
            var ints  = UnsafeNetConvert.BytesToInts(datas, 0, length, deviceAddress.ByteOrder);

            return(NetConvert.ToItems(ints, 0, length));
        }
Ejemplo n.º 5
0
 public int WriteUShorts(DeviceAddress deviceAddress, ushort[] datas)
 {
     lock (_async)
     {
         _handler = _handler++ >= 65535 ? 0 : _handler;
         var source = createWriteHeader(deviceAddress, _handler, UnsafeNetConvert.UShortsToBytes(datas, ByteOrder.BigEndian));
         return(writedata(deviceAddress, source));
     }
 }
Ejemplo n.º 6
0
        public Item <ushort> ReadUShort(DeviceAddress deviceAddress)
        {
            var datas = readRegister(deviceAddress, 1);

            return(datas == null ? Item <ushort> .CreateDefault() :
                   new Item <ushort>()
            {
                Vaule = UnsafeNetConvert.BytesToUShort(datas, 0, deviceAddress.ByteOrder), UpdateTime = DateTime.Now, Quality = QUALITIES.QUALITY_GOOD
            });
        }
Ejemplo n.º 7
0
        public Item <int> ReadInt(DeviceAddress deviceAddress)
        {
            var datas = readyBytes(deviceAddress, 4);

            return(datas == null ? Item <int> .CreateDefault() :
                   new Item <int>()
            {
                Vaule = UnsafeNetConvert.BytesToInt(datas, 0, deviceAddress.ByteOrder), UpdateTime = DateTime.Now, Quality = QUALITIES.QUALITY_GOOD
            });
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 16位无符号整形点绑定16位整形数据
        /// </summary>
        /// <param name="source">16位整形源数据</param>
        /// <param name="sourceindex">源数据点索引</param>
        /// <param name="target">目标数据,点长度为1的虚拟点</param>
        /// <param name="bindingWay">绑定方式,默认为单方向</param>
        public static bool UshortBinding(IPoint <short> source, int sourceindex, IPoint <ushort> target, BindingWay bindingWay = BindingWay.OneWay)
        {
            if (sourceindex >= source.Length)
            {
                return(false);
            }
            switch (bindingWay)
            {
            case BindingWay.OneWay:
                source.PropertyChanged += (s, p) =>
                {
                    if (int.Parse(p.PropertyName) == sourceindex)
                    {
                        byte[] temp1 = UnsafeNetConvert.ShortToBytes(source[(byte)sourceindex], ByteOrder.None);
                        ushort temp2 = UnsafeNetConvert.BytesToUShort(temp1, 0, ByteOrder.None);
                        target.ValueUpdate(temp2, 0);
                    }
                };
                return(true);

            case BindingWay.TwoWay:
                source.PropertyChanged += (s, p) =>
                {
                    if (int.Parse(p.PropertyName) == sourceindex)
                    {
                        byte[] temp1 = UnsafeNetConvert.ShortToBytes(source[(byte)sourceindex], ByteOrder.None);
                        ushort temp2 = UnsafeNetConvert.BytesToUShort(temp1, 0, ByteOrder.None);
                        target.ValueUpdate(temp2, 0);
                    }
                };
                target.PropertyChanged += (s, p) =>
                {
                    var temp1 = UnsafeNetConvert.UShortToBytes(target[0], ByteOrder.None);
                    var temp2 = UnsafeNetConvert.BytesToShort(temp1, 0, ByteOrder.None);
                    source.ValueUpdate(temp2, sourceindex);
                };
                return(true);

            case BindingWay.ReverseWay:
                target.PropertyChanged += (s, p) =>
                {
                    var temp1 = UnsafeNetConvert.UShortToBytes(target[0], ByteOrder.None);
                    var temp2 = UnsafeNetConvert.BytesToShort(temp1, 0, ByteOrder.None);
                    source.ValueUpdate(temp2, sourceindex);
                };
                return(true);

            default:
                return(false);
            }
        }
Ejemplo n.º 9
0
        public int WriteUShorts(DeviceAddress deviceAddress, ushort[] datas)
        {
            ushort startAddress;

            if (Function.EnableWriteRegister(deviceAddress.Address, out startAddress))
            {
                byte[] valueBytes = UnsafeNetConvert.BytesPerversion(UnsafeNetConvert.UShortsToBytes(datas, deviceAddress.ByteOrder));
                byte[] sendBytes  = getWriteMulRegisterHeader((byte)deviceAddress.SalveId, startAddress, valueBytes);
                return(writeBytes(sendBytes));
            }
            else
            {
                return(-1);
            }
        }
Ejemplo n.º 10
0
        public int WriteFloat(DeviceAddress deviceAddress, float datas)
        {
            ushort startAddress;

            if (Function.EnableWriteRegister(deviceAddress.Address, out startAddress))
            {
                var valueBytes = (deviceAddress.ByteOrder == ByteOrder.BigEndian) ? UnsafeNetConvert.FloatToBytes(datas, deviceAddress.ByteOrder)
                    : UnsafeNetConvert.BytesPerversion(UnsafeNetConvert.FloatToBytes(datas, deviceAddress.ByteOrder));
                byte[] sendBytes = getWriteMulRegisterHeader((byte)deviceAddress.SalveId, startAddress, valueBytes);
                return(writeBytes(sendBytes));
            }
            else
            {
                return(-1);
            }
        }
Ejemplo n.º 11
0
        private byte[] readRegister(DeviceAddress deviceAddress, int lenght)
        {
            byte   salveID = (byte)deviceAddress.SalveId;
            ushort startAddress;
            byte   funcCode = (byte)Function.GetReadFunctionCode(deviceAddress.Address, out startAddress);

            if (funcCode == 3 || funcCode == 4)
            {
                //若byteOrder为bigEndian不需要颠倒word高低位
                return((deviceAddress.ByteOrder == ByteOrder.BigEndian)? readBytes(salveID, startAddress, funcCode, (ushort)lenght)
                    : UnsafeNetConvert.BytesPerversion(readBytes(salveID, startAddress, funcCode, (ushort)lenght)));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Write single hold reister Rely
        /// Function:0x06
        /// </summary>
        /// <param name="address">40001~49999</param>
        /// <param name="data">length=2,Data Hi:data[0],Data Lo:data[1]</param>
        /// <returns></returns>
        private byte[] writeSingleReisterRely(int address, byte[] data)
        {
            byte[] relyBuffer    = new byte[6];
            var    value         = UnsafeNetConvert.BytesToUShort(data, 0, ByteOrder.BigEndian);
            var    addressString = string.Format("{0:D5}", address + 1 + 40000);      //地址偏移+1

            if (_mapping.SetValue(addressString, new ushort[] { value }) == -1)
            {
                return(errorRely(FunctionCode.WriteSingleRegister, ErrorCode.LllegalDataAddress));
            }
            relyBuffer[0] = (byte)_salveId;
            relyBuffer[1] = (byte)FunctionCode.WriteSingleRegister;
            var addrByte = UnsafeNetConvert.UShortToBytes((ushort)address, ByteOrder.BigEndian);

            Array.Copy(addrByte, 0, relyBuffer, 2, 2);
            Array.Copy(data, 0, relyBuffer, 4, data.Length);
            return(relyBuffer);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Force Multi Coils Rely
        /// Function:0x0F
        /// </summary>
        /// <param name="address">00001~09999</param>
        /// <param name="data"></param>
        /// <param name="count">bools count of byte array</param>
        /// <returns></returns>
        private byte[] writeMulColilRely(int address, byte[] data, int count)
        {
            byte[] relyBuffer = new byte[6];
            var    values     = NetConvert.BytesToBools(data, count);

            for (int i = 0; i < count; i++)
            {
                var addressString = string.Format("{0:D5}", address + i + 1);//地址偏移+1
                if (_mapping.SetValue(addressString, new bool[] { values[i] }) == -1)
                {
                    return(errorRely(FunctionCode.ForceMulCoil, ErrorCode.LllegalDataAddress));
                }
            }
            relyBuffer[0] = (byte)_salveId;
            relyBuffer[1] = (byte)FunctionCode.ForceMulCoil;
            var addrByte = UnsafeNetConvert.UShortToBytes((ushort)address, ByteOrder.BigEndian);

            Array.Copy(addrByte, 0, relyBuffer, 2, 2);
            var countByte = UnsafeNetConvert.UShortToBytes((ushort)count, ByteOrder.BigEndian);

            Array.Copy(countByte, 0, relyBuffer, 4, 2);
            return(relyBuffer);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Force Single Coil Value
        /// Function:0x05
        /// </summary>
        /// <param name="address">00001~09999</param>
        /// <param name="data">Length=2,data[0]=0xFF as true</param>
        /// <returns></returns>
        private byte[] writeSingleCoilRely(int address, byte[] data)
        {
            byte[] relyBuffer    = new byte[6];
            var    addressString = string.Format("{0:D5}", address + 1);//地址偏移+1

            bool[] value = new bool[1];
            if (data[0] == 0xff)
            {
                value[0] = true;
            }
            if (_mapping.SetValue(addressString, value) == -1)
            {
                return(errorRely(FunctionCode.ForceSingleCoil, ErrorCode.LllegalDataAddress));
            }
            relyBuffer[0] = (byte)_salveId;
            relyBuffer[1] = (byte)FunctionCode.ForceSingleCoil;
            var addrByte = UnsafeNetConvert.UShortToBytes((ushort)address, ByteOrder.BigEndian);

            Array.Copy(addrByte, 0, relyBuffer, 2, 2);
            relyBuffer[4] = data[0];
            relyBuffer[5] = data[1];
            return(relyBuffer);
        }
Ejemplo n.º 15
0
        /// <summary>
        /// 16位无符号整形点绑定32整形数据
        /// </summary>
        /// <param name="source">32位整形源数据</param>
        /// <param name="sourceindex">源数据点索引</param>
        /// <param name="targets">目标数据,数组长度为2,点长度为1的虚拟点</param>
        /// <param name="bindingWay">绑定方式,默认为单方向</param>
        public static bool UshortBinding(IPoint <int> source, int sourceindex, IPoint <ushort>[] targets, ByteOrder byterOrder = ByteOrder.None, BindingWay bindingWay = BindingWay.OneWay)
        {
            if (sourceindex >= source.Length)
            {
                return(false);
            }
            if (targets.Length != 2)
            {
                return(false);
            }
            switch (bindingWay)
            {
            case BindingWay.OneWay:
                source.PropertyChanged += (s, p) =>
                {
                    if (int.Parse(p.PropertyName) == sourceindex)
                    {
                        byte[]   temp1 = UnsafeNetConvert.IntToBytes(source[(byte)sourceindex], byterOrder);
                        ushort[] temp2 = (byterOrder == ByteOrder.BigEndian)? UnsafeNetConvert.BytesToUShorts(temp1, 0, 2, byterOrder):UnsafeNetConvert.BytesToUShorts(temp1, 0, 2, ByteOrder.None);
                        for (int i = 0; i < targets.Length; i++)
                        {
                            targets[i].ValueUpdate(temp2[i], 0);
                        }
                    }
                };
                return(true);

            case BindingWay.TwoWay:
                source.PropertyChanged += (s, p) =>
                {
                    if (int.Parse(p.PropertyName) == sourceindex)
                    {
                        byte[]   temp1 = UnsafeNetConvert.IntToBytes(source[(byte)sourceindex], byterOrder);
                        ushort[] temp2 = (byterOrder == ByteOrder.BigEndian) ? UnsafeNetConvert.BytesToUShorts(temp1, 0, 2, byterOrder) : UnsafeNetConvert.BytesToUShorts(temp1, 0, 2, ByteOrder.None);
                        for (int i = 0; i < targets.Length; i++)
                        {
                            targets[i].ValueUpdate(temp2[i], 0);
                        }
                    }
                };
                foreach (var target in targets)
                {
                    target.PropertyChanged += (s, p) =>
                    {
                        var temp1 = (byterOrder == ByteOrder.BigEndian) ? UnsafeNetConvert.UShortsToBytes(new ushort[] { targets[0][0], targets[1][0] }, byterOrder): UnsafeNetConvert.UShortsToBytes(new ushort[] { targets[0][0], targets[1][0] }, ByteOrder.None);
                        var temp2 = UnsafeNetConvert.BytesToInt(temp1, 0, byterOrder);
                        source.ValueUpdate(temp2, sourceindex);
                    };
                }
                return(true);

            case BindingWay.ReverseWay:
                foreach (var target in targets)
                {
                    target.PropertyChanged += (s, p) =>
                    {
                        var temp1 = (byterOrder == ByteOrder.BigEndian) ? UnsafeNetConvert.UShortsToBytes(new ushort[] { targets[0][0], targets[1][0] }, byterOrder) : UnsafeNetConvert.UShortsToBytes(new ushort[] { targets[0][0], targets[1][0] }, ByteOrder.None);
                        var temp2 = UnsafeNetConvert.BytesToInt(temp1, 0, byterOrder);
                        source.ValueUpdate(temp2, sourceindex);
                    };
                }
                return(true);

            default:
                return(false);
            }
        }
Ejemplo n.º 16
0
        private byte[] bufferRely(byte[] buffer)
        {
            byte[] getBuffer = null;
            try
            {
                if (buffer[0] == (byte)_salveId)
                {
                    switch ((FunctionCode)buffer[1])
                    {
                    case FunctionCode.ReadCoil:
                        if (buffer.Length < 6)
                        {
                            getBuffer = errorRely(FunctionCode.ReadCoil, ErrorCode.LllegalData);
                        }
                        else
                        {
                            var startAddress = UnsafeNetConvert.BytesToShort(buffer, 2, ByteOrder.BigEndian);
                            var count        = UnsafeNetConvert.BytesToShort(buffer, 4, ByteOrder.BigEndian);
                            getBuffer = readCoilRely(startAddress, count);
                        }
                        break;

                    case FunctionCode.ReadInputStatus:
                        if (buffer.Length < 6)
                        {
                            getBuffer = errorRely(FunctionCode.ReadInputStatus, ErrorCode.LllegalData);
                        }
                        else
                        {
                            var startAddress = UnsafeNetConvert.BytesToShort(buffer, 2, ByteOrder.BigEndian);
                            var count        = UnsafeNetConvert.BytesToShort(buffer, 4, ByteOrder.BigEndian);
                            getBuffer = readInStatusRely(startAddress, count);
                        }
                        break;

                    case FunctionCode.ReadInputRegister:
                        if (buffer.Length < 6)
                        {
                            getBuffer = errorRely(FunctionCode.ReadInputRegister, ErrorCode.LllegalData);
                        }
                        else
                        {
                            var startAddress = UnsafeNetConvert.BytesToShort(buffer, 2, ByteOrder.BigEndian);
                            var count        = UnsafeNetConvert.BytesToShort(buffer, 4, ByteOrder.BigEndian);
                            getBuffer = readInputRegisterRely(startAddress, count);
                        }
                        break;

                    case FunctionCode.ReadHoldRegister:
                        if (buffer.Length < 6)
                        {
                            getBuffer = errorRely(FunctionCode.ReadHoldRegister, ErrorCode.LllegalData);
                        }
                        else
                        {
                            var startAddress = UnsafeNetConvert.BytesToShort(buffer, 2, ByteOrder.BigEndian);
                            var count        = UnsafeNetConvert.BytesToShort(buffer, 4, ByteOrder.BigEndian);
                            getBuffer = readHoldRegisterRely(startAddress, count);
                        }
                        break;

                    case FunctionCode.ForceSingleCoil:
                        if (buffer.Length < 6)
                        {
                            getBuffer = errorRely(FunctionCode.ForceSingleCoil, ErrorCode.LllegalData);
                        }
                        else
                        {
                            var startAddress = UnsafeNetConvert.BytesToShort(buffer, 2, ByteOrder.BigEndian);
                            var data         = new byte[] { buffer[4], buffer[5] };
                            getBuffer = writeSingleCoilRely(startAddress, data);
                        }
                        break;

                    case FunctionCode.ForceMulCoil:
                        if (buffer.Length < 7 || buffer.Length < 7 + buffer[6])
                        {
                            getBuffer = errorRely(FunctionCode.ForceMulCoil, ErrorCode.LllegalData);
                        }
                        else
                        {
                            var startAddress = UnsafeNetConvert.BytesToShort(buffer, 2, ByteOrder.BigEndian);
                            var count        = UnsafeNetConvert.BytesToShort(buffer, 4, ByteOrder.BigEndian);
                            var data         = new byte[buffer[6]];
                            Array.Copy(buffer, 7, data, 0, buffer[6]);
                            getBuffer = writeMulColilRely(startAddress, data, count);
                        }
                        break;

                    case FunctionCode.WriteSingleRegister:
                        if (buffer.Length < 6)
                        {
                            getBuffer = errorRely(FunctionCode.WriteSingleRegister, ErrorCode.LllegalData);
                        }
                        else
                        {
                            var startAddress = UnsafeNetConvert.BytesToShort(buffer, 2, ByteOrder.BigEndian);
                            var data         = new byte[] { buffer[4], buffer[5] };
                            getBuffer = writeSingleReisterRely(startAddress, data);
                        }
                        break;

                    case FunctionCode.WriteMulRegister:
                        if (buffer.Length < 7 || buffer.Length < 7 + buffer[6])
                        {
                            getBuffer = errorRely(FunctionCode.WriteMulRegister, ErrorCode.LllegalData);
                        }
                        else
                        {
                            var startAddress = UnsafeNetConvert.BytesToShort(buffer, 2, ByteOrder.BigEndian);
                            var data         = new byte[buffer[6]];
                            Array.Copy(buffer, 7, data, 0, buffer[6]);
                            getBuffer = writeMultiReisterRely(startAddress, data);
                        }
                        break;

                    default:
                        getBuffer = errorRely((FunctionCode)buffer[1], ErrorCode.LllegalFuctionCode);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Log.ErrorLog(string.Format("Modbus buffer Rely Error:{0}", ex.ToString()));
            }
            return(getBuffer);
        }