Формирование значения Дата/Время из драйвера

Стартовая страница Форумы Разработка и интеграция Формирование значения Дата/Время из драйвера

  • В этой теме 27 ответов, 5 участников, последнее обновление 9 лет назад сделано Mikhail.
Просмотр 15 сообщений - с 1 по 15 (из 28 всего)
  • Автор
    Сообщения
  • #1689
    manjey73
    Участник

    Собственно интересуют применяемые функции для формирования даты и времени из драйвера, чтобы это корректно воспринимала scada.

    И пример разбора для передачи в драйвер для записи.

    #1697
    Mikhail
    Модератор

    Просьба уточнить вопрос.

    #1702
    manjey73
    Участник

    есть некие переменные (год, месяц, число, часы, минуты) каждые по отдельности.
    Это надо запаковать для отправки в scada командой SetCurData, чтобы scada поняла это как время.
    Ну и соответственно потом сделать обратную процедуру.
    В scada надо штатными средствами сформировать текущее время и отправить в драйвер.

    #1723
    manjey73
    Участник

    У прибора есть данные о времени в виде 6 байт, каждый байт отвечает за свои данные (год, месяц, день, часы, минуты, секунды).
    Формат далек от понимания scada в том виде, в котором оно есть.

    Мне нужно понять, как сформирована строка времени DateTime в scada, чтобы сформировать точно так же?
    Чтобы при чтении scada восприняла и показала это как время, понятное для нее.
    Ну и соответственно сделать обратный процесс в драйвере, чтобы он понял уже по своему.

    Планируется запись времени в прибор для коррекции по команде из scada, например функцией берется текущее время компьютера и передача в драйвер для записи.

    #1724
    Evgen
    Участник

    manjey73
    Я Вас правильно понял?
    Есть переменные каждая переменная отвечает за свою часть даты?
    Y это год M месяц D день H час Min минуты S секунды.
    Вам необходимо эти переменные сложить в «единую2 дату и обратно?

    Если верно я бы перевел эти переменные в строку, сложил бы эти строки через точку. и перевел бы обратно в дату но уже «единую». А обратно тоже перевел бы в строку и сделал выборку до «точки» до первой точки «годы» между первой и второй месяц и тд.

    #1726
    manjey73
    Участник

    Процесс перевода для прибора и из прибора я обдумаю, мне важно понимать, как сформирован DateTime непосредственно в Scada.
    Если я правильно помню, то DateTime в RapidScada 8-ми байтный, вот формат этих 8-ми байт меня и интересует, разложенный по полочкам.
    Ну и заодно функции C#, которые облегчат формирование DateTime.

    #1734
    Mikhail
    Модератор

    В связи с тем, что формата отображения даты и времени для входных каналов пока нет (но обязательно будет), то Ваша главная задача передать данные от Коммуникатора к Серверу. Они передаются в виде double.

    Для кодирования можно использовать методы
    DateTime.ToBinary() — возвращает long или
    DateTime.ToOADate() — возвращает double

    и для обратного преобразования
    DateTime.FromBinary()
    DateTime.FromOADate()

    Затем придётся создать несколько дорасчётных каналов, которые будут выделять день, час и т.д. по отдельности и отображать их.

    #1736
    Vyacheslav
    Участник

    RapidScada написана с использованием платформы .NET.
    В вашей задаче непонятно в какой части системы вам необходимо манипулировать данными. К примеру RSCADA можно разделить на 2 части. 1 часть это коммуникатор и его драйверы. 2 часть сервер и его модули.

    Если вас интересует формат сохранения данных в архив, то используется ниже следующая схема.

    * Data types and data representation:
    * type 0: integer (Int32)
    * type 1: float (Double)
    * type 2: boolean (Byte)
    * 0 — false, otherwise true
    * type 3: date and time (Double)
    * Delphi data format is used
    * type 4: UTF-8 string with maximum data size UInt16.MaxValue — 2
    * String data size (UInt16)
    * String data (Byte[])
    */

    Для хранения значения используется тип Double. То есть вам как минимум не хватает еще 2 байт. Если сериализатор скады сможет привести ваши 6 байт к типу Double то возможно все прокатит.

    Если вам просто необходимо сформировать массив то к типам DateTime скорей всего привязываться не стоит. Формируйте пакет байт в нужном порядке и отправляйте напрямую в прибор через коммуникатор, например в собственном драйвере KP. На мой взгляд наглядной реализацией для этого может быть вот этот пример: https://github.com/RapidScada/scada/blob/master/ScadaComm/OpenKPs/KpSms/KpSmsLogic.cs

    #1738
    manjey73
    Участник

    Vyacheslav
    Меня формат DateTime интересует в первую очередь, чтобы потом не переделывать драйвер.
    То, что у меня 6 байт и как они раскладываются мне известно из информации протокола прибора, с этим проблем нет.
    задача 1. обработать данные времени прибора и завернуть их в формат DateTime в double, чтобы SCADA получив этот пакет однозначно его восприняла как дату. (тем более что в следующих версиях такая поддержка окажется)
    задача 2. Компьютер, на котором установлена Scada синхронизирует время с ntp. По команде управления происходит чтение через драйвер время прибора, или в автоматическом режиме раз в месяц запись синхронизированного времени в прибор.
    Передача со стороны scada в формате DateTime.

    Переваривать время прибора в double в обоих направлениях соответственно задача драйвера а не scada.

    • Этот ответ был изменен 9 лет назад от manjey73.
    #1740
    Romiros
    Участник

    manjey73
    Скажите пожалуйста для какого прибора Вы пишите драйвер

    #1741
    Romiros
    Участник

    И еще вопрос к Михаилу, раз уж дело коснулось даты и времени. Скажите пожалуйста не планируется в будущей версии поддержка формирования дневных архивов, помимо часовых и минутных?
    Просто решил попробовать добавить их сам, но вдруг это будет штатная функция.

    #1743
    manjey73
    Участник

    На данный момент у нас 4-ре прибора на столе, к которым прикручиваем драйвера.
    Счетчик электроэнергии Меркурий 206 (по идее вся серия 20Х)
    Регистратор импульсов Пульсар 10-М (по идее 2, 6, 10 и 16 канальные должны работать)
    Квартирный счетчик воды Пульсар с RS485 интерфейсом
    Квартирный компактный счетчик тепла Пульсар

    #1745
    Romiros
    Участник

    Спасибо за ответ. Мы работаем с УВП-280А(Б).01, в нем дата и время передается таким же образом как у Вас поэтому и спросил

    #1747
    Mikhail
    Модератор

    Скажите пожалуйста не планируется в будущей версии поддержка формирования дневных архивов, помимо часовых и минутных?

    Не планируется, но идея интересная. Тогда уж и архивы за месяц нужны )
    Хотелось бы добавить во внутренний протокол обмена Коммуникатора и Сервера возможность передавать произвольные данные, чтобы затем они сохранялись уже сервером. Но когда это будет не могу сказать. Сейчас в приоритете — веб.

    Если Сервер и Коммуникатор работают на разных ПК (а такое бывает), то будет неудобно записывать нестандартные данные на сервер. Один из вариантов — разработать серверный модуль, который будет открывать TCP порт и предоставлять сервис для приёма нестандартной информации. Или использовать СУБД. В обоих случаях получается не очень красиво с точки зрения архитектуры.

    #1748
    Mikhail
    Модератор

    DateTime.ToOADate() — наверное будет использован этот формат. Но пока не точно, нужно тестировать, что он в точности совпадает с форматом хранения времени в таблицах срезов, который в свою очередь унаследован ещё из Delphi 🙂

Просмотр 15 сообщений - с 1 по 15 (из 28 всего)
  • Вы должны авторизироваться для ответа в этой теме.