Справочник последовательных команд RS-232 для моторизованных зум-объективов POMEAS

Моторизованные зум-объективы POMEAS управляются по интерфейсу RS-232 (или Ethernet) компактным ASCII-протоколом из пяти команд. Каждая команда состоит из трёх байт: буквы X, буквы-кода команды и возврата каретки 0x0D. На запросы положения и хода контроллер отвечает девятибайтовым фреймом, а о завершении движения сигнализирует одним статус-байтом 0x55. В этом справочнике протокол описан точно в том виде, как он реализован, включая две формулы пересчёта и поведение, которое чаще всего удивляет интеграторов: пока движется мотор, контроллер перестаёт отвечать.

Материал рассчитан на инженеров, которые подключают моторизованный зум-объектив к ПЛК, контроллеру движения, одноплатному компьютеру или хосту под Linux, — то есть в ситуациях, когда Windows SDK недоступен и единственный вариант — прямая работа с байтовым потоком.

Ключевые факты вкратце

ПунктЗначение
Команды5 (XH, XG, XZ, XM, XN)
Завершающий байт фрейма0x0D (CR) — и в командах, и в ответах
Параметры последовательного порта9600 бод, 8 бит данных, без чётности
Порт Ethernet4196
Признак останова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.

№ФункцияASCIIHEXОтвет
1Возврат в исходное положение (home)X H CR0x58 0x48 0x0DНет
2Переход в целевую позицию по импульсамX G + 6 HEX digits + CR0x58 0x47 … 0x0DНет
3Запрос состояния движенияX Z CR0x58 0x5A 0x0D1 байт
4Чтение общего хода (максимальный импульс)X M CR0x58 0x4D 0x0D9 байт
5Чтение текущей позицииX N CR0x58 0x4E 0x0D9 байт

1. Возврат в исходное положение — XH

TX:  0x58 0x48 0x0D          # 'X' 'H' CR

Объектив возвращается в механическое исходное положение. Обратите внимание: объектив также выполняет этот сброс автоматически при каждом включении питания, а инициализация занимает 25–35 секунд, в течение которых объектив вообще не принимает команд. Поэтому прикладная программа должна ждать не менее 35 секунд после включения питания, прежде чем открывать порт.

2. Переход в целевую позицию — XG

Полезная нагрузка формируется с помощью C-строки формата "%C%C%6X%C": буква X, буква G, шестизначное шестнадцатеричное число, дополненное слева пробелами (0x20), если оно короче шести знаков, и завершающий байт 0x0D.

Целевой импульсСимволы ASCIIПоследовательность байт
100X G ␠␠␠␠ 6 4 CR0x58 0x47 0x20 0x20 0x20 0x20 0x36 0x34 0x0D
1000X G ␠␠␠ 3 E 8 CR0x58 0x47 0x20 0x20 0x20 0x33 0x45 0x38 0x0D
5000X G ␠␠ 1 3 8 8 CR0x58 0x47 0x20 0x20 0x31 0x33 0x38 0x38 0x0D
10000X G ␠␠ 2 7 1 0 CR0x58 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;
}

3. Запрос состояния движения — XZ

TX:  0x58 0x5A 0x0D
wait 20 ms
RX:  1 byte
ОтветЗначение
0x55Движение завершено — объектив остановился
Любое другое значениеВсё ещё движется
Полное отсутствие данныхТакже трактуется как «всё ещё движется»

Это самая важная деталь поведения во всём протоколе, и производитель её документирует: пока контроллерная карта приводит мотор в движение, связь приостанавливается. Во время движения зум-объектива последовательный или сетевой канал может вообще ничего не возвращать.

Практический вывод: цикл опроса нужно строить вокруг повторных попыток, а не вокруг обнаружения сбоев. Эталонная реализация:

  1. Отправьте XZ.
  2. Подождите не менее 20 ms.
  3. Прочитайте один байт.
  4. Если чтение завершилось по тайм-ауту или байт не равен 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
}

4. Чтение общего хода — XM

TX:  0x58 0x4D 0x0D
wait 20 ms
RX:  9 bytes
БайтСодержимое
10x58 (фиксированный)
2пусто
3–7Данные хода — пять байт, разбираются как целое по формату "%5X" в переменную readData
80x0D
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.

5. Чтение текущей позиции — XN

TX:  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)

Два момента делают эту последовательность надёжной:

  • Шаг 2 — единственная надёжная проверка линии. Шаг 3 для этого не годится, поскольку запрос движения, совпадающий с текущей позицией, не даёт ни движения, ни ошибки.
  • Шаг 4 замыкает контур. Только когда считанное значение совпадает с запрошенным, хост может быть уверен, что изменение увеличения действительно вступило в силу.

Весь протокол строго последователен по семантике — команда → движение → обратное чтение статуса → следующая команда. Он не поддерживает параллельную выдачу команд одному и тому же объективу.

Этот протокол обеспечивает только обратное чтение позиции. Он не определяет и не гарантирует никакого показателя повторяемости. Методика испытаний рассмотрена в сопутствующей статье о соответствии увеличения и импульсов; любые числовые заявления о точности должны основываться на ваших собственных измерениях в ваших условиях.

Распространённые заблуждения

«RS-232 моторизованный зум-объектив» означает одно и то же

На самом деле это два совершенно разных понятия, и выбор неподходящей модели — распространённая и дорогостоящая ошибка.

ТипМаркировка моделиРеальная возможность
Пассивная обратная связь по увеличениюСуффикс DS9 или DS6, напр. PMS-LZ-63100DS9Зум остаётся ручным. RS-232 лишь выдаёт текущее увеличение или позицию фиксации. Команд он принимать не может.
Активное моторизованное управлениеКод типа зума 04, 05, 09 или 10, напр. PMS-LZ-650104Принимаются все пять команд. RS-232 активно управляет увеличением.

Перед заказом проверьте суффикс модели. Объектив с DS9 можно только считывать, но нельзя управлять им по командам.

«Связь прервалась во время зуммирования — линия сломана»

Это не сбой. Контроллерная карта приостанавливает связь, пока приводит мотор. Это предусмотренное поведение. Обрабатывайте его через тайм-аут и повтор, а не через аварийную сигнализацию или перезапуск.

«Отправка команды всегда вызывает движение»

Если цель совпадает с текущей позицией, объектив остаётся неподвижным и молча «успешно завершает». Либо отслеживайте текущую позицию в прикладной программе, либо считывайте её командой XN перед каждым перемещением.

«Можно задать любое значение позиции»

Позиции по импульсам специфичны для объектива. Они берутся из поставляемой с SDK таблицы импульсов конкретной модели, и одно и то же увеличение отображается в разные значения импульсов на разных моделях и при разных типах мотора. Сначала считайте общий ход командой XM и убедитесь, что цель находится в допустимом диапазоне.

Сырые последовательные команды или SDK?

Команда протоколаУстаревший API SDKSDK V4.4.7
XH homeMoveHome(Motor)GoHome
XG moveMoveGoto(Motor, long dest)MoveTo(pulse)
XZ statusMoveStatus(Motor) → 0 движение / 1 простой / 2 ошибкаGetStatus
XM travelMoveMaxLength(Motor)GetMaxPos
XN positionMovePos(Motor)GetPos
  • Для интеграции с ПЛК, контроллером движения или микроконтроллером используйте приведённые выше сырые команды. DLL не требуется, протокол — чистый ASCII без привязки к платформе, поэтому он работает также в Linux и macOS.
  • При разработке в Windows на C++ или C# используйте SDK, который берёт на себя сборку фреймов, повторы и случай с двумя моторами.

Не смешивайте два подхода на одной линии. Они обращаются к одним и тем же аппаратным регистрам, и их смешивание — особенно вблизи исходной точки (home) — приводит к несогласованному состоянию.

Часто задаваемые вопросы

Какую скорость (бод) используют моторизованные зум-объективы POMEAS?

9600 бод, 8 бит данных, без чётности. При использовании Ethernet применяется TCP-порт 4196.

Почему я не могу ничего прочитать из объектива во время зуммирования?

Потому что контроллерная карта намеренно приостанавливает связь, пока приводит мотор. Повторите запрос статуса с тайм-аутом вместо того, чтобы считать молчание сбоем.

Как понять, поддерживает ли объектив активное управление по RS-232?

Проверьте код типа зума в номере модели. Коды 04, 05, 09 и 10 обозначают моторизованные типы. Суффикс DS9 или DS6 означает только пассивную обратную связь, при которой зум остаётся ручным.

Можно ли подключить объектив напрямую к ПЛК?

Да. Набор команд — пять ASCII-строк, поэтому ПЛК со свободным последовательным портом может сформировать и отправить их напрямую. Программу со стороны ПЛК пишете вы; POMEAS поставляет определение протокола, а не функциональный блок ПЛК.

Нужна ли DLL для управления объективом?

Нет. DLL — это удобный слой Windows поверх того же байтового протокола. Любая платформа, способная открыть последовательный порт или TCP-сокет, может управлять объективом.

Полезные материалы

Похожие продукты

Вернуться к началу
VK Message
WhatsApp

Отсканируйте QR-код

QR-код WhatsApp
Wechat

Отсканируйте QR-код

QR-код Wechat
Номер телефона
+8618598102007
Скопировано!
Сообщение в режиме онлайн

Сообщение в режиме онлайн

Click to refresh