У меня есть мои устройства в конфигурации Master/Slave, и я разрабатываю приложение WPF/MVVM.Что действительно знают мастера о своих рабах?
У меня есть COM-объекты (все которые реализуют IDevice
), которые представляют состояние внешнего устройства/сети Modbus и прикрепленные к чему-то, как SerialPort
или Socket
. Это означает, что после идентификации устройства по его Version
и Revision
я вызываю IDevice device = DeviceManager.GetDevice(version, revision);
, чтобы получить объект, который представляет состояние фабричного устройства по умолчанию.
Теперь, когда у меня есть IDevice
, я могу назвать его API, чтобы получить такие вещи, как List<ushort> GetCoreRegisters()
и List<ushort> GetAllRegisters()
. С учетом сказанного, после считывания значений регистра, я должен вызвать API IDevice
для установки значений: device.SetItemValue(registerAddress, registerValue)
, чтобы обновить состояние устройства на другой стороне сети.
Я создал тип Master
, который имеет дело с уровнем связи (Socket
против SerialPort
).
В текущем состоянии моего приложения, я называю что-то вроде следующего псевдокода в одном из моих просмотра моделей (после нажатия кнопки):
IDevice device = null;
profile = SelectedProfile
master = MasterFactory.GetMaster(profile.Name)
master.Open() //Connects or Opens SerialPort/Socket
if(master.DeviceCheck(profile.SlaveAddress))
{
KeyValuePair<ushort, ushort> info = await master.IdentifyDeviceAsync(profile.SlaveAddress);
device = DeviceManager.GetDevice(info.Key, info.Value)
initList = device.GetInitializationRegisters()
initValues = await master.ReadRegisters(profile.SlaveAddress, initList)
for(int i = 0; i < initList; i++)
device.SetRegisterValue(initList[i], initValues[i]);
allRegisters = device.GetAllRegisters();
allValues = await master.ReadRegisters(profileSlaveAddress, allRegisters)
for ... repeat
}
if device != null, DevicesInViewModel.Add(device)
master.Close()
Мой вопрос, правильно ли это дизайн, или я должен иметь List<IDevice> Devices
в Master
и после идентификации устройства (устройств), я хотел бы сделать что-то подобное:
device = DeviceManager.GetDevice(info.Key, info.Value);
master.Add(device);
// possibly add more devices if needed
List<IDevice> devices = master.ReadDevices()
if devices != null, DevicesInViewModel.AddRange(devices);
Где вся логика GetRegister
и SetRegisterValue
внутри Master
-meaning Master знает все о IDevice
и обрабатывает логику настройки состояния подчиненных устройств.