У меня есть ПЛК, который отправляет UDP-пакеты каждые 24 мс. «Одновременно» (т. Е. В пределах того, что должно быть несколько десятков или не более сотен микросекунд), тот же ПЛК запускает камеру для привязки изображения. Существует система Windows 8.1, которая получает как изображения, так и UDP-пакеты, и приложение, работающее на нем, которое должно соответствовать каждому изображению с UDP-пакетом из ПЛК.Переменная задержка в сети Windows
В большинстве случаев существует достаточно фиксированная латентность между двумя событиями, что касается приложения Windows - 20 мс +/- 5 мс. Но иногда латентность поднимается и никогда не падает. В конце концов, он выходит за пределы диапазона буфера соответствия, который у меня есть, и две системы перезагружаются, что всегда начинается с «нормальных» уровней латентности.
Что меня озадачивает изменчивость этой переменной задержки - что иногда она будет сидеть весь день на 20 мс +/- 5 мс, но в другие дни она будет регулярно и быстро возрастать, и наша система очень часто сбрасывается.
Что может быть здесь? Что можно сделать, чтобы исправить это? Является ли Windows вероятным источником задержки или системой ПЛК?
I 99% подозревают Windows, поскольку ПЛК предназначен для ответа в реальном времени, а Windows - нет. Звучит ли это «нормально» для Windows? Если это так, даже если есть другие процессы, связанные с сетью и/или другими ресурсами, почему Windows никогда не пытается догнать - чтобы увеличиться в латентности, когда возникает конфликт, но вернитесь к нормальным уровням задержек после прекращения конкуренции?
FYI: приложение Windows вызывает SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)
, и каждый критический поток запускается с AfxBeginThread(SomeThread, pSomeParam, THREAD_PRIORITY_TIME_CRITICAL)
. В системе как можно меньше работает, и приложение использует только около 5% доступного четырехъядерного процессора (с гиперпотоком, поэтому 8 эффективных процессоров). Нет смысла использовать SetThreadAffinityMask()
, хотя я его рассматриваю.
Вы работаете в многозадачной операционной системе не в режиме реального времени. Много crapola использует многозадачность, вас обычно не интересует, скажем, Windows Update, устанавливая обновление, пока вы контролируете ПЛК. Только действительно хороший способ получить мягкое поведение в реальном времени - начать с Windows Embedded и использовать системный строитель. Обеспечивает, чтобы ничто не включалось вообще и по-прежнему дает возможность превращать только то, что вам действительно нужно. –
«В режиме реального времени» всегда является концепцией относительно приложения. Windows удается воспроизводить звуковые дорожки без заметных всплывающих окон и кликов (в основном), или обрабатывать потоки видео со скоростью 50+ кадров в секунду, и это достаточно хороший ответ «в реальном времени» для большинства людей. Поэтому я не пытаюсь сделать что-либо, что Windows не проявила, чтобы быть способной - мне интересно (а) понимание того, что происходит, и (б) программирование моего приложения для достижения сопоставимой производительности. – omatai
Между двумя событиями? Получение UDP-пакета и получение изображения через TCP? Если да, это, скорее всего, настройки окна TCP. Если вы минимизируете задержку, лучше используйте UDP для обоих, или, по крайней мере, изучите, как снизить задержку TCP. – Soonts