/// <summary>
        /// Инициализирует список устройств типа КИП из устройств доступных в сети
        /// </summary>
        private void InitKipList(DeviceBase[] devices)
        {
            DeviceType deviceType;
            DataRow row;

            List<DeviceBase> result = new List<DeviceBase>();

            if (devices != null)
            {                
                for (int i = 0; i < devices.Length; i++)
                {
                    deviceType = devices[i].DeviceType;
                    
                    if ((deviceType == DeviceType.KIP_BATTERY_POWER_v1) ||
                        (deviceType == DeviceType.KIP_MAIN_POWERED_v1))
                    {
                        result.Add(devices[i]);
                        //devices[i].DataWasChanged += 
                        //    new EventHandler(EventHandler_Device_DataWasChanged);
                        row = this._PivotTable.NewRow();
                        row["NodeId"] = devices[i].NodeId;
                        row["Location"] = devices[i].LocationName;
                        this._PivotTable.Rows.Add(row);
                        // Обновляем данные
                        //this.UpdateDivice(devices[i]);
                    }
                }
                this._KipList = result.ToArray();
            }
            else
            {
                throw new NullReferenceException();
            }
            return;
        }
Exemple #2
0
        /// <summary>
        /// Конструктор для десериализации
        /// </summary>
        /// <param name="info"></param>
        /// <param name="context"></param>
        //protected Device(SerializationInfo info, StreamingContext context)
        //{
        //    _DeviceType = (DeviceType)info.GetValue(
        //        "DeviceType", typeof(DeviceType));
        //    _NodeId = info.GetByte("NodeId");
        //    _LocationName = info.GetString("Location");
        //    _PollingInterval = info.GetUInt32("PollingInterval");
        //    SerialNumber = info.GetUInt64("SerialNumber");

        //    _Status = DeviceStatus.Stopped;
        //    IProfile profile = Prototype.Create(_DeviceType);
        //    // Создаём словарь объектов устройства
        //    _ObjectDictionary = new ObjectCollection(this);
        //    foreach (ObjectInfo objinfo in profile.ObjectInfoList)
        //    {
        //        _ObjectDictionary.Add(new DataObject(objinfo));
        //    }
        //    // Устанавливаем версии ПО и аппаратуры
        //    ProductVersion version = new ProductVersion();
        //    version.Version = profile.SoftwareVersion;
        //    SetObject(0x2001, version);
        //    version.Version = profile.HardwareVersion;
        //    SetObject(0x2002, version);
        //}

        #endregion

        #region Methods

        /// <summary>
        /// Создаём устойство на основе строки в формате
        /// Type={0}; Network={1}; Address={2}; Location={3}; PollingInterval={4}
        /// </summary>
        /// <param name="formatedString"></param>
        /// <returns></returns>
        public static DeviceBase Create(string formattedString)
        {
            DeviceBase device;

            Dictionary <string, string> parameters =
                DeviceBase.GetParameters(formattedString);

            DeviceType type = (DeviceType)Enum.Parse(typeof(DeviceType),
                                                     parameters["Type"]);

            device = DeviceBase.Create(type);
            device._LocationName    = parameters["Location"];
            device._NodeId          = Byte.Parse(parameters["Address"]);
            device._PollingInterval = UInt32.Parse(parameters["PollingInterval"]);
            device.SerialNumber     = UInt64.Parse(parameters["SerialNumber"]);

            UInt32 networkId = UInt32.Parse(parameters["NetworkId"]);

            // Ищем сеть с данным именем если она сущестует, у устанавливаем
            // свойство устройста
            if (NetworksManager.Instance.Networks.Contains(networkId))
            {
                device._Network = NetworksManager.Instance.Networks[networkId];
            }

            return(device);
        }
 /// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="networkController"></param>
 public ParametersPivotTable(DeviceBase[] devices)
 {
     // Создаём таблицу
     this.InitTable();
     // Формируем списко КИП-ов
     this.InitKipList(devices);
     return;
 }
 public ModbusAdapterContext(DeviceBase canDevice, File modbusDevice)
 {
     CanDevice = new CAN();
     CanDevice.NetworkId = canDevice.Network.NetworkId;
     CanDevice.NodeId = canDevice.NodeId;
     ModbusDevice = new Modbus();
     ModbusDevice.FileNumber = modbusDevice.Number;
 }
Exemple #5
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="devices"></param>
 public Context(DeviceBase[] devices)
 {
     _Devices = new LinkedList<DeviceContext>();
     foreach (DeviceBase device in devices)
     {
         _Devices.AddLast(new LinkedListNode<DeviceContext>(
             new DeviceContext(device)));
     }
     _CurrentContext = _Devices.First;
 }
Exemple #6
0
 /// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="device">Модель устройства для которого создаётся данный контекст</param>
 public DeviceContext(DeviceBase device)
 {            
     _Device = device;
     _Objects = new LinkedList<ObjectInfo>(_Device.Profile.ObjectInfoList);
     _CurrentObject = _Objects.First;
 }
        public static void Copy(File modbusDevice, DeviceBase canDevice)
        {
            Record rec;
            UInt16 index;
            UInt32 var32;

            if (canDevice.DeviceType != DeviceType.KIP_BATTERY_POWER_v1)
            {
                throw new InvalidCastException("Требуется устройство CAN типа КИП-9811");
            }
            if (modbusDevice.Records[KIP9811Address.VisitingCard.DeviceType].Value !=
                (UInt16)DeviceType.KIP_BATTERY_POWER_v1)
            {
                throw new InvalidCastException("Требуется устройство modbus типа КИП-9811");
            }

            // Адреса, которые обрабатываются по особому
            UInt16[] exclusions = new ushort[] { 0x000A, 0x000B, 0x000C, 0x000E, 0x0014,
                0x0019, 0x0020, 0x0024, 0x0025, 0x0026, 0x0036, 0x0037 };
            // Адреса, которые исключаются из обработки
            UInt16[] nothandled = new ushort[] { 0x0000, 0x0006, 0x0007, 0x0008, 0x0009, 
                0x000D, 0x000E };
            // Копируем данные
            foreach (UInt16 modbusAddress in _TableAddress.Keys)
            {
                // Исключаем из обработки адреса
                if (Exist(nothandled, modbusAddress))
                {
                    continue;
                }

                // Адреса для обработки особым способом,
                // так же пропускаем, их обработаем ниже
                if (Exist(exclusions, modbusAddress))
                { 
                    continue; 
                } 

                // Получаем индекс объекта CAN-устройства
                index = _TableAddress[modbusAddress];
                // Копируем значение объекта в запись modbus 
                modbusDevice.Records[modbusAddress].Value = 
                    (UInt16)canDevice.ObjectDictionary[index].Value; 
            }

            // Теперь обрабатываем сложные параметры
            // 0x0007
            //modbusDevice.Records[0x0007].Value = 0; //TODO Код производителя, всега неопределён
            // 0x000A 
            modbusDevice.Records[0x000A].Value = Convert.ToUInt16(canDevice.NodeId);
            // 0x000B
            if (canDevice.Status == DeviceStatus.CommunicationError)
            { modbusDevice.Records[0x000B].Value = 0; }
            else
            { modbusDevice.Records[0x000B].Value = 1; }
            // 0x000C
            //modbusDevice.Records[0x000C].Value = 0; //TODO
            // 0x000E
            switch (canDevice.Status)
            {
                case DeviceStatus.CommunicationError:
                case DeviceStatus.ConfigurationError:
                case DeviceStatus.Stopped:
                    {
                        modbusDevice.Records[0x000E].Value =
                            (UInt16)DeviceStatus.Stopped; // Stopped
                        break;
                    }
                case DeviceStatus.Operational:
                    {
                        modbusDevice.Records[0x000E].Value =
                            (UInt16)DeviceStatus.Operational;
                        break;
                    }
                case DeviceStatus.Preoperational:
                    {
                        modbusDevice.Records[0x000E].Value =
                            (UInt16)DeviceStatus.Preoperational;
                        break;
                    }
                default: { throw new NotSupportedException(); }
            }
            //0x0014 TODO
            //0x0019 TODO
            //0x0020 TODO
            //0x0024
            modbusDevice.Records[0x0024].Value = canDevice.ElectrodeArea;
            //0x0025, 0x0026
            var32 = (UInt32)canDevice.GetObject(_TableAddress[0x0025]);
            modbusDevice.Records[0x0025].Value = (UInt16)(var32 >> 16);
            var32 = (UInt32)canDevice.GetObject(_TableAddress[0x0026]);
            modbusDevice.Records[0x0026].Value = (UInt16)var32;
            //0x0036, 0x0037
            var32 = Unix.ToUnixTime((DateTime)canDevice.GetObject(_TableAddress[0x0036]));
            modbusDevice.Records[0x0036].Value = (UInt16)(var32 >> 16);
            var32 = Unix.ToUnixTime((DateTime)canDevice.GetObject(_TableAddress[0x0037]));
            unchecked
            {
                modbusDevice.Records[0x0037].Value = (UInt16)var32;
            }
            return;
        }
        /// <summary>
        /// Обновляет данные из указанного устройства
        /// </summary>
        /// <param name="device">Сетевое устройство</param>
        private void UpdateDivice(DeviceBase device)
        {
            Boolean result;
            UInt16 index;
            DataRow row;

            row = null;

            if (device == null)
            {
                return;
            }

            // Ищем строку с указанным устройством
            foreach (DataRow item in this._PivotTable.Rows)
            {
                if (device.NodeId == System.Convert.ToByte(item["NodeId"]))
                {
                    // Строка с нужным устройством найдена
                    row = item;
                    break;
                }
            }

            index = 0x2008;
            row["PolarisationPotential_2008"] = device.GetObject(index);
            index = 0x2009;
            row["ProtectionPotential_2009"] = device.GetObject(index);
            index = 0x200B;
            row["ProtectionCurrent_200B"] = device.GetObject(index);
            index = 0x200C;
            row["PolarisationCurrent_200С"] = device.GetObject(index);
            index = 0x200F;
            row["Corrosion_depth_200F"] = device.GetObject(index);
            index = 0x2010;
            row["Corrosion_speed_2010"] = device.GetObject(index);
            index = 0x2015;
            row["Tamper_2015"] = device.GetObject(index);
        }
Exemple #9
0
 /// <summary>
 /// Сбрасывает 
 /// </summary>
 /// <param name="device"></param>
 private void ResetDeviceStatusError(DeviceBase device)
 {
     if ((device.Status == DeviceStatus.CommunicationError) ||
     (device.Status == DeviceStatus.ConfigurationError))
     {
         lock (device)
         {
             device.Status = DeviceStatus.Stopped;
         }
     }
     return;
 }