Если вы собираетесь работать даже с несколькими типами устройств, то хорошим решением будет разделение интерфейса контроллер + устройство, которое обменивается данными с помощью пары имен vlaue
Развязка
Использование пар имя-значение позволяет вам разделить ваш код на структуру кода устройства + контроллер + приложения
Пример кода
class DeviceInterface
{
void Initialize(IController & Controller);
void Close();
bool ChangeParameter(const string & Name, const string & Value);
bool GetParam(string & Name, string &Value );
}
Каждая реализация устройства при ее создании должна быть создана с указанием контроллера, который может принимать его команды и транслировать их в фактические команды устройства
interface IController
{
Initialize(DeviceSpecific & Params);
Close();
bool ChangeParameter(string & Name, string & Value);
bool ChangeParams(string & Name[], string &Value []);
}
Ваш код пользователя будет выглядеть примерно так
IController objController = new MeasurementDevice(MeasureParram);
DeviceInterface MeasureDevice = new DeviceInterface(objController);
string Value;
MeasureDevice.GetParam("Temperature", Value);
if (ConvertStringToInt(Value) > 80)
{
MeasureDevice.ChangeParameter("Shutdown", "True");
RaiseAlert();
}
Все, что должен сделать класс DeviceInterface, - это позаботиться о передаче команд контроллеру. Контроллер должен позаботиться о связи устройства.
Преимущества разделения интерфейса
Защита от изменений
Этот тип развязки позволит вам изолировать код вашего приложения от контроллера. Изменения в устройстве не влияют на ваш код пользователя
Поддержка кода заявки
Дополнительно пользовательский код всегда чист, и вам нужно беспокоиться только о логике приложения. Но если бы вы определили несколько интерфейсов / созданных шаблонов или обобщений с несколькими типами структур параметров, специфичных для контроллера, в вашем коде было бы много нежелательного устройства, которое могло бы ухудшить читабельность и создать проблемы с обслуживанием при каждом изменении вашего устройства / его параметров.
Легкость реализации
Вы также можете объединить различные реализации контроллера в свои собственные проекты. Кроме того, ваше приложение может также настраивать команды и ответы в более динамичной форме, используя файлы XML и т. Д., Которые могут поставляться вместе с классами контроллеров, так что все ваше приложение становится более динамичным по своей природе.
Реальная жизнь
Один из последних проектов контроллеров производства от лидера в этой области работает аналогичным образом. Но они используют LON для связи с устройством.
LON?
Протокол LON, используемый в сетях контроллеров (например, кондиционеров / котлов / вентиляторов и т. Д.), Использует эту концепцию для связи с различными устройствами
Итак, все, что вам нужно - это один интерфейс, который может общаться с вашим устройством, а затем отправляет ему пару имя-значение, используя LON. Использование стандартного протокола также позволит вам общаться с другими устройствами, помимо вашего измерительного прибора. Доступны реализации с открытым исходным кодом LON, если ваше устройство использует LON.
Если ваше устройство не поддерживает LON, возможно, вам придется сконструировать что-то, где пользовательский код все еще работает с парами имя-значение, а противоположный интерфейс преобразует ваши пары имя-значение в эквивалентный соответствующий cotroller struct + и связывается с устройством индивидуума в способ, которым устройство понимает.
Надеюсь, это пригодится.