| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Системный анализ, проектирование и 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 |
Если это все в рамках одного приложения:
По поводу подписки только на интересующие типы сообщений: если сообщений мало (конфиги обычно не так часто меняются), то можно рассылать всё всем, а уже в каждом конкретном модуле в обраточике реагировать только на интересующие обновления. Если событий много и не хочется слать всё всем, то надо добавлять фильтры по типам конфигов, в случае древовидных конфигураций (наподобие XML или JSON) можно фильтровать по поддереву, можно добавлять теги, сложно предложить что-то конкретное не зная структуры и характера данных. Или каждый модуль может предоставить функцию которая будет говорить интересен ли данный апдейт данному модулю. Но это почти то же самое, что и первый вариант. Если это несколько независимых приложений то можно делать тоже самое, только используюя некую messaging system. |
| Автор: LeonidPr 16.4.2019, 10:56 |
| LSD, спасибо за развернутый ответ! Что-то примерно такое в голове и крутится. Насчет подписки на события вот не подумал, надо будет поразбираться. |