Документация Matryoshka ClearCore
Версия прошивки - Katzenkran
Запросы и ответы
Получение текущей конфигурации (gcf — get config)
Пример запроса
{"cmd": "gcf", "rng": 2, "grp": 1, "unt": "b"}
Пример ответа
{"cmd": "gcf", "rng": 2, "grp": 1, "unt": "b", "rol": "m", "cfg": "{2,1,-80,80,10000,0,15000,7000,1150,0,5000,5000}"}
Заметки
-
rol (сокращение от role) - если unit B, то одно из: m (master), s (slave).
Если unit A, то всегда u (undefined)
-
Строка cfg - это строка, которую можно использовать для того, чтобы прошить
новый контроллер с такими же параметрами, как у контроллера, от которого пришёл ответ
Получение текущего статуса (sts — status)
Пример запроса
{"cmd": "sts", "rng": 2, "grp": 1, "unt": "b"}
Пример ответа (от юнита A)
{"cmd": "sts", "rng": 12, "grp": 6, "unt": "a"}
Пример ответа (от юнита B в режиме Slave)
{"cmd": "sts", "rng": 2, "grp": 1, "unt": "b", "rol": "s", "sts": {"M2": "-15/0..0(ALM)", "M3": "-15/0..0(ALM)"}}
Пример ответа (от юнита B в режиме Master)
{"cmd": "sts", "rng": 2, "grp": 1, "unt": "b", "rol": "m", "pos": 0, "sts": {"A": 0, "B": 0, "EN": 0, "ALM": 0, "M2": "-15/0..0(ALM)", "M3": "mute"}}
Заметки
-
Если указать "rng" равным 0, "grp" равным 0 и "unt" равным "0", то контроллер
ответит на такой пакет вне зависимости от своей принадлежности к кольцу, к группе и юниту.
-
Фактически, юнит А отвечает на запрос sts эхом.
-
У юнита B в ответе есть специальные поля
- rol - роль (m - master, s - slave)
- pos (только у мастера) - текущая позиция домрактов
-
sts - объект JSON с подробными сведениями о статусе, который содержит
- A (только у мастера) - состояние линии A (0 или 1)
- B (только у мастера) - состояние линии B (0 или 1)
- EN (только у мастера) - состояние линии Enable (0 или 1)
- ALM (только у мастера) - состояние линии Alarm (0 или 1)
- M2 и M3 - строка вида "TORQUE/MIN..MAX(STATE)", где TORQUE - текущее усилие, MIN - исторический минимум усилия, MAX - исторический максимум усилия, STATE - ALM (домкрат в ошибке) или OK (домкрат в норме). Если домкрат замучен (либо джампером, либо в соответствии с расположением мастера), то вместо этой строки будет "mute"
Перезагрузка (rst — reset)
Пример запроса
{"cmd": "rst"}
Пример ответа
никто не отвечает на этот запрос, все перезагружаются моментально
Заметки
-
Не нужно указывать ничего, кроме команды. Все, кто получил команду, перезагрузятся незамедлительно.
Простая команда движения (mtn — motion)
Пример запроса
{"cmd": "mtn", "rng": 2, "out": "p", "ind": 1, "vel": 500, "pos": 700}
Пример ответа
эхо, если команда получена и принята к исполнению
Заметки
-
out - одно из p (push, выдвигатор), t (tilt, наклонятор), l (lift, домкрат)
-
ind - индекс двигателя указанной категории внутри кольца (для домкратов следует использовать 0)
-
vel - скорость, 0..1000
-
pos - новая позиция, 0..1000
-
Если для выдвигатора или наклонятора указать позицию 9999, то он совершит экстренную
остановку с ускорением, которое прописано в конфигурации контроллера. Если указать и скорость равной
9999, то двигатель совершит экстренную остановку с бесконечным ускорением
(то есть попытается остановиться мгновенно)
Продвинутая команда движения (amt — advanced motion)
Пример запроса
{"cmd": "amt", "rng": 2, "dat": "p0104000800"}
Пример ответа
эхо, если команда получена и принята к исполнению
Правила составления строки dat
T_II_VVVV_PPPP (без подчеркиваний)
- T - тип мотора (один символ чувствительный к регистру: t, p или l)
- II - индекс (две цифры)
- VVVV - скорость (четыре цифры)
- PPPP - новая позиция (четыре цифры)
Если позиция или скорость имеет меньше 4 цифр, то слева дописываются нули,
чтобы стало 4 цифры. Аналогично с индексом, но там 2 цифры.
Например, хотим сказать тилту №5, чтобы поехал в позицию 200 со скоростью 500:
t0505000200
Если нужно отправить несколько движков в одном пакете, то делаем так (просто соединяем строки без разделителей):
t0505000200t0602000500t0702000500
На один мотор ВСЕГДА приходится 11 символов. В качестве индекса домкрата следует использовать 0.
Если для выдвигатора или наклонятора указать позицию 9999, то он совершит экстренную остановку с
ускорением, которое прописано в настройках контроллера. Если указать и скорость равной 9999,
то двигатель совершит экстренную остановку с бесконечным ускорением
(то есть попытается остановиться мгновенно).
Обновление конфигурации по UDP (cfg — config)
Пример запроса
{"cmd": "cfg", "str": "{0,0,-20,20,10000,0,15000,7000,1150,0,5000,5000}"}
Пример ответа
никто не отвечает на этот запрос, все перезагружаются моментально
Заметки
-
str - строка, которая содержит новую конфигурацию в формате (пробелы добавлены для удобства чтения, в реальности они запрещены):
{IGNORED, IGNORED, NEGATIVE_TORQUE_LIM, POSITIVE_TORQUE_LIM, PUSH_POS_MAX, PUSH_VEL_MIN, PUSH_VEL_MAX, PUSH_ACCEL, TILT_POS_MAX, TILT_VEL_MIN, TILT_VEL_MAX, TILT_ACCEL}
Включение линии enable на домкратах (enb — enable)
Пример запроса
{"cmd": "enb", "rng": 2}
Пример ответа
ничего не отвечает
Заметки
-
Эта команда обрабатывается только мастером
Отключение домкратов (dis — disable)
Пример запроса
{"cmd": "dis", "rng": 2}
Пример ответа
ничего не отвечает
Заметки
-
Эта команда обрабатывается только мастером
Формат и логика работы beacon (ранее ping)
Каждые 15 секунд мастер отсылает beacon-пакет (от англ. beacon — маяк) на IP адрес, с которого
он последний раз получал пакеты (или на 10.10.16.2, если пакетов ещё не
было). Аналогично работают остальные контроллеры, но beacon отсылается
раз в 30 секунд, и только при условии, что нет fault.
Формат beacon пакета мастера
{"msg": "beacon", "rng": 2, "grp": 1, "unt": "b", "pos": 0, "enb": 0, "ip": "10.10.16.72"}
Формат beacon пакета остальных контроллеров
{"msg": "beacon", "rng": 2, "grp": 1, "unt": "b", "ip": "10.10.16.72"}
Особые поля
- pos (только у мастера) - текущее положение домкратов
- enb (только у мастера) - состояние линии enable
- ip - адрес контроллера
Формат и логика работы fault
Обычные ошибки
Периодически (мастер - раз в 15 секунд, остальные - раз в 30 секунд) контроллеры
отсылают на IP адрес, с которого они получили последний пакет (или 10.10.16.2, если они
ещё не получали пакетов), сообщения об имеющихся ошибках. Формат сообщений следующий:
{"msg": "fault", "rng": 2, "grp": 1, "unt": "b", "out": "l", "ind": 0, "flt": -4}
- out - мотор (l - домкрат, p - выдвигатор, t - наклонятор)
- ind - индекс мотора в кольце, для домкрата равно 0
- flt - код ошибки
Ошибки домкратов отправляются сразу же после обнаружения.
Для домкратов существуют следующие коды ошибок:
- -1 - TORQUE_M2_NEGATIVE (превышение отрицательного усилия M2)
- -2 - TORQUE_M2_POSITIVE (превышение положительного усилия M2)
- -3 - TORQUE_M3_NEGATIVE (превышение отрицательного усилия M3)
- -4 - TORQUE_M3_POSITIVE (превышение положительного усилия M3)
- -5 - COMMON_M2 (общая ошибка M2)
- -6 - COMMON_M3 (общая ошибка M3)
Для наклоняторов и выдвигаторов существует только один код ошибки:
- -10 - COMMON (общая ошибка двигателя)
Повреждения линии синхронизации
Существуют особые ошибки, которые относятся только к повреждениям линии синхронизации
и отправляются только с мастера. Для таких ошибок поле "out" равняется "w" (от слова wiring),
поле "flt" всегда равно -7, а "ind" указывает номер линии, которая не прошла проверку на
целостность. Ошибки линии синхронизации отправляются сразу же после обнаружения. Индексы линий:
- 0 - линия A
- 1 - линия B
- 2 - линия Alarm
- 3 - линия Enable
Например, пакет {"msg": "fault", "rng": 2, "grp": 1, "unt": "b", "out": "w", "ind": 2, "flt": -7} свидетельствует о разрыве линии Alarm.
При наличии таких ошибок работа домкратов запрещена на уровне прошивки до устранения неисправности.
Вычисление IP адреса, который задаёт себе контроллер при загрузке
Контроллер задаёт себе IP адрес вида 10.10.X.Y, маску подсети 255.255.252.0 (/22), и шлюз 10.10.16.1.
В формулах далее все деления целочисленные, а знак процента означает взятие модуля.
X = 16 + (Ring - 1) / 10
Y = 51
+ ((Ring - 1) % 10) * 20
+ (Group - 1) * 2
+ (0 для юнита А, 1 для юнита B)
Используемые порты
Контроллер принимает пакеты на порт 8800 + Ring. Например, контроллеры третьего кольца ожидают данные на порте 8803.
Контроллер отправляет пакеты на порт 9900 + Ring. Например, контроллеры 12 кольца отправляют данные на порт 9912.