Esempio n. 1
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);
            }
        }
Esempio n. 2
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);
                }
            }
        }