Стартовая страница › Форумы › Разработка и интеграция › Формирование значения Дата/Время из драйвера
- В этой теме 27 ответов, 5 участников, последнее обновление 9 лет назад сделано
Mikhail.
-
АвторСообщения
-
15.03.2016 в 11:35 #1689
manjey73
УчастникСобственно интересуют применяемые функции для формирования даты и времени из драйвера, чтобы это корректно воспринимала scada.
И пример разбора для передачи в драйвер для записи.
15.03.2016 в 13:37 #1697Mikhail
МодераторПросьба уточнить вопрос.
15.03.2016 в 13:42 #1702manjey73
Участникесть некие переменные (год, месяц, число, часы, минуты) каждые по отдельности.
Это надо запаковать для отправки в scada командой SetCurData, чтобы scada поняла это как время.
Ну и соответственно потом сделать обратную процедуру.
В scada надо штатными средствами сформировать текущее время и отправить в драйвер.16.03.2016 в 14:02 #1723manjey73
УчастникУ прибора есть данные о времени в виде 6 байт, каждый байт отвечает за свои данные (год, месяц, день, часы, минуты, секунды).
Формат далек от понимания scada в том виде, в котором оно есть.Мне нужно понять, как сформирована строка времени DateTime в scada, чтобы сформировать точно так же?
Чтобы при чтении scada восприняла и показала это как время, понятное для нее.
Ну и соответственно сделать обратный процесс в драйвере, чтобы он понял уже по своему.Планируется запись времени в прибор для коррекции по команде из scada, например функцией берется текущее время компьютера и передача в драйвер для записи.
16.03.2016 в 14:17 #1724Evgen
Участникmanjey73
Я Вас правильно понял?
Есть переменные каждая переменная отвечает за свою часть даты?
Y это год M месяц D день H час Min минуты S секунды.
Вам необходимо эти переменные сложить в «единую2 дату и обратно?Если верно я бы перевел эти переменные в строку, сложил бы эти строки через точку. и перевел бы обратно в дату но уже «единую». А обратно тоже перевел бы в строку и сделал выборку до «точки» до первой точки «годы» между первой и второй месяц и тд.
16.03.2016 в 14:26 #1726manjey73
УчастникПроцесс перевода для прибора и из прибора я обдумаю, мне важно понимать, как сформирован DateTime непосредственно в Scada.
Если я правильно помню, то DateTime в RapidScada 8-ми байтный, вот формат этих 8-ми байт меня и интересует, разложенный по полочкам.
Ну и заодно функции C#, которые облегчат формирование DateTime.16.03.2016 в 19:28 #1734Mikhail
МодераторВ связи с тем, что формата отображения даты и времени для входных каналов пока нет (но обязательно будет), то Ваша главная задача передать данные от Коммуникатора к Серверу. Они передаются в виде double.
Для кодирования можно использовать методы
DateTime.ToBinary() — возвращает long или
DateTime.ToOADate() — возвращает doubleи для обратного преобразования
DateTime.FromBinary()
DateTime.FromOADate()Затем придётся создать несколько дорасчётных каналов, которые будут выделять день, час и т.д. по отдельности и отображать их.
16.03.2016 в 19:38 #1736Vyacheslav
Участник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
17.03.2016 в 09:24 #1738manjey73
УчастникVyacheslav
Меня формат DateTime интересует в первую очередь, чтобы потом не переделывать драйвер.
То, что у меня 6 байт и как они раскладываются мне известно из информации протокола прибора, с этим проблем нет.
задача 1. обработать данные времени прибора и завернуть их в формат DateTime в double, чтобы SCADA получив этот пакет однозначно его восприняла как дату. (тем более что в следующих версиях такая поддержка окажется)
задача 2. Компьютер, на котором установлена Scada синхронизирует время с ntp. По команде управления происходит чтение через драйвер время прибора, или в автоматическом режиме раз в месяц запись синхронизированного времени в прибор.
Передача со стороны scada в формате DateTime.Переваривать время прибора в double в обоих направлениях соответственно задача драйвера а не scada.
-
Этот ответ был изменен 9 лет назад от
manjey73.
17.03.2016 в 09:54 #1740Romiros
Участникmanjey73
Скажите пожалуйста для какого прибора Вы пишите драйвер17.03.2016 в 09:58 #1741Romiros
УчастникИ еще вопрос к Михаилу, раз уж дело коснулось даты и времени. Скажите пожалуйста не планируется в будущей версии поддержка формирования дневных архивов, помимо часовых и минутных?
Просто решил попробовать добавить их сам, но вдруг это будет штатная функция.17.03.2016 в 10:24 #1743manjey73
УчастникНа данный момент у нас 4-ре прибора на столе, к которым прикручиваем драйвера.
Счетчик электроэнергии Меркурий 206 (по идее вся серия 20Х)
Регистратор импульсов Пульсар 10-М (по идее 2, 6, 10 и 16 канальные должны работать)
Квартирный счетчик воды Пульсар с RS485 интерфейсом
Квартирный компактный счетчик тепла Пульсар17.03.2016 в 10:55 #1745Romiros
УчастникСпасибо за ответ. Мы работаем с УВП-280А(Б).01, в нем дата и время передается таким же образом как у Вас поэтому и спросил
17.03.2016 в 12:03 #1747Mikhail
МодераторСкажите пожалуйста не планируется в будущей версии поддержка формирования дневных архивов, помимо часовых и минутных?
Не планируется, но идея интересная. Тогда уж и архивы за месяц нужны )
Хотелось бы добавить во внутренний протокол обмена Коммуникатора и Сервера возможность передавать произвольные данные, чтобы затем они сохранялись уже сервером. Но когда это будет не могу сказать. Сейчас в приоритете — веб.Если Сервер и Коммуникатор работают на разных ПК (а такое бывает), то будет неудобно записывать нестандартные данные на сервер. Один из вариантов — разработать серверный модуль, который будет открывать TCP порт и предоставлять сервис для приёма нестандартной информации. Или использовать СУБД. В обоих случаях получается не очень красиво с точки зрения архитектуры.
17.03.2016 в 12:05 #1748Mikhail
МодераторDateTime.ToOADate() — наверное будет использован этот формат. Но пока не точно, нужно тестировать, что он в точности совпадает с форматом хранения времени в таблицах срезов, который в свою очередь унаследован ещё из Delphi 🙂
-
Этот ответ был изменен 9 лет назад от
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.