Yacht Devices Новости: NMEA 2000 Bridge 1.01 и новая программа CAN Log Viewer
19.10.2016
Прошивка v.1.01 для NMEA 2000 Bridge включает в себя два существенных изменения: в языке программирования появились новые ключевые слова init() и heartbeat(), а также добавлен дополнительный формат журналов. И мы рады представить новый инструмент для просмотра и конвертации логов: CAN Log Viewer.
В этой прошивке в язык программирования были добавлены новые ключевые слова init() и heartbeat(). Они позволяют создавать действительно умные программы.
init() может использоваться для инициализации переменных программы; он гарантированно будет вызван при включении устройства перед любым другим кодом пользователя. Обратите внимание: программа внутри init() не может отправлять сетевые сообщения, поскольку стандарт NMEA 2000 запрещает отправку любых сообщений в течение первых 250 миллисекунд после процедуры запроса адреса устройства, и любые вызовы send() из кода пользователя будут игнорироваться.
heartbeat() можно использовать, когда программа (или часть пользовательского кода) должна выполняться периодически. В параметре необходимо указать периодичность в миллисекундах. Ключевое слово heartbeat() сначала вызывается из программы пользователя сразу после init().
Эти новые функции помогают создавать действительно умные программы. Например, нам нужно заблокировать сообщение о глубине воды (PGN 0x1F50B) от устройства с адресом 0x19 в сети NMEA 2000. На первый взгляд кажется, что эту задачу можно выполнить с помощью очень короткой программы:
match(ANY,0x1F50B19,0x1FFFFFF) { }
В приведенном выше коде match() не имеет внутри команды send(), поэтому сообщения с идентификатором 0x1F50B19 (0x19 — адрес, а 0x1F50B — глубина воды PGN) никогда не будут пересылаться Bridge, поэтому они блокируются.
Эта программа может хорошо работать в течение многих лет. Но адреса NMEA 2000 настраиваются самостоятельно, и когда вы добавляете новое устройство в сеть NMEA 2000, возможно, что адрес 0x19 будет занят новым устройством, и наш эхолот изменит свой адрес, например, на 0x25. В этом случае указанная выше программа начнет блокировать сообщения от других устройств и данные о глубине воды будут доступны в сети.
Чтобы решить такие проблемы, мы можем использовать структуру устройства NAME вместо адреса устройства. NAME имеет 8-байтовую структуру, отправленную устройством в сообщении «Заявка адреса ISO» (PGN 0xEE00). Эта структура содержит код производителя и уникальный идентификатор устройства (присвоенный производителем). Используя имя устройства, мы можем быть уверены, что никогда не заблокируем данные другого устройства.
Для начала нам нужно поймать NAME. Это можно сделать с помощью следующей программы (при условии, что рассматриваемое устройство находится в подсети CAN1):
DIAGNOSTICS=30 # Turn on logging for 30 seconds heartbeat(5000) { if (c < 5) { set(0,UINT32,0x18EAFF00 + addr()) # Message ID of ISO Request set(4,UINT8,0xff) # marker of single-frame message set(5,UINT8,3) # data length set(DATA,UINT32,0x00EE00) # Request for ISO Address Claim send(CAN1) c = c + 1 } } match(CAN1,0x0EE0000,0x1FF0000) # ISO Address Claim from any address { send() } match(CAN1,0x1F50B00,0x1FFFF00) # Water Depth from any address { send() }
Эта программа включает ведение журнала на 30 секунд и каждые 5 секунд отправляет широковещательные запросы на сообщение ISO Address Claim. Устройство сохраняет в файл журнала только совпадающие сообщения, поэтому мы добавили два оператора match() для сообщений ISO Address Claim и Water Depth.
В результате лог-файл устройства будет содержать следующие данные (мы выделили NAME и адрес интересующего устройства):
00:00.310 RX CAN1 FILTER 01, 0x18EEFF2B E4E37EE7008C8CC0 00:00.312 RX CAN1 FILTER 01, 0x18EEFF6F BB1668E72C96A0C0 00:00.315 RX CAN1 FILTER 01, 0x18EEFF6E A5FC61E72B96A0C0 00:00.314 RX CAN1 FILTER 01, 0x18EEFFAC F0A963E7388250C0 00:01.005 RX CAN1 FILTER 02, 0x0DF50B6E 001E010000E701FF 00:02.005 RX CAN1 FILTER 02, 0x0DF50B6E 001E010000E701FF 00:03.005 RX CAN1 FILTER 02, 0x0DF50B6E 001E010000E701FF 00:04.005 RX CAN1 FILTER 02, 0x0DF50B6E 001E010000E701FF 00:05.000 TX CAN1 HEARTBEAT, 0x18EAFF20 00EE00
Теперь мы готовы создать умную программу, которая будет блокировать сообщение о глубине воды этого устройства с помощью NAME.
init() { x = 0xE761FCA5 # Low double word of NAME y = 0xC0A0962B # High double word of NAME z = 0xff # Invalid value of device's address # Prepare ISO Request message and save to SLOT1 set(0,UINT32,0x18EAFF00 + addr()) set(4,UINT8,0xff) set(5,UINT8,3) set(DATA,UINT32,0x00EE00) save(SLOT1) } heartbeat(5000) # Send request if device's address is still invalid { if (z == 0xff) { load(SLOT1) send(CAN1) } } match(CAN1,0x0EE0000,0x1FF0000) # Check the NAME and save the address { if (get(DATA+0,UINT32) == x) { if (get(DATA+4,UINT32) == y) { z = get(0,UINT8) } } send() } match(CAN1,0x1F50B00,0x1FFFF00) # Water Depth filter { if (z == 0xff) { a = 0xff } else { a = get(0,UINT8) } if (a != z) { send() } }
Эта программа ожидает запроса адреса устройства с необходимой структурой NAME (полученной с помощью предыдущей программы). Каждые 5 секунд Устройство будет отправлять широковещательные запросы на получение адреса, пока не будет найдено подходящее устройство. Пока устройство не найдено, Bridge не будет пересылать сообщения о глубине воды, полученные от каких-либо устройств.
Конечно, эта программа может быть более элегантной, и вы можете решить эту задачу другими способами. Например, может быть лучше пересылать все сообщения о глубине воды, пока адрес рассматриваемого устройства все еще запрашивается. Конечно, вы можете сделать это легко!
Bridge теперь поддерживает два формата файлов журналов: текстовый и двоичный. По умолчанию используется текстовый формат (см. пример такого журнала выше). Вы также можете принудительно использовать текстовые журналы в тексте программы:
LOG_FORMAT=TEXT
Новые двоичные журналы хранятся в файлах с расширением. Расширение CAN. В отличие от текстовых журналов, которые содержат только сообщения, соответствующие фильтрам (или отправленные из фильтров), двоичные журналы содержат все сообщения, полученные или переданные на обоих интерфейсах CAN. И в отличие от текстовых журналов, вы не можете использовать функцию log() для сохранения значений переменных в двоичный файл журнала.
Чтобы использовать новые двоичные журналы, добавьте в код программы следующую строку:
LOG_FORMAT=BINARY
И мы рады представить новый инструмент для просмотра, воспроизведения и конвертации. Файлы CAN: CAN Log Viewer. Этот простой инструмент может конвертировать файлы. CAN в формате. CSV (электронные таблицы), текст и файлы. DAT (формат Voyage Recorder). Он также может импортировать файлы. CSV в формате. Формат CAN. Этот инструмент является бесплатным и работает под Microsoft Windows, Linux и Max OS X.
Рисунок 1. Скриншот CAN Log Viewer, нажмите для увеличения
. Формат двоичных журналов CAN описан в документации CAN Log Viewer. Этот формат очень простой, и мы будем рады, если другие компании тоже добавят поддержку этого формата. Вскоре формат будет поддерживаться в следующих продуктах Yacht Device: Voyage Recorder, Engine Gateway, YDVR Converter.
Мы также рады сообщить, что Voyage Recorder сможет «играть». Файлы CAN в физическую сеть CAN в ближайшее время. Эта функция предназначена для тестирования, демонстрации и имитации морского оборудования. Теперь это превосходное устройство может делать и то, и другое: записывать все данные яхты и эмулировать всю яхту!
CAN Log Viewer и новое обновление прошивки для NMEA 2000 Bridge доступны по адресу загрузок .
Дополнительная информация о CAN Log Viewer: www.yachtd.com/products/can_view.html
Дополнительная информация о NMEA 2000 Bridge: www.yachtd.com/products/nmea_bridge.html
