В процессе настройки устройства столкнулся со следующей проблемой: необходимо выполнить запись даты одновременно в три регистра в формате HEX.
Через Modbus Poll данная операция выполняется успешно (скриншот прилагаю).
При попытке реализовать это на Wiren Board с помощью конфигурации, указанной ниже, последний регистр не записывается. Предполагаю, что данные отправляются отдельным запросом, из-за чего устройство не обрабатывает их корректно.
Рассматриваю вариант использования формата u64 с захватом дополнительного регистра, однако в этом случае значение отправляется в десятичном формате, что неудобно для дальнейшей работы.
Подскажите, пожалуйста, как корректно настроить отправку данных в три регистра одним запросом в формате hex в среде Wiren Board? Возможно, я упускаю какие-то нюансы настройки.
К сожалению конечному пользователю будет не удобно работать с командной строкой. Хотелось бы сделать шаблон, что бы конечный пользователь через веб интерфейс мог выбрать устройство и настроить без использования костылей….
Здравствуйте! В шаблоне я использовал формат 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) без использования командной строки и правил. Заранее спасибо!