WB Modbus Devices Firmware Update: различия между версиями

Материал из Wiren Board
(не показано 106 промежуточных версий 6 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE:Обновление прошивки Modbus-устройств Wiren Board}}
{{DISPLAYTITLE:Загрузка прошивок на устройства Wiren Board}}
== Общая информация ==
{{YouTube
|link= https://www.youtube.com/watch?v=d_olK15Xhkw
|text= Обновление прошивок устройств (24:08)
|start=1448
}}
В modbus-устройствах Wiren Board есть [[Bootloader |загрузчик (bootloader)]], который позволяет обновлять прошивки по RS-485/Modbus RTU. В режиме загрузчика основные функции устройства отключаются, а коммуникационные параметры в режиме загрузчика фиксированы и не зависят от значений в памяти устройства: 9600 8N2.


Сами прошивки выпускаются в формате релизов, которые привязаны к [[Wiren_Board_Software#releases| релизам программного обеспечения контроллера]], но имеют отличный от него цикл:
== Загрузчик прошивок ==
* '''testing''' — сюда попадают прошивки после внутреннего тестирования, доступны для пользователей testing-релиза контроллера;
* '''stable''' — через три недели после публикации в testing и при отсутствии сообщений об ошибках, прошивки считаются стабильными. В этот момент они становятся доступны и для пользователей stable-релиза контроллера. Если изменений в прошивке было много и они затрагивали основные функции устройства, то прошивка может немного задержаться в testing.


На странице каждого устройства есть ссылка на список изменений в прошивках, где прошивки в testing отмечены маркером «testing». Прошивка без отметки считается стабильной.
В новых версиях наших устройств реализован механизм загрузчика прошивок (bootloader). Он позволяет обновлять микропрограммы устройств/модулей Wiren Board по RS-485/Modbus RTU.  


Распределение прошивок по релизам позволяет избежать ситуации, когда свежая версия прошивки без продолжительного тестирования попадает в очень ответственную инсталляцию. Если для новой прошивки нужны новые функции в ПО контроллера, то либо они заедут в stable-релиз ПО вместе с прошивкой, либо прошивка задержится в testing до появления нужных функций в ПО.
В режиме загрузчика основной функционал устройства отключается. '''Коммуникационные параметры в режиме загрузчика фиксированы и не зависят от значений в памяти устройства: 9600 8N2.'''


Для прошивки подключённых через шлюз WB-MGE или аналог устройств, используйте перенаправление socat, [[WB FAQ/modbus-modules-behind-gateway | инструкция]].
== Переход в режим загрузчика ==
{{Wbincludes:Bootloader MOD}}


== Автоматическое обновление ==
== Автоматическое обновление прошивки с контроллера Wiren Board ==
[[Image: Wb-fw-mcu-updater example 1.png |500px|thumb|right| Пример работы wb-fw-mcu-updater ]]
Прошивку устройств, подключенных к контроллеру Wiren Board можно обновить с помощью утилиты [[wb-mcu-fw-updater]]. Утилита проверяет наличие новой версии прошивки для всех подключенных устройств и, при необходимости, обновляет их.  
{{note|info|При обновлении прошивки удаляются ИК-команды, сохранённые в устройствах WB-MSW и WB-MIR. Рекомендуем сохранить банки команд перед обновлением с помощью [[WB-MSx Consumer IR Manual#Чтение/запись банков команд | скрипта]].}}
Автоматическое обновление прошивки выполняется с помощью предустановленной на контроллеры Wiren Board утилиты [[Wb-mcu-fw-updater | wb-mcu-fw-updater]] и позволяет установить свежую версию ПО сразу на все подключенные устройства или отдельно на каждое. Определение сигнатуры (модели) устройства, новой прошивки произойдет автоматически.


Утилита работает только на нашем контроллере и ей нужен доступ в интернет. Если у вас нет интернета или нашего контроллера, смотрите раздел [[#manual|Ручное обновление]].
Для установки выполните в консоли:
<syntaxhighlight lang="bash">
dpkg -s wb-mcu-fw-updater || (apt update && apt install wb-mcu-fw-updater)
</syntaxhighlight>


Обновление прошивок устройств, подключенных к шлюзам WB-MGE и WM-MIO-E, также выполняется [[WB_Modbus_Devices_Firmware_Update#%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B8_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2,_%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BA_%D1%88%D0%BB%D1%8E%D0%B7%D0%B0%D0%BC_WB-MGE_%D0%B8_WB-MIO-E |вручную с отображением сетевого порта в локальный]].
Утилита автоматически останавливает сервис <code>wb-mqtt-serial</code> перед началом работы и запускает заново после. Если вместо <code>wb-mqtt-serial</code> используется стороннее ПО, опрашивающее устройства по последовательному порту — остановите это ПО.


=== Обновление всех устройств на шине ===
Для обновления прошивки всех устройств, описанных в разделе Serial Devices Configuration (файл <code>/etc/wb-mqtt-serial.conf</code>), выполните:
Вы можете обновить все устройства, настроенные в разделе '''Serial Devices Configuration''' [[Wiren Board Web Interface | веб-интерфейса]]
<syntaxhighlight lang="bash">
# Подключите устройства по [[RS-485 | шине RS-485]] к контроллеру.
# [[RS-485:Configuration via Web Interface | Настройте подключенные устройства]] в веб-интерфейсе.
# Откройте консоль контроллера по [[SSH]].
# Обновите все настроенные устройства командой:
#:<syntaxhighlight lang="bash">
wb-mcu-fw-updater update-all
wb-mcu-fw-updater update-all
</syntaxhighlight>
</syntaxhighlight>


=== Обновление одного устройства ===
Для обновления прошивки конкретного устройства, укажите порт и его адрес Modbus:
Чтобы обновить только одно устройство:
<syntaxhighlight lang="bash">
# Подключите устройство по шине RS-485 к контроллеру.
wb-mcu-fw-updater update-fw /dev/ttyRS485-2 -a70
# Узнайте [[Wiren Board Device Modbus Address | modbus-адрес]] устройства, которое хотите обновить.
</syntaxhighlight>
# Откройте консоль контроллера по [[SSH]].
# Запустите утилиту <code>wb-mcu-fw-updater</code> параметрами: ключ <code>update-fw</code>, а также порт и modbus-адрес.


Например, обновим прошивку устройства с modbus-адресом <code>70</code> и подключенного к порту <code>/dev/ttyRS485-1</code>:
Подробную информацию смотрите в выводе
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
wb-mcu-fw-updater update-fw /dev/ttyRS485-1 -a70
wb-mcu-fw-updater --help
</syntaxhighlight>
</syntaxhighlight>


Полный список параметров и примеры работы смотрите на [[Wb-mcu-fw-updater | странице утилиты]].
<gallery mode="packed" heights="200px">
 
File:Wb-fw-mcu-updater example 1.png|Пример работы wb-fw-mcu-updater
== Ручное обновление ==
</gallery>
{{Anchor|manual}}
=== Особенности ===
Этот способ используется если:
*на объекте нет доступа в интернет,
*у вас нет контроллера,
*вы обновляете прошивку устройств, [[WB_Modbus_Devices_Firmware_Update#Обновление_прошивки_устройств,_подключенных_к_шлюзам_WB-MGE_и_WB-MIO-E |подключенных за шлюзами WB-MGE и WB-MIO-E]].
 
Во всех остальных случаях используйте [[WB_Modbus_Devices_Firmware_Update#Автоматическое_обновление |автоматическое обновление]].
 
Ручное обновление можно сделать утилитой '''[[wb-mcu-fw-flasher#Установка утилиты | wb-mcu-fw-flasher]]''', которую нужно предварительно установить. Способ установки отличается и зависит от используемой операционной системы.


=== Подготовка устройства ===
== Ручная прошивка устройств ==
=== Выбор прошивки ===


Прошивать устройства можно:
Прошивки публикуются на сайте [http://fw-releases.wirenboard.com/?prefix=fw/ '''fw-releases.wirenboard.com'''] в виде файлов с расширением '''.wbfw'''.
* по modbus-адресу устройства.
* по широковещательному адресу — <code>0</code>.


Для прошивки нескольких устройств на шине нужно поочереди перевести их в [[Bootloader MOD | режим загрузчика]] и прошить.
Прошивки сгруппированы по версиям и сигнатурам (типам) устройств.


=== Загрузка прошивки в устройство ===
Каждое Modbus устройство Wiren Board имеет сигнатуру — наименование аппаратного типа устройства. Перезапись прошивки возможна только при совпадении сигнатур устройства и прошивки.
Для загрузки прошивки выполните шаги:
# Подключите устройство по [[RS-485 | шине RS-485]] к контроллеру или другому оборудованию, где установлена утилита прошивки.
{{Wbincludes:Prepare modbus_client}}
# Скачайте из репозитория файл прошивки для вашего устройства по [[Firmware Repository For Wiren Board Modbus Devices | инструкции]].
# Загрузите файл прошивки на [[View controller files from your computer | контроллер]] или другое устройство.
# Перейдите в папку с файлом прошивки и выполните команду:
#:* на контроллере или компьютере с ОС Linux:
#:<syntaxhighlight lang="bash">
wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a25 -f ./firmware.wbfw
</syntaxhighlight>
#:* на компьютере с ОС Windows:
#:<syntaxhighlight lang="bash">
wb-mcu-fw-flasher_1.0.3.exe -j -d COM1 -a25 -f firmware.wbfw
</syntaxhighlight>
# Если вы выполняли команду с контроллера — запустите драйвер wb-mqtt-serial.


В команде выше мы флагом <code>-j</code> перевели устройство, подключенное к порту <code>/dev/ttyRS485-1</code> (<code>COM1</code>) с адресом <code>25</code> в режим загрузчика, а затем прошили его.
Сигнатура устройства хранится в формате строки из 12 ASCII символов, по одному символу в регистре, и доступна по адресу 290.
Получить можно командой:


Успешный процесс прошивки выглядит так:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
~# wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f mr6c__1.15.5_master_971fe50.wbfw 
echo -e $(modbus_client -mrtu -pnone -s2 /dev/ttyRS485-1 -a A -t3 -r 290 -c 12 | grep Data | sed -e 's/.*Data://' -e 's/ 0x00/\\x/g')
  /dev/ttyRS485-1 opened successfully.
  Send jump to bootloader command and wait 2 seconds...
  Ok, device will jump to bootloader.
  mr6c__1.15.5_master_971fe50.wbfw opened successfully, size 14720 bytes
 
  Sending info block... OK
 
  Sending data block 108 of 108... OK.
  All done!
</syntaxhighlight>
</syntaxhighlight>


Если сигнатура устройства и файла прошивки не совпали, то вы получите сообщение об ошибке:
замените значения <code>/dev/ttyRS485-1</code> на имя устройства шины и '''A''' на адрес устройства.
<syntaxhighlight lang="bash">
Sending info block...
  Error while sending info block: Slave device or server failure
  Data format is invalid or firmware signature doesn't match the device
</syntaxhighlight>


== Восстановление прошивки устройства ==
В результате будет выведена строка с сигнатурой, например '''mr6c'''
{{Anchor|fw-recovery}}
Если во время обновления произошел сбой, то устройство перейдет в [[Wbincludes:Bootloader MOD | режим загрузчика]] и вы можете восстановить его прошивку.


=== Автоматически ===
Прошивку вы можете скачать например с помощью команды <code>wget</code>, для mr6c это будет выглядеть следующим образом:
Для автоматического восстановления прошивки одного или нескольких устройств можно использовать утилиту wb-mcu-fw-updater вы режимах '''recover''' и '''recover-all'''.


Чтобы восстановить устройство с адресом <code>10</code> и подключенное к порту <code>/dev/ttyRS485-1</code>, выполните команду:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
wb-mcu-fw-updater recover /dev/ttyRS485-1 -a 10
wget http://fw-releases.wirenboard.com/fw/by-signature/mr6c/stable/latest.wbfw
</syntaxhighlight>
</syntaxhighlight>


Подробнее о режимах recover и recover-all, читайте в [[Wb-mcu-fw-updater#Режимы|документации]].
=== Подключение устройства ===


=== Вручную ===
Прошивать устройство лучше по стандартному адресу (на который устройство отвечает из основной программы).
Если вы не можете воспользоваться [[wb-mcu-fw-updater]], то вы восстановить прошивку устройств можно с помощью сервисной утилиты [[wb-mcu-fw-flasher]]. Также этот способ могут использовать пользователи компьютеров с ОС Windows.


Для этого вам понадобится сама утилита и файл прошивки:
Так же можно прошивать по широковещательному адресу «0», если у вас одно устройство на шине в режиме загрузчика.
# Подключите устройство по [[RS-485 | шине RS-485]] к контроллеру или другому оборудованию, где установлена утилита прошивки.
{{Wbincludes:Prepare modbus_client}}
# [[Firmware Repository For Wiren Board Modbus Devices | Скачайте из репозитория]] файл прошивки для вашего устройства.
# Загрузите файл прошивки на [[View controller files from your computer | контроллер]] или другое устройство, на котором установлена утилита прошивки.
# Перейдите в папку с прошивкой и выполните команду:
#*на контроллере или компьютере с ОС Linux:
#:<syntaxhighlight lang="bash">
wb-mcu-fw-flasher -d /dev/ttyRS485-1 -a 25 -f ./firmware.wbfw
</syntaxhighlight>
#*на компьютере с ОС Windows:
#:<syntaxhighlight lang="bash">
wb-mcu-fw-flasher_1.0.3.exe -d COM1 -a 25 -f firmware.wbfw
</syntaxhighlight>


Здесь мы прошили находящееся в режиме загрузчика устройство с Modbus-адресом <code>25</code> и подключенное к порту <code>/dev/ttyRS485-1</code> (<code>COM1</code>) файлом <code>firmware.wbfw</code>.
Поэтому для прошивки нескольких устройств на шине можно:
#переводить в режим загрузчика (перезагрузкой по питанию или записью в регистр) и прошивать по отдельности с указанием нешироковещательного Modbus-адреса.
#переводить '''по очереди''' в режим загрузчика (перезагрузкой по питанию) и прошивать по адресу 0.


==Обновление прошивки устройств, подключенных к шлюзам WB-MGE и WB-MIO-E==
* '''Одновременная прошивка''' устройств невозможна — имеющаяся прошивка на устройствах будет испорчена.
[[Image: superport-config.png |350px|thumb|right| Настройки шлюза для обновления прошивки]]
* Перевести устройство в бутлоадер по широковещательному адресу 0 — '''нельзя'''!
Обновить прошивку устройства Wiren Board, подключенного к шлюзам [[WB-MGE_v.2_Modbus-Ethernet_Interface_Converter |WB-MGE]] и [[WB-MIO-E_v.2_Modbus_Interface_Converter |WB-MIO-E]] по RS-485, можно только в ручном режиме утилитой [[Wb-mcu-fw-flasher |wb-mcu-fw-flasher]]. Но сначала нужно отобразить сетевой порт в локальный утилитой [[Socat |socat]].
*'''При прошивке с контроллера остановите wb-mqtt-serial:'''<pre>service wb-mqtt-serial stop</pre>
* Если вместо <code>wb-mqtt-serial</code> используется стороннее ПО, опрашивающее устройства по последовательному порту - остановите это стороннее ПО


Шлюз должен быть настроен в режим TCP Server/None (для WB-MGE v2, WB-MIO-E v2) или TCP Server (для WB-MGE v1, WB-MIO-E v1).
=== Утилита wb-mcu-fw-flasher для прошивки устройств ===


===Обновление на любой скорости соединения===
Для установки утилиты '''на контроллер Wiren Board''' выполните команды:
<syntaxhighlight lang="bash">
apt update
apt install wb-mcu-fw-flasher
</syntaxhighlight>


Настройки соединения могут быть любыми только если:
Версия утилиты для '''MS Windows''': [[Media: Wb-mcu-fw-flasher_1.0.3.zip | Wb-mcu-fw-flasher_1.0.3.zip]]


*версия wb-mcu-fw-flasher не ниже '''1.3.0''' (доступно в [[testing |testing]]),
Для установки на '''компьютер с Debian''' скачайте пакет — [[Media: Wb-mcu-fw-flasher_1.0.3_amd64-all.deb | Wb-mcu-fw-flasher_1.0.3_amd64-all.deb]]
*текущая версия прошивки устройства поддерживает '''131''' регистр (см. Журналы изменений на страницах устройств),
и выполните команды в директории, куда загрузился пакет:
*текущая версия загрузчика не ниже '''1.3.0'''.
<syntaxhighlight lang="bash">
apt update
apt install libmodbus5
apt install ./Wb-mcu-fw-flasher_1.0.3_amd64-all.deb
</syntaxhighlight>


'''Иначе обновление можно выполнить только со [[WB_Modbus_Devices_Firmware_Update#Обновление_со_стандартными_настройками_соединения |стандартными настройками 9600N2.]]'''
Для контроллеров других производителей с процессорами ARM Cortex можно воспользоваться Debian-пакетом для Wiren Board: http://releases.contactless.ru/?prefix=stable/stretch/pool/main/w/wb-mcu-fw-flasher/


Ниже приведен пример со следующими исходными данными:
Опции запуска утилиты wb-mcu-fw-flasher:
{| class="wikitable"
! Параметр !! Описание !! Значение по умолчанию
|-
| -d || Устройство последовательного порта ('''обязательно''') ||
|-
| -f || Файл прошивки ||
|-
| -a || Адрес Modbus || 1
|-
| -j || Отправить на устройство команду перехода в режим загрузчика ||
|-
| -b || Скорость порта (baudrate) || 9600
|-
| -p || Чётность (parity) || N
|-
| -s || Количество стопбитов || 2
|-
| -r || Адрес holding-регистра для перехода в режим загрузчика || 129
|-
| -D || Включить режим отладки ||
|-
| -u || Восстановление заводских настроек UART и Modbus адреса ||
|-
| -e || Сброс всех настроек до заводских ||
|}


*Шлюз WB-MGE (WB-MIO-E), настроенный на Modbus over TCP и имеющий IP-адрес 192.168.0.7, порт 23.
Пример (устройство в рабочем режиме):
*Modbus-устройство Wiren Board с адресом 14.
<syntaxhighlight lang="bash">
*Соединение на скорости 115200 кбит/с.
wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw
</syntaxhighlight>


{{note|info|'''Внимание!''' В вашем случае настройки могут быть другими.}}
Пример для Windows (устройство в рабочем режиме):
 
<syntaxhighlight lang="bash">
#[[Firmware_Repository_For_Wiren_Board_Modbus_Devices |Приготовьте файл прошивки]] и установите утилиту socat, если ее нет:
wb-mcu-fw-flasher.exe -j -d COM10 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw
#:<syntaxhighlight lang="bash">
apt install socat
</syntaxhighlight>
#Дважды подключитесь к контроллеру по [[SSH |SSH]], у вас должно быть открыто два окна: первое для создания тоннеля socat, второе для отправки команд устройству.
#Остановите [[Wb-mqtt-serial_driver |wb-mqtt-serial]]:
#:<syntaxhighlight lang="bash">
systemctl stop wb-mqtt-serial
</syntaxhighlight>
#В первом окне запустите перенаправление утилитой socat с текущими настройками соединения:
#:<syntaxhighlight lang="bash">
socat -d -d -d -x PTY,raw,b115200,parenb=0,cstopb=2,cs8,link=/dev/ttyRS485-5 tcp:192.168.0.7:23
</syntaxhighlight>
#Во втором окне запустите обновление прошивки устройства утилитой [[Wb-mcu-fw-flasher |wb-mcu-fw-flasher]], используя параметр <code>-J</code>. Укажите файл прошивки, который приготовили в начале:
#:<syntaxhighlight lang="bash">
wb-mcu-fw-flasher -J -d /dev/ttyRS485-5 -a14 -f ./firmware.wbfw
</syntaxhighlight>
#Запустите wb-mqtt-serial
#:<syntaxhighlight lang="bash">
systemctl start wb-mqtt-serial
</syntaxhighlight>
</syntaxhighlight>


===Обновление со стандартными настройками соединения===
Здесь COM10 — имя виртуального последовательного порта, которое присвоено адаптеру USB RS-485.
Инструкция используется для устройств в которых текущая версия загрузчика ниже '''1.3.0''' и/или текущая прошивка не поддерживает '''131''' регистр.  


В этом случае обновление можно выполнить только на скорости '''9600N2''', указав параметр <code>-j</code> для утилиты wb-mcu-fw-flasher. Если используются другие настройки соединения сначала нужно изменить их на стандартные.
Пример для устройства с нестандартными настройками UART (со скоростью порта 115200):
<syntaxhighlight lang="bash">
wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw -b 115200
</syntaxhighlight>


Рекомендуем также обновить загрузчик если его версия ниже '''1.3.0'''. Это позволит в дальнейшем обновлять прошивку на [[WB_Modbus_Devices_Firmware_Update#Обновление_на_любой_скорости_соединения |любой скорости соединения]].
=== Прошивка устройств ===


Рассмотрим синтетический пример обновления прошивки устройств, в котором используются нестандартные настройки соединения:
Итого, порядок действий для ручной прошивки:
*Шлюз WB-MGE (WB-MIO-E), настроенный на Modbus over TCP и имеющий IP-адрес 192.168.0.7, порт 23.
#При прошивке с контроллера остановите <code>wb-mqtt-serial</code>.
*К шлюзу подключено устройство WB-MDM3 с адресом 58.
#Подключите устройство к RS-485.
*В настройках устройства и шлюза выставлена скорость 115200 кбит/с.
#Скачайте файл прошивки, например, <code>mr6c__1.14.1_master_19c9ca5.wbfw</code>
#Прошейте устройство утилитой wb-mcu-fw-flasher:<pre>wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f mr6c__1.14.1_master_19c9ca5.wbfw</pre>
#После успешной прошивки устройство само выйдет из режима загрузчика и перезапустится в основной программе.


{{note|info| '''Внимание!''' В инструкции рассмотрен пример, в котором устройства работают на скорости '''115200 8N2'''. В вашем случае настройки соединения могут быть другими.}}
Успешный процесс прошивки выглядит так:
Чтобы обновить прошивку:
<syntaxhighlight lang="bash">
#Дважды подключитесь к контроллеру по [[SSH |SSH]], у вас должно быть открыто два окна: первое для создания тоннеля socat, второе для отправки команд устройству.
  wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 1 -f mr6c__1.14.1_master_19c9ca5.wbfw   
#Остановите wb-mqtt-serial:
  /dev/ttyRS485-1 opened successfully.
#:<syntaxhighlight lang="bash">
  Send jump to bootloader command and wait 2 seconds...
systemctl stop wb-mqtt-serial
  Error: Connection timed out.
</syntaxhighlight>
  May be device already in bootloader, try to send firmware...
#В первом окне запустите перенаправление:
  mr6c__1.14.1_master_19c9ca5.wbfw opened successfully, size 12136 bytes
#:<syntaxhighlight lang="bash">
  Sending info block... OK
socat -d -d -d -x PTY,raw,b115200,parenb=0,cstopb=2,cs8,link=/dev/ttyRS485-5 tcp:192.168.0.7:23
  Sending data block 89 of 89... OK.
</syntaxhighlight>
  All done!
#:если у вас стабильный релиз до wb-2207 включительно, вместо параметра b115200, используйте <code>ispeed=115200,ospeed=115200</code>.
#Во втором окне измените скорость порта устройства на 9600 кбит/с:
#:<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -b115200 -pnone -s2 /dev/ttyRS485-5 -a58 -t0x06 -r110 96
</syntaxhighlight>
#В первом окне разорвите соединение socat клавишами <kbd>Ctrl</kbd>+<kbd>C</kbd>.
#В [[socat#Настройка шлюза для обновления прошивки | настройках шлюза]] установите скорость порта 9600 кбит/с.
#В первом окне снова запустите перенаправление socat с новыми параметрами соединения:
#:<syntaxhighlight lang="bash">
socat -d -d -d -x PTY,raw,b9600,parenb=0,cstopb=2,cs8,link=/dev/ttyRS485-5 tcp:192.168.0.7:23
</syntaxhighlight>
#:если у вас стабильный релиз до wb-2207 включительно, вместо параметра b9600, используйте <code>ispeed=9600,ospeed=9600</code>.
#Во втором окне запустите обновление прошивки устройства, например, утилитой wb-mcu-fw-flasher ([[WB_Modbus_Devices_Firmware_Update#Ручное_обновление|полная инструкция]]):
#:<syntaxhighlight lang="bash">
wb-mcu-fw-flasher -j -d /dev/ttyRS485-5 -a25 -f ./firmware.wbfw
</syntaxhighlight>
#После окончания прошивки верните в устройстве старую скорость 115200 кбит/с:
#:<syntaxhighlight lang="bash">
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-5 -a58 -t0x06 -r110 1152
</syntaxhighlight>
#В первом окне разорвите соединение socat клавишами <kbd>Ctrl</kbd>+<kbd>C</kbd>.
#В настройках шлюза измените скорость порта с 9600 кбит/с на 115200 кбит/с.
#Подключите шлюз к контроллеру по Ethernet.
#Запустите wb-mqtt-serial
#:<syntaxhighlight lang="bash">
systemctl start wb-mqtt-serial
</syntaxhighlight>
</syntaxhighlight>


Если вам нужно прошить несколько устройств, то вы можете сперва изменить им скорость, перенастроить шлюз, а потом так же поочереди их прошить, вернуть им прежнюю скорость и снова перенастроить шлюз.
Пример ошибки при несовпадении сигнатуры:
 
<pre>
===Настройка шлюза для обновления прошивки===
  Sending info block...
 
  Error while sending info block: Slave device or server failure
Самый простой способ изменить настройки шлюза — подключиться к его встроенному веб-интерфейсу. Для этого нужно:
  Data format is invalid or firmware signature doesn't match the device
 
</pre>
#подключить шлюз к компьютеру UTP кабелем напрямую или через роутер,
#присвоить компьютеру статический IP-адрес в сети шлюза, например, 192.168.0.201,
#открыть браузер и ввести IP-адрес шлюза, по умолчанию 192.168.0.7.
 
==  Полезные ссылки ==
* [[Restore factory settings Wiren Board Modbus device | Восстановление доступа — сброс настроек связи]]
* [[Wiren Board Device Modbus Address | Modbus-адрес устройства Wiren Board]]
* [[wb-mcu-fw-updater | Утилита обновления и восстановления прошивок wb-mcu-fw-updater]]
* [[wb-mcu-fw-flasher | Сервисная утилита wb-mcu-fw-flasher]]
* [[Firmware Repository For Wiren Board Modbus Devices |Репозиторий прошивок для Modbus-устройств Wiren Board]]

Версия 09:19, 6 мая 2021


Загрузчик прошивок

В новых версиях наших устройств реализован механизм загрузчика прошивок (bootloader). Он позволяет обновлять микропрограммы устройств/модулей Wiren Board по RS-485/Modbus RTU.

В режиме загрузчика основной функционал устройства отключается. Коммуникационные параметры в режиме загрузчика фиксированы и не зависят от значений в памяти устройства: 9600 8N2.

Переход в режим загрузчика

Внимание: Отображаемое название «Загрузчик периферийных устройств Wiren Board» переопределяет ранее заданное отображаемое название «Загрузка прошивок на устройства Wiren Board».

Описание

Что такое загрузчик (28:27)

В периферийных устройствах с Modbus есть прошивка, которая реализует заложенную логику работы. Чтобы прошивку можно было обновлять прямо в инсталляции по RS-485, в устройствах предусмотрен загрузчик (bootloader), который отвечает за инициализацию устройства и обновление прошивки.

В документации на каждое устройство есть раздел «Обновление прошивки», где есть ссылки на инструкцию по обновлению и список изменений. В это статье мы рассмотрим только обновление загрузчика.

Переход устройств в режим загрузчика

Индикация режима загрузчика

Устройство находится в режиме загрузчика в следующих случаях:

  • первые 2 секунды после включения питания, если на устройстве есть корректная прошивка;
  • постоянно, если на устройстве нет корректной прошивки, например, был сбой при обновлении прошивки;
  • при записи 1 в holding-регистр 129(0x81) в момент работы основной программы — в этом случае устройство перезагружается и остается в режиме загрузчика 120 секунд с параметрами соединения 9600N2. Этот режим можно активировать запустив утилиту wb-mcu-fw-flasher с ключем -j.
  • при записи 1 в holding-регистр 131(0x83) в момент работы основной программы — в этом случае устройство перезагружается и остается в режиме загрузчика 120 секунд с параметрами соединения, установленными в настройках устройства. Это может быть полезно для обновления устройств за шлюзами без перенастройки параметров шлюза.
    Перейти в этот режим можно в wb-mcu-fw-flasher начиная с версии 1.3.0 запустив его с ключем -J. Кроме того для запуска режима необходима поддержка со стороны загрузчика (версия 1.3.0 и выше) и со стороны прошивки (см. changelog прошивки).

В режиме загрузчика индикатор Status устройства мигает с периодом 1 секунда, а при записи прошивки мигание индикатора учащается.

Восстановление прошивки описано в статье Обновление прошивки Modbus-устройств Wiren Board.

Проверка связи с устройством в режиме загрузчика

Загрузчик продолжает слушать шину RS-485 и отвечает на опрос некоторых регистров. Можно прочитать сигнатуру устройства используя команду modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r290 -c12 Важно: именно 12 регистров одним запросом, начиная с адреса 290.

Список изменений

Изменения во всех версиях описаны на странице Список изменений в загрузчике.

Обновление загрузчика

Текущую версию загрузчика можно узнать, считав 8 holding регистров с адреса 330, например, с помощью modbus_client:

echo -e $(modbus_client -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r330 -c8 | grep Data | sed -e 's/.*Data://' -e 's/ 0x00/\\x/g')

Есть несколько способов обновления загрузчика:

С контроллера Wiren Board

Загрузчик обновляется из консоли контроллера Wiren Board утилитой wb-mcu-fw-updater, которой для работы нужен доступ в интернет. Если интернета нет, используйте другой способ.

Учитывайте, что утилита учитывает установленный на контроллер релиз ПО , то есть вы не сможете зашить тестовую версию загрузчика, если на контроллере стабильный релиз.

Перед обновлением загрузчика, обновите прошивку контроллера через apt или другим способом по инструкциям.

Обновление загрузчика одного устройства

Процесс:

  1. Подключитесь к контроллеру по SSH.
  2. Запустите команду, заменив в ней порт и адрес:
    wb-mcu-fw-updater update-bl /dev/ttyRS485-1 -a1
    

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

Обновление загрузчика всех устройств

Начиная с версии 1.10.8 утилита wb-mcu-fw-updater умеет в режиме обновление прошивок устройств проверять и версии загрузчика, а потом обновлять его:

  1. Подключитесь к контроллеру по SSH.
  2. Запустите команду:
    wb-mcu-fw-updater update-bl /dev/ttyRS485-1 -a1
    
  3. Если есть новые версии загрузчика для устройств, утилита запросит подтверждение на обновление загрузчика, нужно ответить y. Если откажетесь, прошивка обновиться, но загрузчик останется старым.

Пример:

# wb-mcu-fw-updater update-all
2024-04-03 07:17:24,061 Will probe all devices on enabled serial ports of /etc/wb-mqtt-serial.conf:
2024-04-03 07:17:24,063 Probing WB-MAP6S fw2 (port: /dev/ttyRS485-1, slaveid: 26, uart_params: 9600N2, response_timeout: 0.50)...
2024-04-03 07:17:26,460 Update: 2.8.0-rc1 -> 2.8.1 (WB-MAP6S fw2 (26, /dev/ttyRS485-1))
2024-04-03 07:17:27,128 Flashing firmware to WB-MAP6S fw2 (26, /dev/ttyRS485-1)
2024-04-03 07:17:28,073 
2024-04-03 07:17:28,073 Bootloader update (v1.3.0 -> v1.4.1) for map6semG16 /dev/ttyRS485-1:26 is available! (bootloader updates are highly recommended to install) Do a bootloader update? [Y/N]

С компьютера и других устройств

Установка утилиты

Если у вас нет контроллера Wiren Board или на нём нет интернета, можно обновить загрузчик в ручном режиме утилитой wb-mcu-fw-flasher, которую надо установить по инструкции.

Чтение сигнатуры

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

Сделать это можно прочитав 12 holding регистров с адреса 290, например, с помощью modbus_client:

echo -e $(modbus_client -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r290 -c12 | grep Data | sed -e 's/.*Data://' -e 's/ 0x00/\\x/g')

В результате на экран будет выведена строка вида mwac0 — это и есть сигнатура.

Скачивание файлов

Чтобы скачать файл с загрузчиком, перейдите по адресу https://fw-releases.wirenboard.com/?prefix=bootloader/by-signature/ ,выберите папку с полученной выше сигнатурой, далее раздел main и скачайте файл latest.wbfw.

Чтобы скачать прошивку, перейдите по адресу https://fw-releases.wirenboard.com/?prefix=fw/by-signature/. ,выберите папку с полученной выше сигнатурой, далее раздел main и скачайте файл latest.wbfw. Если вам необходима конкретная версия прошивки, можно скачать именно её.

Прошивка

Теперь, когда файлы обновления загрузчика и прошивки скачаны, их надо зашить в устройство:

  1. Запустите обновление загрузчика, замените порт /dev/ttyRS485-1, скорость -b, адрес -a и имя файла на свои:
    wb-mcu-fw-flasher -d /dev/ttyRS485-1 -b9600 -a1 -f wb-bootloader-updater_mwac0__1.4.1_master_e676613.wbfw -j
    
    утилита сотрёт прошивку и зашьёт новый загрузчик.
  2. Запустите обновление прошивки, замените порт /dev/ttyRS485-1, скорость -b, адрес -a и имя файла на свои:
    wb-mcu-fw-flasher -d /dev/ttyRS485-1 -b9600 -a1 -f mwac0__1.21.1_main_ac00010.wbfw
    
    так как устройство со стёртой прошивкой находится в загрузчике, то в команде выше нет ключа -j.

Более подробно про ручное обновление прошивки читайте в статье Обновление прошивки Modbus-устройств Wiren Board

Известные ошибки

Список известных неисправностей

Автоматическое обновление прошивки с контроллера Wiren Board

Прошивку устройств, подключенных к контроллеру Wiren Board можно обновить с помощью утилиты wb-mcu-fw-updater. Утилита проверяет наличие новой версии прошивки для всех подключенных устройств и, при необходимости, обновляет их.

Для установки выполните в консоли:

dpkg -s wb-mcu-fw-updater || (apt update && apt install wb-mcu-fw-updater)

Утилита автоматически останавливает сервис wb-mqtt-serial перед началом работы и запускает заново после. Если вместо wb-mqtt-serial используется стороннее ПО, опрашивающее устройства по последовательному порту — остановите это ПО.

Для обновления прошивки всех устройств, описанных в разделе Serial Devices Configuration (файл /etc/wb-mqtt-serial.conf), выполните:

wb-mcu-fw-updater update-all

Для обновления прошивки конкретного устройства, укажите порт и его адрес Modbus:

wb-mcu-fw-updater update-fw /dev/ttyRS485-2 -a70

Подробную информацию смотрите в выводе

wb-mcu-fw-updater --help

Ручная прошивка устройств

Выбор прошивки

Прошивки публикуются на сайте fw-releases.wirenboard.com в виде файлов с расширением .wbfw.

Прошивки сгруппированы по версиям и сигнатурам (типам) устройств.

Каждое Modbus устройство Wiren Board имеет сигнатуру — наименование аппаратного типа устройства. Перезапись прошивки возможна только при совпадении сигнатур устройства и прошивки.

Сигнатура устройства хранится в формате строки из 12 ASCII символов, по одному символу в регистре, и доступна по адресу 290. Получить можно командой:

echo -e $(modbus_client -mrtu -pnone -s2 /dev/ttyRS485-1 -a A -t3 -r 290 -c 12 | grep Data | sed -e 's/.*Data://' -e 's/ 0x00/\\x/g')

замените значения /dev/ttyRS485-1 на имя устройства шины и A на адрес устройства.

В результате будет выведена строка с сигнатурой, например mr6c

Прошивку вы можете скачать например с помощью команды wget, для mr6c это будет выглядеть следующим образом:

wget http://fw-releases.wirenboard.com/fw/by-signature/mr6c/stable/latest.wbfw

Подключение устройства

Прошивать устройство лучше по стандартному адресу (на который устройство отвечает из основной программы).

Так же можно прошивать по широковещательному адресу «0», если у вас одно устройство на шине в режиме загрузчика.

Поэтому для прошивки нескольких устройств на шине можно:

  1. переводить в режим загрузчика (перезагрузкой по питанию или записью в регистр) и прошивать по отдельности с указанием нешироковещательного Modbus-адреса.
  2. переводить по очереди в режим загрузчика (перезагрузкой по питанию) и прошивать по адресу 0.
  • Одновременная прошивка устройств невозможна — имеющаяся прошивка на устройствах будет испорчена.
  • Перевести устройство в бутлоадер по широковещательному адресу 0 — нельзя!
  • При прошивке с контроллера остановите wb-mqtt-serial:
    service wb-mqtt-serial stop
  • Если вместо wb-mqtt-serial используется стороннее ПО, опрашивающее устройства по последовательному порту - остановите это стороннее ПО

Утилита wb-mcu-fw-flasher для прошивки устройств

Для установки утилиты на контроллер Wiren Board выполните команды:

apt update
apt install wb-mcu-fw-flasher

Версия утилиты для MS Windows: Wb-mcu-fw-flasher_1.0.3.zip

Для установки на компьютер с Debian скачайте пакет — Wb-mcu-fw-flasher_1.0.3_amd64-all.deb и выполните команды в директории, куда загрузился пакет:

apt update
apt install libmodbus5
apt install ./Wb-mcu-fw-flasher_1.0.3_amd64-all.deb

Для контроллеров других производителей с процессорами ARM Cortex можно воспользоваться Debian-пакетом для Wiren Board: http://releases.contactless.ru/?prefix=stable/stretch/pool/main/w/wb-mcu-fw-flasher/

Опции запуска утилиты wb-mcu-fw-flasher:

Параметр Описание Значение по умолчанию
-d Устройство последовательного порта (обязательно)
-f Файл прошивки
-a Адрес Modbus 1
-j Отправить на устройство команду перехода в режим загрузчика
-b Скорость порта (baudrate) 9600
-p Чётность (parity) N
-s Количество стопбитов 2
-r Адрес holding-регистра для перехода в режим загрузчика 129
-D Включить режим отладки
-u Восстановление заводских настроек UART и Modbus адреса
-e Сброс всех настроек до заводских

Пример (устройство в рабочем режиме):

wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw

Пример для Windows (устройство в рабочем режиме):

wb-mcu-fw-flasher.exe -j -d COM10 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw

Здесь COM10 — имя виртуального последовательного порта, которое присвоено адаптеру USB RS-485.

Пример для устройства с нестандартными настройками UART (со скоростью порта 115200):

wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw -b 115200

Прошивка устройств

Итого, порядок действий для ручной прошивки:

  1. При прошивке с контроллера остановите wb-mqtt-serial.
  2. Подключите устройство к RS-485.
  3. Скачайте файл прошивки, например, mr6c__1.14.1_master_19c9ca5.wbfw
  4. Прошейте устройство утилитой wb-mcu-fw-flasher:
    wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f mr6c__1.14.1_master_19c9ca5.wbfw
  5. После успешной прошивки устройство само выйдет из режима загрузчика и перезапустится в основной программе.

Успешный процесс прошивки выглядит так:

   wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 1 -f mr6c__1.14.1_master_19c9ca5.wbfw    
   /dev/ttyRS485-1 opened successfully.
   Send jump to bootloader command and wait 2 seconds...
   Error: Connection timed out.
   May be device already in bootloader, try to send firmware...
   mr6c__1.14.1_master_19c9ca5.wbfw opened successfully, size 12136 bytes
   Sending info block... OK
   Sending data block 89 of 89... OK.
   All done!

Пример ошибки при несовпадении сигнатуры:

   Sending info block...
   Error while sending info block: Slave device or server failure 
   Data format is invalid or firmware signature doesn't match the device