public override uint ConvertToBasis(ValueType totalValue) { string msg; if (totalValue is DateTime) { return(Unix.ToUnixTime((DateTime)totalValue)); } msg = String.Format("Преобразование невозможно. Передан тип {0}, ожидается {1}", totalValue.GetType(), typeof(DateTime)); throw new InvalidCastException(msg); }
/// <summary> /// Конструктор для сериализации /// </summary> /// <param name="info"></param> /// <param name="context"></param> //public ServicePdoReceive(SerializationInfo info, StreamingContext context) // : base(info, context) //{ // _SynchronizationPeriod = info.GetInt32("Interval"); // _LastTimeSynchronisation = DateTime.Now; //} #endregion #region Methods /// <summary> /// /// </summary> public override void HandleOutcomingMessages() { //String msg; Frame message; if (Status != Status.Running) { return; } // 1. Один раз в период опроса (равен периoду) опрашиваем состояние устройства. // Получаем время последнего опроса устройства. Прибавляем к нему время прериода синхронизации времени // и сравниваем с текущим временем. Если полученное время меньше текущего, то выполняем синхронизацию. if (_LastTransaction != null) { TimeSpan interval = DateTime.Now - _LastTransaction.TimeOfEnd; if (interval.Seconds < Interval) { return; } } _LastTransaction = new Transaction(); // Формируем и записываем запрос в выходной буфер message = new Frame(); message.Identifier = 0x200; message.FrameFormat = FrameFormat.StandardFrame; message.FrameType = FrameType.DATAFRAME; message.Data = new Byte[4]; // Получаем текущее время в формате UNIX UInt32 unixTime = Unix.ToUnixTime(DateTime.Now); unchecked { message.Data[0] = (Byte)unixTime; // Младший байт message.Data[1] = (Byte)(unixTime >> 8); message.Data[2] = (Byte)(unixTime >> 16); message.Data[3] = (Byte)(unixTime >> 24); // Старший байт } _LastTransaction.Start(TransactionType.BroadcastMode, message); _NetworkController.SendMessageToCanPort(_LastTransaction.Request.Value); _LastTransaction.Stop(null); //Debug.WriteLine(String.Format("Время последней синхронизации времени: {0}", // now.ToString(new System.Globalization.CultureInfo("ru-Ru", false)))); }
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; }