/// <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; }
/// <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; }
/// <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; }
/// <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); }
/// <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; }