2010-07-23 3 views
2

Мне нужно некоторое архитектурное руководство. Вот моя цель.Совместное использование одного ресурса (последовательный порт) между несколькими приложениями

У меня есть часть роботизированного оборудования, которое выполняет несколько функций (то есть имеет несколько различных логических устройств). Для иллюстрации предположим, что это рука робота со сменными вложениями. Аппарат имеет один последовательный порт, который он использует для подключения к ПК, так что он может управляться различными приложениями. Сама рука и взаимозаменяемые вложения адресуются через один последовательный порт.

Мне нужно предоставить услугу, предоставляющую несколько интерфейсов. Интерфейсы можно назвать что-то вроде:

IRobotArm
IGrabberAttachment
IDrillAttachment

и так далее. Теперь вот сложная часть. К каждому интерфейсу нужно обращаться совершенно разными изолированными приложениями. Таким образом, рычаг робота и захватное устройство могут управляться совершенно разными приложениями одновременно - или они могут управляться одним и тем же приложением.

Это моя архитектурная головоломка. Как предоставить несколько интерфейсов нескольким клиентским приложениям, при этом создается только один экземпляр последовательного порта и что команды могут быть правильно сериализованы и т. Д.

Еще одно дополнительное требование: я буду работать в .NET/C#, но клиентские приложения вполне могут рассчитывать на использование COM-интерфейса, поэтому решение должно работать с COM Interop.

Идеи, пожалуйста!

ответ

3

Вам нужен один процесс контроллера, который фактически открывает последовательный порт и отправляет/принимает данные.

Ваши DLL-интерфейсы, которым распространяются эти интерфейсы, должны взаимодействовать с процессом контроллера, а не только последовательным портом.

1

Если ваш контроллер (часть, которая открывает/закрывает порт и передает и принимает), доступна нескольким приложениям одновременно, вам понадобится установить некоторые механизмы синхронизации, в противном случае два приложения могут попытаться отправить сообщение одновременно, что может вызвать проблемы при анализе ответа от рук робота.

Если у вас есть единый процесс контроллера или работает сервис, вы могли бы просто использовать C# блокировки ключевого слова, как показано ниже (предполагается, что простой протокол типа ASCII)

это работает только, если контроллер находится в своем собственном процессе , ключевое слово «блокировка» не будет работать с перекрестным процессом. Также не забудьте Утилизировать класс SerialPort при выключении.

Object _access = new Object(); 
    SerialPort _port; 

    public void Open() 
    { 
     lock(_port) 
     { 
      if(_port == null) 
      { 
       _port = new SerialPort("COM1", 9600, Parity.None, 8,StopBits.One); 
       _port.Open(); 
       _port.NewLine = "\r"; 
      } 
     } 
    } 

    public void Close() 
    { 
     // TBD 
    } 

    public string SendAndRecieve(string cmd) 
    { 
     String response; 

     lock(_access) 
     { 
      // Assume port is already opened 
      _port.WriteLine(cmd); 
      response = _port.ReadLine(); 
     } 

     return response; 
    } 
Смежные вопросы