С2000-ПП и Raspberry Pi. Подключаем Болид к одноплатнику по протоколу Modbus RTU. Часть 1.

В этом посте мы рассмотрим как подключить Болид к Raspberry Pi с помощью С2000-ПП по протоколу Modbus RTU. В данном примере я использовал для подключения старую плату С2000-USB версии 2.0. Теоретическую часть, в части формирования запросов, структуры пакетов, расчета CRC, настройки С2000-ПП и т.д., вы можете почерпнуть из поста 2000-ПП и Arduino. Соединяем Болид и ардуино по протоколу Modbus RTU. Часть 1. Теоретическая.. Повторяться я не буду.

Здесь мы рассмотрим подключение С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, которая откроет файл с указанием количества принятых байт и самих байт.

  1. ~ $ cat /dev/ttyACM0 | tee s2000pp_echo.txt &
  2. ~ $ echo -e -n  "\x03\x03\xB4\x48\x00\x02\x62\x0F" > /dev/ttyACM0
  3. ~ $ $▒▒Y
  4. ~ $ hexdump  ./s2000pp_echo.txt -C
  5. 00000000  03 03 04 00 24 00 83 d8  59                       |....$...Y|
  6. 00000009
  7. ~ $

Расскажу что мы сделали в каждой строке:

  1. Запустили в фоне команду на чтение файла устройства, с сохранением результатов, с помощью команды tee, в файл s2000pp_echo.txt;
  2. Передали команду С2000-ПП;
  3. cat вывела нам в строку ответ от С2000-ПП и сохранила его в файл s2000pp_echo.txt;
  4. Запустили команду hexdump с опцией -C для открытия файла ./s2000pp_echo.txt;
  5. Мы видим дамп файла в hex формате;
  6. продолжение файла.

Теперь ответ легко читается: 03 03 04 00 24 00 83 d8 59, это именно то, чего мы добивались. Еще раз напомню, что вся теоретическая часть описана в посте С2000-ПП и Arduino. Часть 1. Теоретическая.

Нужен ли видеоурок по теме: С2000-ПП и Raspberry Pi. Подключаем Болид к одноплатнику по протоколу Modbus RTU. Часть 1.

Просмотреть результаты

Загрузка ... Загрузка ...

Оцените пожалуйста статью:

ПечальноТак себеНе плохоХорошоОтличная статья! (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *