Запись данных в несколько регистров одним запросом (Modbus)

image

В процессе настройки устройства столкнулся со следующей проблемой: необходимо выполнить запись даты одновременно в три регистра в формате HEX.
Через Modbus Poll данная операция выполняется успешно (скриншот прилагаю).

При попытке реализовать это на Wiren Board с помощью конфигурации, указанной ниже, последний регистр не записывается. Предполагаю, что данные отправляются отдельным запросом, из-за чего устройство не обрабатывает их корректно.

Рассматриваю вариант использования формата u64 с захватом дополнительного регистра, однако в этом случае значение отправляется в десятичном формате, что неудобно для дальнейшей работы.

Подскажите, пожалуйста, как корректно настроить отправку данных в три регистра одним запросом в формате hex в среде Wiren Board? Возможно, я упускаю какие-то нюансы настройки.

шаблон:

Analyzer.json (11,7 КБ)

Конфигурация:

{
  “name”: “Установка времени”,
  “type”: “text”,
  “readonly”: false,
  “group”: “commands”,
  “consists_of”: [
    {“reg_type”: “holding_multi”, “address”: 16394, “format”: “bcd32”, “byte_order”: “big_endian”, “word_order”: “big_endian”},
    {“reg_type”: “holding_multi”, “address”: 16396, “format”: “bcd16”, “byte_order”: “big_endian”, “word_order”: “big_endian”}
  ],
  “description”: “дата”
}

Заранее спасибо за помощь.

Добрый день.
Хочется немного больше понимания.
Как будто достаточно будет для предложенной конфигурации использовать нашу утилиту modbus_client?

как пример

defineRule("sync_time_to_analyzer", {
  whenChanged: "metal_analyzer/Синхронизировать время",
  then: function (newValue) {
    if (!newValue) return;

    runShellCommand(
      'modbus_client -mrtu -a1 -r 16394 -t 0x10 -c 3 /dev/ttyRS485-1 0x2603 0x2709 0x2630'
    );
  }
});

К сожалению конечному пользователю будет не удобно работать с командной строкой. Хотелось бы сделать шаблон, что бы конечный пользователь через веб интерфейс мог выбрать устройство и настроить без использования костылей….

В данном случае могу порекомендовать инструкции:
Как писать шаблоны для сторонних Modbus-устройств
Описание движка правил wb-rules и его более детальное описание на гитхаб, примеры правил и погонять это через ИИ, потестировать как будет работать на отладке.

Здравствуйте! В шаблоне я использовал формат u64, хотя это не совсем корректно, так как затрагивается лишний регистр. В моём случае это некритично, но технически это скорее временное решение.

Ниже привожу конфигурацию:

json

{
  “name”: “Установка времени”,
  “type”: “value”,
  “reg_type”: “holding_multi”,
  “address”: 16394,
  “format”: “u64”,
  “byte_order”: “little_endian”,
  “word_order”: “little_endian”,
  “group”: “commands”,
  “description”: “Введите 1 и время синхронизируется с системным”
}

В правиле я реализовал преобразование в нужный для устройства формат системной даты и времени, и автоматическую проверку всех возможных адресов устройств (от 0 до 255), чтобы конечному пользователю не приходилось каждый раз вручную править правило. Решение получилось не самым изящным, но рабочим:

javascript

function formatTwoDigits(num) {
  return num < 10 ? "0" + num : "" + num;
}

function getCurrentTimeString() {
  var now = new Date();
  var sec   = formatTwoDigits(now.getSeconds());
  var min   = formatTwoDigits(now.getMinutes());
  var hour  = formatTwoDigits(now.getHours());
  var day   = formatTwoDigits(now.getDate());
  var month = formatTwoDigits(now.getMonth() + 1);
  var year  = formatTwoDigits(now.getFullYear() % 100);
  return sec + min + hour + day + month + year;
}

function sendTime(topicName) {
  var timeStr = getCurrentTimeString();
  var decValue = parseInt(timeStr, 16);
  if (!isNaN(decValue)) {
    dev[topicName] = decValue;
  }
}

for (var addr = 0; addr <= 255; addr++) {
  var topic = "metal_analyzer_" + addr + "/Установка времени";
  (function(topicFixed) {
    defineRule({
      when: function() {
        return dev[topicFixed] == 1;
      },
      then: function() {
        setTimeout(function() {
          sendTime(topicFixed);
        }, 2000);
      }
    });
  })(topic);
}

Было бы здорово, если в будущем появится возможность записи нескольких регистров одним запросом (как в hex, так и в dec) без использования командной строки и правил. Заранее спасибо!