Я ' m, реализующий класс, который общается с контроллером мотора через USB-устройство. У меня все работает, кроме способа указать, является ли параметр, полученный по коммуникационной ссылке, «свежим» или нет. Что у меня есть:
class MyCommClass
{
public:
bool getSpeed( double *speed );
private:
void rxThread();
struct MsgBase
{ /* .. */ };
struct Msg1 : public MsgBase
{ /* .. */ };
struct Msg2 : public MsgBase
{ /* .. */ };
/* .. */
struct MsgN : public MsgBase
{ /* .. */ };
Msg1 msg1;
Msg2 msg2;
/* .. */
MsgN msgn;
std::map< unsigned long id, MsgBase *msg > messages;
};
rxThead ()
- это бесконечный цикл, работающий в отдельном потоке, проверяющий USB-устройство на наличие доступных сообщений. Каждое сообщение имеет уникальный идентификатор, который rxThread ()
использует, чтобы вставить его в правый объект msgx
. Что мне нужно, так это когда пользователь вызывает функцию getSpeed ()
, он должен иметь возможность определить, является ли текущее значение скорости «свежим» или «устаревшим», то есть является ли объект msgx
, который содержит значение скорости, было обновлено в течение указанного периода ожидания. Таким образом, каждый объект сообщения должен реализовать свой собственный тайм-аут (поскольку они зависят от сообщения).
Все сообщения периодически передаются контроллером мотора, но есть и такие, которые передаются, как только их содержимое изменяется (но они также будут передаваться периодически, если содержимое не изменяется). Это означает, что получение сообщения с частотой, превышающей номинальную, нормально, но оно должно появиться хотя бы один раз в течение максимального периода ожидания.
USB-устройство предоставляет временные метки вместе с сообщениями, поэтому у меня есть доступ к этой информации. Отметка времени не отражает текущее время, это длинное число без знака
с микросекундным разрешением, которое устройство обновляет каждый раз при получении сообщения. Я подозреваю, что устройство просто начинает увеличивать это значение с 0
с момента, когда я вызываю его функции инициализации. Я могу придумать несколько различных способов реализации этого:
Каждый объект сообщения запускает поток, который запускается бесконечно в ожидании (WaitForSingleObject) в течение периода ожидания. По истечении времени ожидания он проверяет, увеличена ли переменная счетчика (которая была кэширована до ожидания). В противном случае он устанавливает флаг, помечающий сообщение как устаревшее. Счетчик будет увеличиваться каждый раз, когда rxThread ()
обновляет этот объект сообщения.
rxThread ()
, помимо заполнения сообщений, также выполняет итерацию по списку сообщений и проверяет метку времени каждого сообщения. последний раз обновлялся. Если метка времени превышает тайм-аут, сообщение помечается как устаревшее. У этого метода могут быть проблемы с объемом необходимой обработки. Вероятно, это не будет проблемой на большинстве машин, но этот код должен работать на свинцово-медленном «промышленном компьютере».
Я очень признателен за ваши мысли и предложения о том, как это реализовать. Я открыт для идей, отличных от двух, о которых я упомянул. Я использую Visual Studio 2005, и кроссплатформенная переносимость не является большой проблемой, поскольку драйверы USB-устройств предназначены только для Windows. В настоящее время я отслеживаю около 8 сообщений, но было бы неплохо, если бы решение было достаточно легким, чтобы я мог добавить еще несколько (возможно, еще 8), не сталкиваясь с ограничениями вычислительной мощности.
Заранее спасибо, промышленный компьютер ».
Я очень признателен за ваши мысли и предложения о том, как это реализовать. Я открыт для идей, кроме двух, о которых я упомянул. Я использую Visual Studio 2005, и кроссплатформенная переносимость не является большой проблемой, поскольку драйверы USB-устройств предназначены только для Windows. В настоящее время я отслеживаю около 8 сообщений, но было бы неплохо, если бы решение было достаточно легким, чтобы я мог добавить еще несколько (возможно, еще 8), не сталкиваясь с ограничениями вычислительной мощности.
Заранее спасибо, промышленный компьютер ».
Я очень признателен за ваши мысли и предложения о том, как это реализовать. Я открыт для идей, отличных от двух, о которых я упомянул. Я использую Visual Studio 2005, и кроссплатформенная переносимость не является большой проблемой, поскольку драйверы USB-устройств предназначены только для Windows. В настоящее время я отслеживаю около 8 сообщений, но было бы неплохо, если бы решение было достаточно легким, чтобы я мог добавить еще несколько (возможно, еще 8), не сталкиваясь с ограничениями вычислительной мощности.
Заранее спасибо, Ашиш.