Exemple #1
0
        public static bool WriteBit(bool value, ushort addrbit)
        {
            var res = false;

            try
            {
                if (_connector.Connect())
                {
                    var queryKn  = Modbus.CreateWriteBitArray(_connector.KNNumber, _connector.DeviceNumber, addrbit, value);
                    var answerKn = _connector.ReadWrite(queryKn);

                    var query  = queryKn.Skip(2).Take(8).ToArray();
                    var answer = answerKn.Skip(2).Take(8).ToArray();
                    if (answer.Length == query.Length)
                    {
                        res = !query.Where((t, i) => t != answer[i]).Any();
                    }
                }
            }
            catch (Exception error)
            {
                return(false);
            }
            finally
            {
                if (_connector.Disconnect())
                {
                    res = false;
                }
            }
            return(res);
        }
Exemple #2
0
        public static bool WriteWords(Slot slot)
        {
            lock (typeof(DataTransfer))
            {
                bool          res     = true;
                List <byte[]> querys  = new List <byte[]>();
                List <byte[]> answers = new List <byte[]>();

                try
                {
                    if (_connector.Connect())
                    {
                        if (slot.Size >= 120)
                        {
                            PrepareListWriteWords(ref querys, ref answers, slot);
                        }
                        else
                        {
                            byte[] query = Modbus.CreateWriteWordsArray(_connector.KNNumber, _connector.DeviceNumber,
                                                                        slot.Start, slot.Value);
                            querys.Add(query);
                            byte[] answer = _connector.ReadWrite(query);
                            if (answer.Length != 8)
                            {
                                throw new Exception("Считано неверное количество байт");
                            }
                            answers.Add(answer);
                        }
                    }
                    else
                    {
                        res = false;
                    }
                }
                catch (Exception)
                {
                    res = false;
                }
                finally
                {
                    //if (_connector.Disconnect() || !res)
                    //{
                    //    res = false;
                    //}
                }
                return(res);
            }
        }
Exemple #3
0
 public static bool WriteWord(Slot slot)
 {
     lock (typeof(DataTransfer))
     {
         bool res = true;
         try
         {
             if (_connector.Connect())
             {
                 byte[] query = Modbus.CreateWriteWordArray(_connector.KNNumber, _connector.DeviceNumber,
                                                            slot.Start, slot.Value[0]);
                 byte[] answer = _connector.ReadWrite(query);
                 //if (answer[2] != 4)
                 //{
                 //    throw new Exception("Считано неверное количество байт");
                 //}
             }
             else
             {
                 res = false;
             }
         }
         catch
         {
             res = false;
         }
         finally
         {
             if (_connector.Disconnect() || !res)
             {
                 res = false;
             }
         }
         return(res);
     }
 }
Exemple #4
0
        /// <summary>
        /// Метод по считыванию слов
        /// </summary>
        /// <param name="slot">Слот, хранящий данные</param>
        /// <returns></returns>
        public static ushort[] ReadWords(Slot slot)
        {
            lock (typeof(DataTransfer))
            {
                bool            res     = false;
                List <byte[]>   querys  = new List <byte[]>();
                List <byte[]>   answers = new List <byte[]>();
                List <ushort[]> values  = new List <ushort[]>();

                try
                {
                    if (_connector.Connect())
                    {
                        slot.Loaded = false;

                        if (slot.Size >= 120)
                        {
                            PrepareListReadWords(ref querys, ref answers, slot);
                        }
                        else
                        {
                            byte[] query = Modbus.CreateReadWordsArray(_connector.KNNumber, _connector.DeviceNumber, slot.Start, slot.Size);
                            querys.Add(query);
                            byte[] answer = _connector.ReadWrite(query);
                            if (answer[2] != /*5 +*/ slot.Size * 2)
                            {
                                throw new Exception("Считано неверное количество байт");
                            }
                            answers.Add(answer);
                        }

                        for (int i = 0; i < answers.Count; i++)
                        {
                            List <byte> mbVals = new List <byte>(answers[i][2]);
                            mbVals = answers[i].ToList().Skip(3).Take(answers[i][2]).ToList();
                            ushort[] value = new ushort[(mbVals.Count) / 2];
                            for (int j = 0; j < mbVals.Count; j += 2)
                            {
                                value[(j) / 2] = Common.TOWORD(mbVals[j], mbVals[j + 1]);
                            }
                            values.Add(value);
                        }

                        ushort[] result        = new ushort[slot.Size];
                        int      lastByteIndex = 0;
                        for (int i = 0; i < values.Count; i++)
                        {
                            Array.ConstrainedCopy(values[i], 0, result, lastByteIndex, values[i].Length);
                            lastByteIndex += values[i].Length;
                        }

                        slot.Value  = result;
                        slot.Loaded = true;
                        res         = true;
                    }
                }
                catch (Exception ex)
                {
                    res = false;
                    if (slot != null)
                    {
                        slot.Loaded = false;
                    }
                }
                finally
                {
                    //if (_connector.Disconnect() || !res)
                    //{
                    //    res = false;
                    //}
                }
                return(res ? slot.Value : null);
            }
        }
Exemple #5
0
        private static void PrepareListWriteWords(ref List <byte[]> querys, ref List <byte[]> answers, Slot slot)
        {
            lock (typeof(DataTransfer))
            {
                int             temp        = 0;
                ushort          oneSlotSize = 0x64;
                List <ushort[]> values      = new List <ushort[]>();

                // мы не можем записывать в устройство больше 256 байт.
                // поэтому большой запрос мы разбиваем на несколько
                int    queryCount    = slot.Size / oneSlotSize;
                ushort lastQuerySize = (ushort)(slot.Size % oneSlotSize);
                ushort addressTmp    = slot.Start;

                if (lastQuerySize != 0)
                {
                    temp = 1;
                }

                // заполнение раздробленных частей
                int lastByteIndex = 0;
                for (int i = 0; i < queryCount + temp; i++)
                {
                    ushort[] value = null;
                    if (i == queryCount + temp - 1 && temp == 1)
                    {
                        value = new ushort[lastQuerySize];
                        Array.ConstrainedCopy((slot.Value), lastByteIndex, value, 0, value.Length);
                        lastByteIndex += value.Length;
                    }
                    else
                    {
                        value = new ushort[oneSlotSize];
                        Array.ConstrainedCopy((slot.Value), lastByteIndex, value, 0, value.Length);
                        lastByteIndex += value.Length;
                    }
                    values.Add(value);
                }

                // создание модбас запросов для каждой части
                for (int i = 0; i < queryCount + temp; i++)
                {
                    if (i == queryCount + temp - 2 && temp == 1)
                    {
                        byte[] query = Modbus.CreateWriteWordsArray(_connector.KNNumber, _connector.DeviceNumber,
                                                                    addressTmp, values[i]);
                        querys.Add(query);
                        addressTmp += oneSlotSize;
                    }
                    else if (i == queryCount + temp - 1 && temp == 1)
                    {
                        byte[] query = Modbus.CreateWriteWordsArray(_connector.KNNumber, _connector.DeviceNumber,
                                                                    addressTmp, values[i]);
                        querys.Add(query);
                        addressTmp += oneSlotSize;
                    }
                    else
                    {
                        byte[] query = Modbus.CreateWriteWordsArray(_connector.KNNumber, _connector.DeviceNumber,
                                                                    addressTmp, values[i]);
                        querys.Add(query);
                        addressTmp += oneSlotSize;
                    }
                }

                //TODO: отправка запроса в устройство
                foreach (byte[] q in querys)
                {
                    byte[] answer = _connector.ReadWrite(q);

                    // проверить ответ
                    answers.Add(answer);
                }
            }
        }
Exemple #6
0
        private static void PrepareListReadWords(ref List <byte[]> querys, ref List <byte[]> answers, Slot slot)
        {
            lock (typeof(DataTransfer))
            {
                int    temp        = 0;
                ushort oneSlotSize = 0x64;

                int    queryCount    = slot.Size / oneSlotSize;
                ushort lastQuerySize = (ushort)(slot.Size % oneSlotSize);
                ushort addressTmp    = slot.Start;

                if (lastQuerySize != 0)
                {
                    temp = 1;
                }

                for (int i = 0; i < queryCount + temp; i++)
                {
                    if (temp == 0)
                    {
                        byte[] query = Modbus.CreateReadWordsArray(_connector.KNNumber, _connector.DeviceNumber,
                                                                   addressTmp, oneSlotSize);
                        querys.Add(query);
                        addressTmp += oneSlotSize;
                    }
                    else
                    {
                        if (i == queryCount + temp - 2)
                        {
                            byte[] query = Modbus.CreateReadWordsArray(_connector.KNNumber, _connector.DeviceNumber,
                                                                       addressTmp, oneSlotSize);
                            querys.Add(query);
                            addressTmp += oneSlotSize;
                        }
                        else if (i == queryCount + temp - 1)
                        {
                            byte[] query = Modbus.CreateReadWordsArray(_connector.KNNumber, _connector.DeviceNumber,
                                                                       addressTmp, lastQuerySize);
                            querys.Add(query);
                            addressTmp += oneSlotSize;
                        }
                        else
                        {
                            byte[] query = Modbus.CreateReadWordsArray(_connector.KNNumber, _connector.DeviceNumber,
                                                                       addressTmp, oneSlotSize);
                            querys.Add(query);
                            addressTmp += oneSlotSize;
                        }
                    }
                }
                for (int i = 0; i < querys.Count; i++)
                {
                    if (temp == 0)
                    {
                        byte[] answer = _connector.ReadWrite(querys[i]);
                        if (answer[2] != 5 + oneSlotSize * 2)
                        {
                            throw new Exception("Считано неверное количество байт");
                        }
                        answers.Add(answer);
                    }
                    else
                    {
                        if (i != queryCount + temp - 1)
                        {
                            byte[] answer = _connector.ReadWrite(querys[i]);
                            if (answer[2] != oneSlotSize * 2)
                            {
                                throw new Exception("Считано неверное количество байт");
                            }
                            answers.Add(answer);
                        }
                        else
                        {
                            byte[] answer = _connector.ReadWrite(querys[i]);
                            if (answer[2] != lastQuerySize * 2)
                            {
                                throw new Exception("Считано неверное количество байт");
                            }
                            answers.Add(answer);
                        }
                    }
                }
            }
        }