Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Системный анализ, проектирование и UML > Организация данных внутри программы


Автор: LeonidPr 20.3.2019, 13:24
Всем привет.

Временами приходится писать десктопные программки для опроса того или иного разрабатываемого девайса.
Когда девайс один (или однотипные на одной шине RS-485 например) все как-то легко и просто.
Но каждый раз понимаю, что пишу нечно нерасширяемое и одноразовое.
Задачка простая,

есть кучка интерфейсов и протоколов (например RS-485, Ethernet и может CAN) ну и протокол к примеру ModBus и какой-нить CanOpen.
У устройства есть некие параметры (уставки, текущие измеряемые величины и т.п.)
Надо вычитывать все это, логировать и возможно делать некую визуализацию.
В приниципе то, что делают SCADA системы, только в урезанном формате.

Вот и думаю, как все это хранится внутри?
Каждый параметр который мы считываем из устройств или пишем в него можно описать структуркой навроде Variant типа. Т.е. универсальное такое хранилище, которое знает что в нем сейчас (int, float или что-то еще).
А теперь я так понимаю надо делать какое-то централизованное хранилище всего этого?
Что бы потом остальные части (логгер, GUI и т.п.) могли из него брать или писать.

Так вот вопрос как организовать такое хранилище?
Может это должна быть какая-то RAM субд? Которая для ускорения работы не использует накопитель.
Вторая проблема это то, что к примеру какие-то из параметров мы не только считываем, но и записываем. Пусть будет некий порог тока или напряжения, при превышении которого устройство должно выдать сигнал. Так вот надо как-то привязать этот параметр (в хранилище) к модулю, который знает как и куда его записать.

Если можете посоветовать литературу буду благодарен, возможно есть паттерны полезные для организации подобных систем?
Реалтайм пока даже не рассматриваю понять бы как всю эту кухню организовать.

Автор: LSD 21.3.2019, 20:04
Вопрос совершенно непонятен, в чем вообще проблема? Проблема как представлять в программе код работающий с разными протоколами? Как сохранять данные в базу? Как получить единый програмный интерфейс для работы с разными протоколами?

Автор: LeonidPr 21.3.2019, 21:56
Не совсем так.
Вопрос как организовать централизованный доступ к некоему набору параметров для всех модулей программы,
При этом для некоторых из них, если какой-то из модулей изменяет параметр, то другие модули должны об этом узнать и обработать это событие.
Ну и параметры и связь их с модулями конечно делать динамическими, например задавая в неком конфиге, что бы при старте к примеру программа вычитывала его и создавала конфигурацию для работы.

Автор: LSD 29.3.2019, 13:12
Если это все в рамках одного приложения: 
  •  создаешь некое централизованное хранилище для этих параметров, которое будет их хранить, сохранять в базу/файл и загружать оттуда
  •  хранилище предоставляет API для изменения этих параметров
  •  хранилище предоставляет API регистрации слушателей об изменениях параметров
  •  модули которым интересно получать уведомления об изменениях параметров: подписываются на события
Что касается подписки на конкретный тип изменений конфигурации: я не думаю что это стоит делать конфигом. Модуль подписывается на изменения не потому что его так сконфигурировали, а потому что он использует для работы этот конфиг и знает что делать в случае его изменения.
По поводу подписки только на интересующие типы сообщений: если сообщений мало (конфиги обычно не так часто меняются), то можно рассылать всё всем, а уже в каждом конкретном модуле в обраточике реагировать только на интересующие обновления. Если событий много и не хочется слать всё всем, то надо добавлять фильтры по типам  конфигов, в случае древовидных конфигураций (наподобие XML или JSON) можно фильтровать по поддереву, можно добавлять теги, сложно предложить что-то конкретное не зная структуры и характера данных. Или каждый модуль может предоставить функцию которая будет говорить интересен ли данный апдейт данному модулю. Но это почти то же самое, что и первый вариант.


Если это несколько независимых приложений то можно делать тоже самое, только используюя некую messaging system.

Автор: LeonidPr 16.4.2019, 10:56
LSD, спасибо за развернутый ответ!
Что-то примерно такое в голове и крутится. Насчет подписки на события вот не подумал, надо будет поразбираться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)