コード例 #1
0
        /// <summary>
        /// Читает массив слов из устройства и обновляет UI
        /// </summary>
        /// <param name="_configFormDevice"></param>
        private void AnalyzeConfigFromDevice(ushort[] _configFormDevice)
        {
            if (_configFormDevice == null)
            {
                return;
            }
            if (_configFormDevice.Count() == 5)
            {
                byte[] byteArray = ArrayExtension.UshortArrayToByteArray(_configFormDevice);
                IOTimeout = Converters.Convert.ConvertFromDecToHex(byteArray[0]);

                ResponseAwait        = _configFormDevice[1];
                TransmitEnableDelay  = _configFormDevice[3];
                TransmitDisableDelay = _configFormDevice[4];
                TypeAddress          = Converters.Convert.ConvertFromDecToHexStr(byteArray[1]);
                IOTimeout            = Converters.Convert.ConvertFromDecToHex(byteArray[0]);
                Config915Series config = new Config915Series(byteArray[5]);

                SelectedSpeed   = config.ModbusSpeed;
                BitValues       = config.BitValues;
                ParityOdd       = config.ParityOdd;
                ParityExistence = config.ParityExistence;
                StopBitsCount   = config.StopBitCount;
            }
            else
            {
                MessageBox.Show("Ошибка при чтении конфигурации.");
            }
        }
コード例 #2
0
        /// <summary>
        /// Формирует массив слов, который будет записан в устройство
        /// </summary>
        /// <returns></returns>
        private ushort[] GenerateConfigForDevice()
        {
            List <byte>     byteArr      = new List <byte>();
            List <ushort>   confToDevice = new List <ushort>();
            Config915Series conf915      = new Config915Series(SelectedSpeed, BitValues, ParityOdd, ParityExistence, StopBitsCount);

            SpreadTypeAddress();

            byteArr.Add(IOTimeout);
            byteArr.Add((byte)((Type << 4) + Address));
            confToDevice.Add(ArrayExtension.ByteArrayToUshortArray(byteArr.ToArray()).First());
            confToDevice.Add(ResponseAwait);
            confToDevice.Add(conf915.Config);
            confToDevice.Add(TransmitEnableDelay);
            confToDevice.Add(TransmitDisableDelay);

            return(confToDevice.ToArray());
        }
コード例 #3
0
        /// <summary>
        /// Запись запросов для люксметра (обожаю, когда вылазят новые требования, когда я уже всю логику взаимодействия продумал)
        /// </summary>
        /// <param name="_pos"></param>
        public async void WriteLuxmetrRequest(int _pos)
        {
            List <byte>     byteArr      = new List <byte>();
            List <ushort>   confToDevice = new List <ushort>();
            Config915Series conf915      = new Config915Series(115200, false, false, false, false);

            byteArr.Add(100);
            byteArr.Add((byte)((0x0E << 4) + _pos));
            confToDevice.Add(ArrayExtension.ByteArrayToUshortArray(byteArr.ToArray()).First());
            confToDevice.Add(200);
            confToDevice.Add(conf915.Config);
            confToDevice.Add(40);
            confToDevice.Add(20);

            ushort[] req915lower = confToDevice.ToArray();

            byteArr.Clear();
            confToDevice.Clear();

            //запрос для люксметра, пишется в область памяти запросов к подчиненным устройствам
            byteArr.Add(0x00); //период
            byteArr.Add(0x01); //адрес+тип модуля
            byteArr.Add(0x00); //команда
            byteArr.Add(0x00); //адрес пар-ра в модуле 1
            byteArr.Add(0x00); //адрес пар-ра в модуле 2
            byteArr.Add(0x06); //адрес пар-ра в базе 1
            byteArr.Add(0x40); //ажрес пар-ра в базе 2
            byteArr.Add(0x01); //число пар-ров

            byte[] byteArray = byteArr.ToArray();

            ArrayExtension.SwapArrayItems(ref byteArray);

            confToDevice.AddRange(ArrayExtension.ByteArrayToUshortArray(byteArray));

            ushort[]      reqLux = confToDevice.ToArray();
            ModuleRequest mr     = new ModuleRequest(reqLux);

            StringBuilder sb = new StringBuilder();

            sb.AppendLine("Будет произведена запись со следующими параметрами:");
            sb.AppendLine("Модуль связи: МС915 с низом на позицию " + _pos.ToString());
            sb.AppendLine("Ожидание ответа: 200 (*0,5 мс)");
            sb.AppendLine("Скорость: 115200");
            sb.AppendLine("Биты данных: 8 бит");
            sb.AppendLine("Паритет: нечет");
            sb.AppendLine("Паритет: нет");
            sb.AppendLine("Число стоп битов: 1 бит");
            sb.AppendLine("Таймаут ввода/вывода: 100 (*0,1 мс)");
            sb.AppendLine("Включение передачи: 40 (*0,1 мс)");
            sb.AppendLine("Выключение передачи: 20 (*0,1 мс)");

            sb.AppendLine("Также будет добавлен запрос к подчиненному устройтсву(люксметру):");
            sb.AppendLine(mr.UIRequest);
            sb.AppendLine("Продолжить?");

            if (MessageBox.Show(sb.ToString(), "Внимание", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                try
                {
                    ushort[] LRC = new ushort[] { 1 };//договор был изначально на одно устройство, так что ничего придумывать не буду
                    await RTUConnectionGlobal.SendDataByAddressAsync(1, LOWER_MODULE_REQUEST_TO_SLAVES_COUNT_ADDRESS, LRC);

                    Thread.Sleep(100);
                    await RTUConnectionGlobal.SendDataByAddressAsync(1, LOWER_MODULE_ADDRESS, req915lower);

                    Thread.Sleep(100);
                    await RTUConnectionGlobal.SendDataByAddressAsync(1, SLAVE_MODULE_REQUEST_START_ADDRESS, reqLux);

                    Thread.Sleep(100);
                    ShowMessage("Запись произведена.", "Информация", MessageBoxImage.Information);
                }
                catch
                {
                    ShowMessage("При записи в устройство произошла ошибка.", "Внимение", MessageBoxImage.Warning);
                }
            }
            else
            {
                ShowMessage("Запись не была произведена", "Информация", MessageBoxImage.Information);
            }
        }
コード例 #4
0
        /// <summary>
        /// Анализ модулей, прочитанных из устройства + их расстановка по местам
        /// </summary>
        private async void AnalyzeModulesFromDevice()
        {
            byte _firstModulePos;

            if (IsToggleCrate918Checked)
            {
                _firstModulePos = 0;
            }
            else
            {
                _firstModulePos = 1;
            }
            /// читаем модуль с верхом
            try
            {
                ushort[] upperModule = await RTUConnectionGlobal.GetDataByAddress(1, UPPER_MODULE_ADDRESS, 5);

                if (upperModule != null)
                {
                    byte[] byteArrayUpper    = ArrayExtension.UshortArrayToByteArray(upperModule);
                    string _typeAddressUpper = Converters.Convert.ConvertFromDecToHexStr(byteArrayUpper[1]);
                    byte   _typeUpper        = Converters.Convert.ConvertFromHexToDec((byte)Int32.Parse(_typeAddressUpper.First().ToString(), System.Globalization.NumberStyles.HexNumber));
                    byte   _addressUpper     = Converters.Convert.ConvertFromHexToDec((byte)Int32.Parse(_typeAddressUpper.Last().ToString(), System.Globalization.NumberStyles.HexNumber));
                    string upperName         = "Заглушка";
                    if (_typeUpper != 0)
                    {
                        if (_typeUpper == 0x0E)
                        {
                            //немного костыли, но че уж поделать, если таски возникают после того, как ниписано практически все
                            Config915Series cfg915 = new Config915Series(byteArrayUpper[5]);
                            if (cfg915.ModbusSpeed == 115200)
                            {
                                upperName = "MС915";
                            }
                            if (cfg915.ModbusSpeed == 19200)
                            {
                                upperName = "MС917";
                            }
                        }
                        if (_typeUpper == 0x0F)
                        {
                            upperName = "MС911";
                        }
                        this.ModuleListForUI[_addressUpper - _firstModulePos] = upperName;
                    }
                }
            }
            catch (Exception ex)
            {
                ShowMessage("При чтении запроса модуля связи с верхом произошла ошибка.", "Внимание", MessageBoxImage.Warning);
            }
            /// читаем модуль с низом
            try
            {
                ushort[] slaveCount = await RTUConnectionGlobal.GetDataByAddress(1, LOWER_MODULE_REQUEST_TO_SLAVES_COUNT_ADDRESS, 1);

                if (slaveCount[0] != 0)
                {
                    ushort[] lowerModule = await RTUConnectionGlobal.GetDataByAddress(1, LOWER_MODULE_ADDRESS, 5);

                    if (lowerModule != null)
                    {
                        byte[] byteArrayLower    = ArrayExtension.UshortArrayToByteArray(lowerModule);
                        string _typeAddressLower = Converters.Convert.ConvertFromDecToHexStr(byteArrayLower[1]);
                        byte   _typeLower        = Converters.Convert.ConvertFromHexToDec((byte)Int32.Parse(_typeAddressLower.First().ToString(), System.Globalization.NumberStyles.HexNumber));
                        byte   _addressLower     = Converters.Convert.ConvertFromHexToDec((byte)Int32.Parse(_typeAddressLower.Last().ToString(), System.Globalization.NumberStyles.HexNumber));
                        string lowerName         = "Заглушка";
                        if (_typeLower == 0x0E)
                        {
                            lowerName = "Люксметр";
                        }
                        this.ModuleListForUI[_addressLower - _firstModulePos] = lowerName;
                    }
                }
            }
            catch (Exception ex)
            {
                ShowMessage("При чтении запроса модуля связи с низом произошла ошибка.", "Внимание", MessageBoxImage.Warning);
            }
            ///модули

            for (int i = 0; i < RequestsFromDevice.Count(); i++)
            {
                this.ModuleListForUI[RequestsFromDevice[i].CrateAddress - _firstModulePos] = GetModuleNameFromType(RequestsFromDevice[i].Type, RequestsFromDevice[i].ParameterCount);
            }
            ///верх


            ///низ
        }