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.

 

Скриншот CAN Log Viewer, нажмите, чтобы увеличить

Рисунок 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