Моторизованные зум-объективы POMEAS управляются по интерфейсу RS-232 (или Ethernet) компактным ASCII-протоколом из пяти команд. Каждая команда состоит из трёх байт: буквы X, буквы-кода команды и возврата каретки 0x0D. На запросы положения и хода контроллер отвечает девятибайтовым фреймом, а о завершении движения сигнализирует одним статус-байтом 0x55. В этом справочнике протокол описан точно в том виде, как он реализован, включая две формулы пересчёта и поведение, которое чаще всего удивляет интеграторов: пока движется мотор, контроллер перестаёт отвечать.
Материал рассчитан на инженеров, которые подключают моторизованный зум-объектив к ПЛК, контроллеру движения, одноплатному компьютеру или хосту под Linux, — то есть в ситуациях, когда Windows SDK недоступен и единственный вариант — прямая работа с байтовым потоком.
| Пункт | Значение |
|---|---|
| Команды | 5 (XH, XG, XZ, XM, XN) |
| Завершающий байт фрейма | 0x0D (CR) — и в командах, и в ответах |
| Параметры последовательного порта | 9600 бод, 8 бит данных, без чётности |
| Порт Ethernet | 4196 |
| Признак останова | 0x55 — любое другое значение или тайм-аут чтения означают «всё ещё движется» |
| Формула хода | maxLength = (readData − 750) × 1.3 |
| Формула положения | pos = (readData − 500) × 1.3 |
| Рекомендации по опросу | Ждите не менее 50 ms между запросами статуса; задайте общий тайм-аут 10 s или более |
| Параметр | Значение | Примечания |
|---|---|---|
| Физический уровень | RS-232 (напрямую или через USB-to-RS-232) или Ethernet | Контроллер поддерживает один из двух вариантов, но не оба одновременно |
| Скорость (бод) | 9600 | Документация по протоколу и по API контроллерной карты согласованно указывают это значение |
| Биты данных | 8 | — |
| Чётность | Нет | — |
| TCP-порт | 4196 | Используется при подключении через сетевой интерфейс |
| Завершающий байт | 0x0D | В обоих направлениях |
Прежде чем говорить о протоколе, нужно правильно выполнить подключение: подключите и зафиксируйте моторный кабель и кабель RS-232 до подачи питания. Горячее подключение моторного кабеля при включённом контроллере — самое разрушительное действие на практике: оно может необратимо повредить мотор. Если моторный кабель должен быть длиннее 5 m, закажите заводской удлинительный кабель вместо того, чтобы сращивать несколько коротких, — спаянные или самодельные кабели не отвечают требованиям по импедансу и экранированию.
Каждая команда имеет вид 'X' + <буква команды> + 0x0D.
| № | Функция | ASCII | HEX | Ответ |
|---|---|---|---|---|
| 1 | Возврат в исходное положение (home) | X H CR | 0x58 0x48 0x0D | Нет |
| 2 | Переход в целевую позицию по импульсам | X G + 6 HEX digits + CR | 0x58 0x47 … 0x0D | Нет |
| 3 | Запрос состояния движения | X Z CR | 0x58 0x5A 0x0D | 1 байт |
| 4 | Чтение общего хода (максимальный импульс) | X M CR | 0x58 0x4D 0x0D | 9 байт |
| 5 | Чтение текущей позиции | X N CR | 0x58 0x4E 0x0D | 9 байт |
XHTX: 0x58 0x48 0x0D # 'X' 'H' CR
Объектив возвращается в механическое исходное положение. Обратите внимание: объектив также выполняет этот сброс автоматически при каждом включении питания, а инициализация занимает 25–35 секунд, в течение которых объектив вообще не принимает команд. Поэтому прикладная программа должна ждать не менее 35 секунд после включения питания, прежде чем открывать порт.
XGПолезная нагрузка формируется с помощью C-строки формата "%C%C%6X%C": буква X, буква G, шестизначное шестнадцатеричное число, дополненное слева пробелами (0x20), если оно короче шести знаков, и завершающий байт 0x0D.
| Целевой импульс | Символы ASCII | Последовательность байт |
|---|---|---|
| 100 | X G ␠␠␠␠ 6 4 CR | 0x58 0x47 0x20 0x20 0x20 0x20 0x36 0x34 0x0D |
| 1000 | X G ␠␠␠ 3 E 8 CR | 0x58 0x47 0x20 0x20 0x20 0x33 0x45 0x38 0x0D |
| 5000 | X G ␠␠ 1 3 8 8 CR | 0x58 0x47 0x20 0x20 0x31 0x33 0x38 0x38 0x0D |
| 10000 | X G ␠␠ 2 7 1 0 CR | 0x58 0x47 0x20 0x20 0x32 0x37 0x31 0x30 0x0D |
Важное поведение: если запрошенная позиция совпадает с текущей, объектив не двигается и не сообщает об ошибке. Поэтому прикладная программа никогда не должна считать сам факт «отправки команды» доказательством работоспособности линии связи. Надёжная проверка линии — чтение позиции в ответ.
// Move to an absolute pulse position
int moveTo(int fd, long pulse) {
char buf[16];
// "%C%C%6X%C" - six hex digits, space-padded, CR-terminated
int n = snprintf(buf, sizeof(buf), "%c%c%6lX%c", 'X', 'G', pulse, '\r');
return write(fd, buf, n) == n ? 0 : -1;
}
XZTX: 0x58 0x5A 0x0D
wait 20 ms
RX: 1 byte
| Ответ | Значение |
|---|---|
0x55 | Движение завершено — объектив остановился |
| Любое другое значение | Всё ещё движется |
| Полное отсутствие данных | Также трактуется как «всё ещё движется» |
Это самая важная деталь поведения во всём протоколе, и производитель её документирует: пока контроллерная карта приводит мотор в движение, связь приостанавливается. Во время движения зум-объектива последовательный или сетевой канал может вообще ничего не возвращать.
Практический вывод: цикл опроса нужно строить вокруг повторных попыток, а не вокруг обнаружения сбоев. Эталонная реализация:
XZ.0x55, подождите и повторите попытку — не объявляйте сбой.В собственной блок-схеме API производителя перед каждым запросом статуса предусмотрена задержка 50 ms и общий тайм-аут 10 секунд или более. Лишь когда этот общий тайм-аут истекает без действительного ответа, хост должен сделать вывод, что соединение с объективом нарушено.
// Wait for motion to complete: 50 ms per poll, 10 s overall timeout
int waitStop(int fd, int timeout_ms) {
int waited = 0;
char c;
while (waited < timeout_ms) {
usleep(50 * 1000); // reference flow chart: wait 50 ms or more
write(fd, "XZ\r", 3); // 0x58 0x5A 0x0D
usleep(20 * 1000); // protocol: wait 20 ms before reading
if (read(fd, &c, 1) == 1 && (unsigned char)c == 0x55)
return 0; // stopped
waited += 70;
}
return -1; // connection or motion fault
}
XMTX: 0x58 0x4D 0x0D
wait 20 ms
RX: 9 bytes
| Байт | Содержимое |
|---|---|
| 1 | 0x58 (фиксированный) |
| 2 | пусто |
| 3–7 | Данные хода — пять байт, разбираются как целое по формату "%5X" в переменную readData |
| 8 | 0x0D |
| 9 | пусто |
sscanf(tbuffer + 2, "%5X", &readData);
maxLength = (readData - 750) * 1.3;
Пример из документации производителя: ответ 0x58 -- -- -- '2' '7' '1' '0' 0x0D -- даёт readData = 10000, следовательно maxLength = (10000 − 750) × 1.3 = 12025.
XNTX: 0x58 0x4E 0x0D
wait 20 ms
RX: 9 bytes (identical structure to XM)
sscanf(tbuffer + 2, "%5X", &readData);
pos = (readData - 500) * 1.3;
Пример: при readData = 10000 получаем pos = (10000 − 500) × 1.3 = 12350.
(1) XH return to origin -> poll XZ until stopped
(2) XM read total travel -> validates the link, yields maxLength
(3) XG <6 HEX> move to target position -> poll XZ until stopped
(4) XN read current position -> compare with the target (closed loop)
Два момента делают эту последовательность надёжной:
Весь протокол строго последователен по семантике — команда → движение → обратное чтение статуса → следующая команда. Он не поддерживает параллельную выдачу команд одному и тому же объективу.
Этот протокол обеспечивает только обратное чтение позиции. Он не определяет и не гарантирует никакого показателя повторяемости. Методика испытаний рассмотрена в сопутствующей статье о соответствии увеличения и импульсов; любые числовые заявления о точности должны основываться на ваших собственных измерениях в ваших условиях.
На самом деле это два совершенно разных понятия, и выбор неподходящей модели — распространённая и дорогостоящая ошибка.
| Тип | Маркировка модели | Реальная возможность |
|---|---|---|
| Пассивная обратная связь по увеличению | Суффикс DS9 или DS6, напр. PMS-LZ-63100DS9 | Зум остаётся ручным. RS-232 лишь выдаёт текущее увеличение или позицию фиксации. Команд он принимать не может. |
| Активное моторизованное управление | Код типа зума 04, 05, 09 или 10, напр. PMS-LZ-650104 | Принимаются все пять команд. RS-232 активно управляет увеличением. |
Перед заказом проверьте суффикс модели. Объектив с DS9 можно только считывать, но нельзя управлять им по командам.
Это не сбой. Контроллерная карта приостанавливает связь, пока приводит мотор. Это предусмотренное поведение. Обрабатывайте его через тайм-аут и повтор, а не через аварийную сигнализацию или перезапуск.
Если цель совпадает с текущей позицией, объектив остаётся неподвижным и молча «успешно завершает». Либо отслеживайте текущую позицию в прикладной программе, либо считывайте её командой XN перед каждым перемещением.
Позиции по импульсам специфичны для объектива. Они берутся из поставляемой с SDK таблицы импульсов конкретной модели, и одно и то же увеличение отображается в разные значения импульсов на разных моделях и при разных типах мотора. Сначала считайте общий ход командой XM и убедитесь, что цель находится в допустимом диапазоне.
| Команда протокола | Устаревший API SDK | SDK V4.4.7 |
|---|---|---|
XH home | MoveHome(Motor) | GoHome |
XG move | MoveGoto(Motor, long dest) | MoveTo(pulse) |
XZ status | MoveStatus(Motor) → 0 движение / 1 простой / 2 ошибка | GetStatus |
XM travel | MoveMaxLength(Motor) | GetMaxPos |
XN position | MovePos(Motor) | GetPos |
Не смешивайте два подхода на одной линии. Они обращаются к одним и тем же аппаратным регистрам, и их смешивание — особенно вблизи исходной точки (home) — приводит к несогласованному состоянию.
9600 бод, 8 бит данных, без чётности. При использовании Ethernet применяется TCP-порт 4196.
Потому что контроллерная карта намеренно приостанавливает связь, пока приводит мотор. Повторите запрос статуса с тайм-аутом вместо того, чтобы считать молчание сбоем.
Проверьте код типа зума в номере модели. Коды 04, 05, 09 и 10 обозначают моторизованные типы. Суффикс DS9 или DS6 означает только пассивную обратную связь, при которой зум остаётся ручным.
Да. Набор команд — пять ASCII-строк, поэтому ПЛК со свободным последовательным портом может сформировать и отправить их напрямую. Программу со стороны ПЛК пишете вы; POMEAS поставляет определение протокола, а не функциональный блок ПЛК.
Нет. DLL — это удобный слой Windows поверх того же байтового протокола. Любая платформа, способная открыть последовательный порт или TCP-сокет, может управлять объективом.
XG
Введите свой адрес электронной почты, чтобы получать свежие новости и эксклюзивные обновления от Pomeas. Оставайтесь на связи с Pomeas и будьте в курсе новейших оптических решений.