Протокол обмена для SMSD_Lan
 

Протокол обмена для SMSD_Lan

Автор HerrAskin, 01 декабря 2020, 14:32:07

« назад - далее »

HerrAskin

Здравствуйте!
Использую шаговый двигатель ШД86 и блок управления SMSD_Lan.
Пытаюсь управлять двигателем через блок управления с помощью usb-подключения.
Тест программой smc-program-lan прошел успешно.
SW1 и SW2 переключил в ON. Подключил питание, блок управления, двигатель, через USB-шнур из комплекта подключил компьютер (Linux, Python).
Настройка com-порта: 115200, 8, нет, 1.
Посылаю команду, в ответ тишина. Т.к. usb, то авторизации не требуется?
Составил команду (по мануалу), добавил в начало xor_sum, еще раз в начало 0xfa, в конец 0xfb.
В итоге команда получила вид - 0xFA,0xD4,0x2,0x2,0x4,0x4,0x0,0x20,0x0,0x0,0x0,0xFB
Команда взята из https://electroprivod.ru/forums/index.php?topic=694377.0.
Может я что-то не так делаю? Надеюсь на Вашу помощь.

Administrator

Авторизация при подключении необходима в любом случае, независимо от того, LAN или USB используется. Первая команда - отправка пароля. Затем можно отправлять любые другие команды.

Вы можете посмотреть лог отправки команд в программе SMC-Program-LAN и использовать эти последовательности пакетов как примеры.

HerrAskin

Извините, не понимаю!
"Команда CODE_CMD_REQUEST используется для авторизации пользователя. Пакет данных с командой CODE_CMD_REQUEST отправляется контроллером пользователю как ответ на факт подключения контроллера (только в случае подключения по сети Ethernet, не используется при подключении USB)."
Но в любом случае, я не принимаю никаких сообщений от контроллера (((

Administrator

В случае подключения по LAN в момент подключения создается сокет, передачу начинает контроллер после установки соединения. Т.е. при подключении по LAN сразу после открытия сокета контроллер отправляет приветственное сообщение  - это то самое, о чем вы написали: "Команда CODE_CMD_REQUEST используется для авторизации пользователя. Пакет данных с командой CODE_CMD_REQUEST отправляется контроллером пользователю как ответ на факт подключения контроллера (только в случае подключения по сети Ethernet, не используется при подключении USB)." На это приветственное сообщение пользователь должен отправить пароль для авторизации. Следующая же строка в тексту протокола обмена говорит об этом: "После получения пакета с кодом команды CODE_CMD_REQUEST, пользователь должен отправить
пакет с кодом команды CODE_CMD_REQUEST, поле DATA должно содержать пароль для авторизации.".

Так как в случае подключения по USB нет физической возможности отследить факт подключения, контроллер (именно при подключении по USB) приветственное сообщение не отправляет. Первое сообщение отправляет пользователь, это сообщение должно содержать пароль авторизации.

Administrator


HerrAskin

Спасибо за ответ!
По Вашему совету посмотрел логи программы smc-program-lan.
Да, действительно, программа начинает "общение" с авторизации. Сравнил логи со своей программой на python. Xor и остальные параметры команд (fa fb) составляются аналогично. Но ответа от контроллера я не получаю, хотя порт открыт, Request отправлен...
Пытаюсь разобраться в чем дело...

HerrAskin

Цитата: HerrAskin от 01 декабря 2020, 14:32:07

Составил команду (по мануалу), добавил в начало xor_sum, еще раз в начало 0xfa, в конец 0xfb.
В итоге команда получила вид - 0xFA,0xD4,0x2,0x2,0x4,0x4,0x0,0x20,0x0,0x0,0x0,0xFB


Для python команда для отправки в порт должна быть
data = b'\xfa\xd4\x02\x02\x04\x00\x20\x00\x00\x00\xfb'
port.write(data)
либо
sock.send(data) - для LAN-подключения (без \xfa в начале, \xfb в конце)

Administrator

#7
Первой командой Вы должны отправить пароль для авторизации. До тех пор, пока Вы не отправите пароль, другие команды не будут приниматься контроллером.

Пример посылки по USB для авторизации с дефолтным паролем:
0xFA  0x4E 0x01 0x00 0xE9 0x08 0x00 0xEF 0xCD 0xAB 0x89 0x67 0x45 0x23 0x01 0xFB



Administrator

Посылка
0xFA  0xD4 0x02 0x02 0x04 0x04 0x00 0x20 0x00 0x00 0x00 0xFB

является корректной для запроса состояния входных сигналов, но только после успешной авторизации по паролю.

HerrAskin

Спасибо! Я разобрался, у меня всё заработало.
Вы правы. Сначала отсылается пароль для авторизации.
Но строка для отправки, в которой содержится команда или запрос, у меня (python) имеет вид '\xfa\xd4\x02\x02...\xfb'.