В этом посте мы рассмотрим как подключить Болид к Raspberry Pi с помощью С2000-ПП по протоколу Modbus RTU. В данном примере я использовал для подключения старую плату С2000-USB версии 2.0. Теоретическую часть, в части формирования запросов, структуры пакетов, расчета CRC, настройки С2000-ПП и т.д., вы можете почерпнуть из поста 2000-ПП и Arduino. Соединяем Болид и ардуино по протоколу Modbus RTU. Часть 1. Теоретическая.. Повторяться я не буду.
Кстати, скачать и протестировать мои программы для подключения С2000-ПП к Raspberry Pi вы можете по ссылке : Приложения и утилиты для подключения С2000-ПП к Raspberry, Orange и т.д. с архитектурой ARM 32-bit с операционными системами семейства Unix (Linux).
Здесь мы рассмотрим подключение С2000-ПП к Raspberry Pi только через shell. Подключение с помощью С++ через С2000-USB и напрямую через GPIO-UART с помощью преобразователя интерфейса, мы рассмотрим в следующих постах.
Итак, для тестового подключения нам понадобятся:
- Преобразователь протокола С2000-ПП
- Raspberry Pi (я использовал версию 3B, установленная ОС — Raspbian)
- Преобразователь интерфейса USB — RS485 (я использовал Болидовский С2000-USB)
Подключимся к Raspberry Pi через SSH и соединим наши устройства.
Настройка интерфейса RS-485 С2000-ПП для работы по протоколу ModBus осталась прежней: 9600, 8N1.
При подключении С2000-USB к Raspberry Pi система установит драйвер и создаст файл устройства. Нам нужно его отыскать. Например так:
~ $ ls -l /dev/tty*
. crw--w---- 1 root tty 4, 9 ноя 30 14:01 /dev/tty9 crw-rw---- 1 root dialout 166, 0 дек 4 19:33 /dev/ttyACM0 crw-rw---- 1 root dialout 204, 64 ноя 30 14:01 /dev/ttyAMA0 crw------- 1 root root 5, 3 ноя 30 14:01 /dev/ttyprintk crw-rw---- 1 root dialout 4, 64 ноя 30 14:01 /dev/ttyS0
В моем случае это /dev/ttyACM0. Проверить это можно отключив устройство и повторив команду. Устройство пропадает.
Теперь необходимо настроить правильный режим работы (бодрейт, проверку на четность и т.д.). Для этого используем команду установки характеристик терминала stty
~ $ stty 9600 -F /dev/ttyACM0 raw -echo
Здесь:
- 9600 — скорость в бодах;
- -F открыть и использовать указанное устройство вместо стандартного ввода;
- /dev/ttyACM0 — путь к файлу устройства;
- raw — разрешает необрабатываемый ввод и вывод, т.е. все управляющие и спецсимволы передаются в сыром виде;
- -echo не отображать каждый вводимый символ.
По-умолчанию терминал уже настроен на работу по «схеме» 8N1.
Для проверки настройки терминала можно использовать следующую команду:
~ $ stty < /dev/ttyACM0 -a speed 9600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
Теперь, когда терминал настроен, давайте выполним команду cat для возможности увидеть данные, которые приходят к нам через терминал. Команду мы выполним со знаком амперсанда, для запуска в фоновом режиме.
~$ cat /dev/ttyACM0 &
В качестве теста мы используем запрос типа и версии прибора. Напомню, выглядит он так: 0x03 0x03 0xB4 0x48 0x00 0x02 0x62 0x0F. Отправим его через терминал с помощью команды echo, переопределив место вывода и направив его в файл устройства.
~ $ echo -e -n "\x03\x03\xB4\x48\x00\x02\x62\x0F" > /dev/ttyACM0 ~ $ $▒▒Y
Здесь:
- echo — команда вывода;
- -n включает подавление символа новой строки в конце строки;
- -e включает интерпретацию символов с обратной косой чертой (именно так можно передать байты в hex формате используя префикс \x, хотя в MANе такая возможность не описана;
- «\x03\x03\xB4\x48\x00\x02\x62\x0F» собственно, сам запрос, БЕЗ ПРОБЕЛОВ!;
- > /dev/ttyACM0 указывает куда команде echo направить выходной поток.
На нижней строчке видно что нам вывела команда cat, которая находится в фоновом режиме и читает наш файл. Это ответ С2000-ПП на запрос, посланный нами с Raspberry Pi. Конечно, в таком виде разобраться что там, крайне сложно. Поэтому приходящие данные от С2000-ПП мы сохраним в файл, а файл откроем с помощью команды hexdump с опцией -C, которая откроет файл с указанием количества принятых байт и самих байт.
~ $ cat /dev/ttyACM0 | tee s2000pp_echo.txt &
~ $ echo -e -n "\x03\x03\xB4\x48\x00\x02\x62\x0F" > /dev/ttyACM0
~ $ $▒▒Y
~ $ hexdump ./s2000pp_echo.txt -C
00000000 03 03 04 00 24 00 83 d8 59 |....$...Y|
00000009
~ $
Расскажу что мы сделали в каждой строке:
- Запустили в фоне команду на чтение файла устройства, с сохранением результатов, с помощью команды tee, в файл s2000pp_echo.txt;
- Передали команду С2000-ПП;
- cat вывела нам в строку ответ от С2000-ПП и сохранила его в файл s2000pp_echo.txt;
- Запустили команду hexdump с опцией -C для открытия файла ./s2000pp_echo.txt;
- Мы видим дамп файла в hex формате;
- продолжение файла.
Теперь ответ легко читается: 03 03 04 00 24 00 83 d8 59, это именно то, чего мы добивались. Еще раз напомню, что вся теоретическая часть описана в посте С2000-ПП и Arduino. Часть 1. Теоретическая.
Ваши вопросы вы можете задать в комментариях или в Телеграм
