示例#1
0
 public MessageReceiverRegistration(DeviceAddress source, DeviceAddress destination, MessageReceiver callback, MatchType match)
 {
     Source = source;
     Destination = destination;
     Callback = callback;
     Match = match;
 }
示例#2
0
        public InternalMessage(DeviceAddress device, string description, params byte[] data)
            : base((byte)device, (byte)((data.Length + 2) >> 8), data)
        {
            if (!device.IsInternal())
            {
                throw new Exception("Internal messages are for internal devices only.");
            }

            if (PacketLength > 1024) // TODO try up to 0xFFFF length
            {
                throw new Exception("Message packet length exceeds 1024 bytes.");
            }
        }
示例#3
0
 public Message(DeviceAddress source, DeviceAddress destination, string description, params byte[] data)
 {
     if (source == DeviceAddress.Unset || source == DeviceAddress.Unknown)
     {
         throw new ArgumentException("Wrong source device");
     }
     if (destination == DeviceAddress.Unset || destination == DeviceAddress.Unknown)
     {
         throw new ArgumentException("Wrong destination device");
     }
     init((byte)source, (byte)destination, data, description);
     sourceDevice = source;
     destinationDevice = destination;
 }
示例#4
0
        public DBusMessage(DeviceAddress device, string description, params byte[] data)
            : base(device, DeviceAddress.Diagnostic, description, data)
        {
            // packet = device + length + data + chksum
            //          |     ===== length =====      |

            var packetLength = data.Length + 3;
            byte check = 0x00;
            check ^= (byte)device;
            check ^= (byte)packetLength;
            foreach (byte b in data)
            {
                check ^= b;
            }

            init((byte)device, (byte)DeviceAddress.Diagnostic, data, packetLength, check, description);
        }
示例#5
0
文件: Manager.cs 项目: temur03/imBMW
 public static void AddMessageReceiverForSourceDevice(DeviceAddress source, MessageReceiver callback)
 {
     MessageReceiverList.Add(new MessageReceiverRegistration(source, DeviceAddress.Unset, callback, MessageReceiverRegistration.MatchType.Source));
 }
示例#6
0
文件: Manager.cs 项目: temur03/imBMW
 public static bool FindDevice(DeviceAddress device, int timeout)
 {
     if (foundDevices.Contains(device))
     {
         return true;
     }
     lock (foundDevices)
     {
         findDevice = device;
         findDeviceSync.Reset();
         AfterMessageReceived += SaveFoundDevice;
         EnqueueMessage(new Message(DeviceAddress.Diagnostic, device, MessageRegistry.DataPollRequest));
         findDeviceSync.WaitOne(timeout, true);
         AfterMessageReceived -= SaveFoundDevice;
         return foundDevices.Contains(device);
     }
 }
示例#7
0
 public InternalMessage(DeviceAddress device, string data)
     : this(device, data, data)
 {
 }
示例#8
0
 public InternalMessage(DeviceAddress device, params byte[] data)
     : this(device, null, data)
 {
 }
示例#9
0
 public Item <TResult>[] ReadDatas <TResult>(DeviceAddress deviceAddress, ushort length)
 {
     throw new NotImplementedException();
 }
示例#10
0
 public int WriteString(DeviceAddress address, string value)
 {
     return(_plcReader.Poke(_mapping[(short)address.Start], value));
 }
示例#11
0
        /// <summary>
        /// B[1]~B[2]: 03 00 固定报文头
        /// B[3] ~B[4]: 整个读取回复报文长度:25+读取长度;
        /// B[5] ~B[11]:  02 F0 80 32  03 00 00 固定6个字节,和读取请求相同的位置几乎一样,就 B[9] = 0x03; A[9]=0x01;
        /// B[12] ~B[13]: 两个字节,标识序列号,回复报文相同位置和这个完全一样;范围是0 ~65535;
        /// B[14] ~B[15]: 两个字节,固定为00 02;对应读取位置是 00 0E;正好 02+0E=10 ;有点补码的感觉,其实不需要关注规律,反正是固定的;
        /// B[16] ~B[17]:两个字节,=请求读取的字节数+4;
        /// B[18] ~B[23]:6个字节,固定为:00 00 04 01 FF 04 ;
        /// B[24] ~B[25]:两个字节, 请求访问的byte个数*8 ;其实就是以二进制为单位的个数;由此可以看出,一口气最多访问的地址个数是8192;
        /// B[26] ~最后一个   :以offset作为首地址,所对应的各个byte的值;
        /// 程序设计的时候,其实只要关注两个信息:
        /// 1.校验B[3] ~B[4]:校验长度正确;
        /// 2.B[26] ~最后一个  :获取对应的值;
        /// 到这里读的处理就算结束了;
        /// 几个小注意点:
        /// 1.对于不同信号的PLC,除了初始化的CPUSolt不同;正常读/写指令是一样的;
        /// 2.读的时候,都是以byte为单位的,如果程序只需要bit,那么还是以Byte为单位去读,将读出的部分按bit再去分解;
        /// 3.flag类型到底是什么,不是很清楚,有点类似三菱里的M点;这个也不需要去深究,一般项目里主要就是用DB块;
        /// 4.读取的长度如果是N(以byte为单位),那么返回的长度就是N*8(以bit为单位);怎么判断长度是否要*8;主要看后面是不是紧挨着数据,如果是数据,就需要*8;offset都是以bit为单位的;
        /// 5.正常读的操作都是DB块,所以在A[26] ~A[27]这个字节写入DB块的编号,但是对于input,output,flags这三个类型,是不需要数据块编号的不过我们可以随便写一个DB编号;
        /// </summary>
        /// <param name="address"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        private byte[] readyBytes(DeviceAddress address, int length)
        {
            try
            {
                if (IsConnect)
                {
                    if (address.FuctionCode == 0x81 || address.FuctionCode == 0x82 || address.FuctionCode == 0x83 || address.FuctionCode == 0x84)
                    {
                        lock (_async)
                        {
                            _handler++;
                            if (_handler > 65535)
                            {
                                _handler = 0;
                            }
                            byte[] sendBytes    = createReadHeader(address, _handler, length);
                            byte[] receiveBytes = new byte[25 + length];
                            byte[] dataBytes    = new byte[length];

                            _log.ByteSteamLog(ActionType.SEND, sendBytes);
                            _socket.Send(sendBytes, sendBytes.Length, SocketFlags.None);

                            //Thread.Sleep(10);
                            int readNumber = 0;

                            _socket.Receive(receiveBytes, 4, SocketFlags.None);
                            _socket.Receive(receiveBytes, 4, receiveBytes[3] - 4, SocketFlags.None);
                            readNumber = receiveBytes[3];

                            //报文数据记录
                            var logBytes = new byte[readNumber];
                            Array.Copy(receiveBytes, 0, logBytes, 0, readNumber);
                            _log.ByteSteamLog(ActionType.RECEIVE, logBytes);

                            if (readNumber == receiveBytes.Length)
                            {
                                Array.Copy(receiveBytes, 25, dataBytes, 0, length);
                                return(dataBytes);
                            }
                            else
                            {
                                _log.ErrorLog("S7Comm read data error:" + Convert.ToString(receiveBytes));
                                return(null);
                            }
                        }
                    }
                    else
                    {
                        _log.ErrorLog("S7Comm read function error:" + address.FuctionCode);
                        return(null);
                    }
                }
                else
                {
                    _log.ErrorLog("S7Comm  read data error:" + "No connect");
                    return(null);
                }
            }
            catch (Exception ex)
            {
                DisConnect();
                Log.ErrorLog(string.Format("S7Comm {0} ", ex.Message));
                return(null);
            }
        }
示例#12
0
        int WriteMultipleInternal(DeviceAddress[] addrArr, object[] buffer)
        {
            lock (_async)
            {
                if (dc == null)
                {
                    return(-1);
                }
                int           len = addrArr.Length;
                libnodave.PDU p2  = dc.prepareWriteRequest();
                for (int i = 0; i < len; i++)
                {
                    try
                    {
                        DeviceAddress addr = addrArr[i];
                        byte[]        b;
                        switch (addr.VarType)
                        {
                        case DataType.BOOL:
                            bool bl = Convert.ToBoolean(buffer[i]);
                            b = new byte[] { (byte)(bl ? 1 : 0) };
                            p2.addBitVarToWriteRequest(addr.Area, addr.DBNumber, addr.Start * 8 + addr.Bit, 1, b);
                            break;

                        case DataType.BYTE:
                            b = BitConverter.GetBytes(Convert.ToByte(buffer[i]));
                            p2.addVarToWriteRequest(addr.Area, addr.DBNumber, addr.Start, 1, b);
                            break;

                        case DataType.WORD:
                            b = BitConverter.GetBytes(Convert.ToUInt16(buffer[i])); Array.Reverse(b);
                            p2.addVarToWriteRequest(addr.Area, addr.DBNumber, addr.Start, 2, b);
                            break;

                        case DataType.SHORT:
                            b = BitConverter.GetBytes(Convert.ToInt16(buffer[i])); Array.Reverse(b);
                            p2.addVarToWriteRequest(addr.Area, addr.DBNumber, addr.Start, 2, b);
                            break;

                        case DataType.DWORD:
                            b = BitConverter.GetBytes(Convert.ToUInt32(buffer[i])); Array.Reverse(b);
                            p2.addVarToWriteRequest(addr.Area, addr.DBNumber, addr.Start, 4, b);
                            break;

                        case DataType.INT:
                            b = BitConverter.GetBytes(Convert.ToInt32(buffer[i])); Array.Reverse(b);
                            p2.addVarToWriteRequest(addr.Area, addr.DBNumber, addr.Start, 4, b);
                            break;

                        case DataType.FLOAT:
                            b = BitConverter.GetBytes(Convert.ToSingle(buffer[i])); Array.Reverse(b);
                            p2.addVarToWriteRequest(addr.Area, addr.DBNumber, addr.Start, 4, b);
                            break;

                        case DataType.STR:
                        {
                            b = Encoding.ASCII.GetBytes(buffer[i].ToString());
                            var b1 = new byte[2 + b.Length];
                            b1[0] = (byte)addrArr[i].DataSize;
                            b1[1] = (byte)b.Length;
                            b.CopyTo(b1, 2);
                            p2.addVarToWriteRequest(addr.Area, addr.DBNumber, addr.Start, addr.DataSize, b1);
                        }
                        break;
                        }
                    }
                    catch (Exception err)
                    {
                        if (OnClose != null)
                        {
                            OnClose(this, new ShutdownRequestEventArgs(err.Message));                 //可考虑把相应地址和数值加入
                        }
                    }
                }
                libnodave.resultSet rs = new libnodave.resultSet();
                return(dc.execWriteRequest(p2, rs));
            }
        }
示例#13
0
 public int WriteBools(DeviceAddress deviceAddress, bool[] datas)
 {
     throw new NotImplementedException();
 }
示例#14
0
 public int WriteDatas <T>(DeviceAddress deviceAddress, T[] datas)
 {
     throw new NotImplementedException();
 }
示例#15
0
        /// B[1] ~B[2]: 03 00 固定报文头;
        /// B[22]: FF 标识写入正常;
        private int writedata(DeviceAddress deviceAddress, byte[] source)
        {
            try
            {
                if (IsConnect)
                {
                    if (deviceAddress.FuctionCode == 0x81 || deviceAddress.FuctionCode == 0x82 || deviceAddress.FuctionCode == 0x83 || deviceAddress.FuctionCode == 0x84)
                    {
                        //_handler++;
                        //if (_handler > 65535)
                        //    _handler = 0;
                        //byte[] sendBytes = createWriteHeader(deviceAddress, _handler, datas);
                        byte[] receiveBytes = new byte[22];

                        _log.ByteSteamLog(ActionType.SEND, source);
                        _socket.Send(source, source.Length, SocketFlags.None);

                        //Thread.Sleep(10);
                        int readNumber = 0;

                        _socket.Receive(receiveBytes, 4, SocketFlags.None);
                        _socket.Receive(receiveBytes, 4, receiveBytes[3] - 4, SocketFlags.None);
                        readNumber = receiveBytes[3];

                        //报文数据记录
                        var logBytes = new byte[readNumber];
                        Array.Copy(receiveBytes, 0, logBytes, 0, readNumber);
                        _log.ByteSteamLog(ActionType.RECEIVE, logBytes);

                        if (readNumber == receiveBytes.Length)
                        {
                            if (receiveBytes[21] == 0xFF)
                            {
                                return(1);
                            }
                            else
                            {
                                return(-1);
                            }
                        }
                        else
                        {
                            string byteSteamString = "";
                            foreach (byte bt in receiveBytes)
                            {
                                byteSteamString += string.Format("{0:x2}", bt) + " ";
                            }
                            _log.ErrorLog("S7Comm write data error: receive byte " + byteSteamString);
                            return(-1);
                        }
                    }
                    else
                    {
                        _log.ErrorLog("S7Comm write function error:" + deviceAddress.FuctionCode);
                        return(-1);
                    }
                }
                else
                {
                    _log.ErrorLog("S7Comm  write data error:" + "No connect");
                    return(-1);
                }
            }
            catch (Exception ex)
            {
                DisConnect();
                Log.ErrorLog(string.Format("S7Comm {0} ", ex.Message));
                return(-1);
            }
        }
示例#16
0
 public Item <string>[] ReadStrings(DeviceAddress deviceAddress, ushort length)
 {
     throw new NotImplementedException();
 }
示例#17
0
 public Item <string> ReadString(DeviceAddress deviceAddress)
 {
     throw new NotImplementedException();
 }
示例#18
0
        public Item <byte>[] ReadBytes(DeviceAddress deviceAddress, ushort length)
        {
            var datas = readyBytes(deviceAddress, length);

            return(NetConvert.ToItems(datas, 0, length));
        }
示例#19
0
 public ITag FindItemByAddress(DeviceAddress addr)
 {
     return(null);
 }
示例#20
0
 public int WriteStrings(DeviceAddress deviceAddress, string[] datas)
 {
     throw new NotImplementedException();
 }
示例#21
0
 public Item <TResult> ReadData <TResult>(DeviceAddress deviceAddress)
 {
     throw new NotImplementedException();
 }
示例#22
0
        ItemData <Storage>[] ReadMultipleInternal(DeviceAddress[] addrsArr)
        {
            int len = addrsArr.Length;

            if (len <= Limit)
            {
                lock (_async)
                {
                    if (dc == null)
                    {
                        return(null);
                    }
                    libnodave.PDU p = dc.prepareReadRequest();
                    for (int i = 0; i < len; i++)
                    {
                        DeviceAddress addr = addrsArr[i];
                        if (addr.VarType == DataType.BOOL)
                        {
                            p.addBitVarToReadRequest(addr.Area, addr.DBNumber, addr.Start, addr.DataSize);
                        }
                        else
                        {
                            p.addVarToReadRequest(addr.Area, addr.DBNumber, addr.Start, addr.DataSize);
                        }
                    }
                    libnodave.resultSet rs = new libnodave.resultSet();
                    int res = dc.execReadRequest(p, rs);
                    ItemData <Storage>[] itemArr = new ItemData <Storage> [len];
                    for (int i = 0; i < len; i++)
                    {
                        res = dc.useResult(rs, i);
                        if (res > 0)
                        {
                            itemArr[i].Quality = QUALITIES.QUALITY_GOOD;
                            switch (addrsArr[i].VarType)
                            {
                            case DataType.BOOL:
                                itemArr[i].Value.Boolean = dc.getU8() > 0;    //需测试
                                break;

                            case DataType.BYTE:
                                itemArr[i].Value.Byte = (byte)dc.getU8();
                                break;

                            case DataType.WORD:
                                itemArr[i].Value.Word = (ushort)dc.getS16();
                                break;

                            case DataType.SHORT:
                                itemArr[i].Value.Int16 = (short)dc.getS16();
                                break;

                            case DataType.DWORD:
                                itemArr[i].Value.DWord = (uint)dc.getS32();
                                break;

                            case DataType.INT:
                                itemArr[i].Value.Int32 = dc.getS32();
                                break;

                            case DataType.FLOAT:
                                itemArr[i].Value.Single = dc.getFloat();
                                break;
                            }
                        }
                    }
                    return(itemArr);
                }
            }
            else
            {
                return(this.PLCReadMultiple(new NetByteCacheReader(), addrsArr));
            }
        }
示例#23
0
        public DeviceAddress GetDeviceAddress(string address)
        {
            DeviceAddress dv = DeviceAddress.Empty;

            if (string.IsNullOrEmpty(address))
            {
                return(dv);
            }
            switch (address[0])
            {
            case '0':
            {
                dv.Area = Modbus.fctReadCoil;
                int st;
                int.TryParse(address, out st);
                dv.Bit   = (byte)(st % 16);
                st      /= 16;
                dv.Start = st;
            }
            break;

            case '1':
            {
                dv.Area = Modbus.fctReadDiscreteInputs;
                int st;
                int.TryParse(address.Substring(1), out st);
                dv.Bit   = (byte)(st % 16);
                st      /= 16;
                dv.Start = st;
            }
            break;

            case '4':
            {
                int index = address.IndexOf('.');
                dv.Area = Modbus.fctReadHoldingRegister;
                if (index > 0)
                {
                    dv.Start = int.Parse(address.Substring(1, index - 1));
                    dv.Bit   = byte.Parse(address.Substring(index + 1));
                }
                else
                {
                    dv.Start = int.Parse(address.Substring(1));
                }
                dv.Start--;
            }
            break;

            case '3':
            {
                int index = address.IndexOf('.');
                dv.Area = Modbus.fctReadInputRegister;
                if (index > 0)
                {
                    dv.Start = int.Parse(address.Substring(1, index - 1));
                    dv.Bit   = byte.Parse(address.Substring(index + 1));
                }
                else
                {
                    dv.Start = int.Parse(address.Substring(1));
                }
                dv.Start--;
            }
            break;
            }
            return(dv);
        }
示例#24
0
        public bool AddItems(IList <TagMetaData> items)
        {
            int count = items.Count;

            if (_items == null)
            {
                _items   = new List <ITag>(count);
                _mapping = new Dictionary <short, string>(count);
            }
            lock (_server.SyncRoot)
            {
                for (int i = 0; i < count; i++)
                {
                    ITag        dataItem = null;
                    TagMetaData meta     = items[i];
                    if (meta.GroupID == this._id)
                    {
                        DeviceAddress addr = new DeviceAddress {
                            Start = meta.ID, DataSize = meta.Size, VarType = meta.DataType
                        };
                        switch (meta.DataType)
                        {
                        case DataType.BOOL:
                            dataItem = new BoolTag(meta.ID, addr, this);
                            break;

                        case DataType.BYTE:
                            dataItem = new ByteTag(meta.ID, addr, this);
                            break;

                        case DataType.WORD:
                        case DataType.SHORT:
                            dataItem = new ShortTag(meta.ID, addr, this);
                            break;

                        case DataType.DWORD:
                        case DataType.INT:
                            dataItem = new IntTag(meta.ID, addr, this);
                            break;

                        case DataType.FLOAT:
                            dataItem = new FloatTag(meta.ID, addr, this);
                            break;

                        case DataType.STR:
                            dataItem = new StringTag(meta.ID, addr, this);
                            break;
                        }
                        if (dataItem != null)
                        {
                            //dataItem.Active = meta.Active;
                            _items.Add(dataItem);
                            _plcReader.TransactItem(meta.Name);
                            _mapping.Add(meta.ID, meta.Address);
                            _server.AddItemIndex(meta.Name, dataItem);
                        }
                    }
                }
                return(true);
            }
        }
示例#25
0
 public ItemData <short> ReadInt16(DeviceAddress address)
 {
     byte[] bit = ReadBytes(address, 1);
     return(bit == null ? new ItemData <short>(0, 0, QUALITIES.QUALITY_BAD) :
            new ItemData <short>(BitConverter.ToInt16(bit, 0), 0, QUALITIES.QUALITY_GOOD));
 }
示例#26
0
 public int WriteUInt16(DeviceAddress address, ushort value)
 {
     return(_plcReader.Poke(_mapping[(short)address.Start], value.ToString()));
 }
示例#27
0
 public ItemData <byte> ReadByte(DeviceAddress address)
 {
     byte[] bit = ReadBytes(address, 1);
     return(bit == null ? new ItemData <byte>(0, 0, QUALITIES.QUALITY_BAD) :
            new ItemData <byte>(bit[0], 0, QUALITIES.QUALITY_GOOD));
 }
示例#28
0
 public int WriteBits(DeviceAddress address, byte value)
 {
     return(_plcReader.Poke(_mapping[(short)address.Start], value.ToString()));
 }
示例#29
0
 public ItemData <string> ReadString(DeviceAddress address, ushort size)
 {
     byte[] bit = ReadBytes(address, size);
     return(bit == null ? new ItemData <string>(string.Empty, 0, QUALITIES.QUALITY_BAD) :
            new ItemData <string>(Encoding.ASCII.GetString(bit), 0, QUALITIES.QUALITY_GOOD));
 }
示例#30
0
 public InternalMessage(DeviceAddress device, string data, string description)
     : this(device, description, Encoding.UTF8.GetBytes(data))
 {
 }
示例#31
0
 public ItemData <float> ReadFloat(DeviceAddress address)
 {
     byte[] bit = ReadBytes(address, 2);
     return(bit == null ? new ItemData <float>(0f, 0, QUALITIES.QUALITY_BAD) :
            new ItemData <float>(BitConverter.ToSingle(bit, 0), 0, QUALITIES.QUALITY_GOOD));
 }
示例#32
0
 public ItemData <bool> ReadBit(DeviceAddress address)
 {
     byte[] bit = ReadBytes(address, 1);
     return(bit == null ? new ItemData <bool>(false, 0, QUALITIES.QUALITY_BAD) :
            new ItemData <bool>((bit[0] & (1 << (address.Bit))) > 0, 0, QUALITIES.QUALITY_GOOD));
 }
示例#33
0
        protected override unsafe int Poll()
        {
            short[] cache = (short[])_cacheReader.Cache;
            int     k     = 0;

            foreach (PDUArea area in _rangeList)
            {
                byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据
                if (rcvBytes == null)
                {
                    _plcReader.Connect();
                    return(-1);
                }
                else
                {
                    int len = rcvBytes.Length / 2;
                    fixed(byte *p1 = rcvBytes)
                    {
                        short *prcv  = (short *)p1;
                        int    index = area.StartIndex;//index指向_items中的Tag元数据
                        int    count = index + area.Count;

                        while (index < count)
                        {
                            DeviceAddress addr    = _items[index].Address;
                            int           iShort  = addr.CacheIndex;
                            int           iShort1 = iShort - k;
                            if (addr.VarType == DataType.BOOL)
                            {
                                int           tmp  = prcv[iShort1] ^ cache[iShort];
                                DeviceAddress next = addr;
                                if (tmp != 0)
                                {
                                    while (addr.Start == next.Start)
                                    {
                                        if ((tmp & (1 << next.Bit)) > 0)
                                        {
                                            _changedList.Add(index);
                                        }
                                        if (++index < count)
                                        {
                                            next = _items[index].Address;
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    while (addr.Start == next.Start && ++index < count)
                                    {
                                        next = _items[index].Address;
                                    }
                                }
                            }
                            else
                            {
                                if (addr.DataSize <= 2)
                                {
                                    if (prcv[iShort1] != cache[iShort])
                                    {
                                        _changedList.Add(index);
                                    }
                                }
                                else
                                {
                                    int size = addr.DataSize / 2;
                                    for (int i = 0; i < size; i++)
                                    {
                                        if (prcv[iShort1 + i] != cache[iShort + i])
                                        {
                                            _changedList.Add(index);
                                            break;
                                        }
                                    }
                                }
                                index++;
                            }
                        }
                        for (int j = 0; j < len; j++)
                        {
                            cache[j + k] = prcv[j];
                        }//将PLC读取的数据写入到CacheReader中
                    }

                    k += len;
                }
            }
            return(1);
        }
示例#34
0
文件: Manager.cs 项目: temur03/imBMW
 public static bool FindDevice(DeviceAddress device)
 {
     return FindDevice(device, findDeviceTimeout);
 }
示例#35
0
 public string GetAddress(DeviceAddress address)
 {
     return(string.Empty);
 }
示例#36
0
文件: Manager.cs 项目: temur03/imBMW
 public static void AddMessageReceiverForDestinationDevice(DeviceAddress destination, MessageReceiver callback)
 {
     MessageReceiverList.Add(new MessageReceiverRegistration(DeviceAddress.Unset, destination, callback, MessageReceiverRegistration.MatchType.Destination));
 }
示例#37
0
        public DeviceAddress GetDeviceAddress(string address)
        {
            DeviceAddress plcAddr = new DeviceAddress();

            if (string.IsNullOrEmpty(address) || address.Length < 2)
            {
                return(plcAddr);
            }
            if (address.Substring(0, 2) == "DB")
            {
                int index = 2;
                for (int i = index; i < address.Length; i++)
                {
                    if (!char.IsDigit(address[i]))
                    {
                        index = i; break;
                    }
                }
                plcAddr.Area     = libnodave.daveDB;
                plcAddr.DBNumber = ushort.Parse(address.Substring(2, index - 2));
                string str = address.Substring(index + 1);
                if (!char.IsDigit(str[0]))
                {
                    for (int i = 1; i < str.Length; i++)
                    {
                        if (char.IsDigit(str[i]))
                        {
                            index = i; break;
                        }
                    }
                    if (str[2] == 'W')
                    {
                        int index1 = str.IndexOf('.');
                        if (index1 > 0)
                        {
                            int  start = int.Parse(str.Substring(3, index1 - 3));
                            byte bit   = byte.Parse(str.RightFrom(index1));
                            plcAddr.Start = bit > 8 ? start : start + 1;
                            plcAddr.Bit   = (byte)(bit > 7 ? bit - 8 : bit);
                            return(plcAddr);
                        }
                    }
                    str = str.Substring(index);
                }
                index = str.IndexOf('.');
                if (index < 0)
                {
                    plcAddr.Start = int.Parse(str);
                }
                else
                {
                    plcAddr.Start = int.Parse(str.Substring(0, index));
                    plcAddr.Bit   = byte.Parse(str.RightFrom(index));
                }
            }
            else
            {
                plcAddr.DBNumber = 0;
                char chr = address[0];
                if (dict.ContainsKey(chr))
                {
                    plcAddr.Area = dict[chr];
                    int index = address.IndexOf('.');
                    if (address[1] == 'W')
                    {
                        if (index > 0)
                        {
                            int  start = int.Parse(address.Substring(2, index - 2));
                            byte bit   = byte.Parse(address.RightFrom(index));
                            plcAddr.Start = bit > 8 ? start : start + 1;
                            plcAddr.Bit   = (byte)(bit > 7 ? bit - 8 : bit);
                        }
                        else
                        {
                            plcAddr.Start = int.Parse(address.Substring(2));
                        }
                    }
                    else
                    {
                        if (index > 0)
                        {
                            plcAddr.Start = int.Parse(address.Substring(1, index - 1));
                            plcAddr.Bit   = byte.Parse(address.RightFrom(index));
                        }
                        else
                        {
                            plcAddr.Start = int.Parse(address.Substring(1));
                        }
                    }
                }
            }
            return(plcAddr);
        }
示例#38
0
文件: Manager.cs 项目: temur03/imBMW
 public static void AddMessageReceiverForSourceOrDestinationDevice(DeviceAddress source, DeviceAddress destination, MessageReceiver callback)
 {
     MessageReceiverList.Add(new MessageReceiverRegistration(source, destination, callback, MessageReceiverRegistration.MatchType.SourceOrDestination));
 }
示例#39
0
 public ItemData <object> ReadValue(DeviceAddress address)
 {
     return(this.ReadValueEx(address));
 }
示例#40
0
 public Message(DeviceAddress source, DeviceAddress destination, params byte[] data)
     : this(source, destination, null, data)
 {
 }
示例#41
0
 public int WriteValue(DeviceAddress address, object value)
 {
     return(this.WriteValueEx(address, value));
 }
示例#42
0
 public DBusMessage(DeviceAddress device, params byte[] data)
     : this(device, null, data)
 {
 }
示例#43
0
 public string GetAddress(DeviceAddress deviceAddress)
 {
     throw new NotImplementedException();
 }