0
Voltooid

Разделение старшего и младшего байта в 16-битном слове

Ekaterina (head of support) 10 jaar geleden in Products / Modbus bijgewerkt door Sergey (expert) 10 jaar geleden 8
Мы получаем десятичное число, которое нужно перевести в НЕХ (2 байта), отделить младший байт от старшего и по отдельности перевести их обратно в DEC (получить два десятичных числа)

IR.AddListener(IR.EVENT_TAG_CHANGE,IR.GetDevice("Modbus TCP"),function(item,value) // активируем слушатель изменения любого тега драйвера ModBus TCP
{
   if(item == "Feedback 1") // указываем имя регистра, к которому нужно применить битовую маску
   {
// Изначально было 10-ое 2-ух байтовое в виде строки 
var dec2byte = "27542";
// Конвертируем в число, а затем в 16-ую строку
var hex2byte = parseInt(dec2byte).toString(16);
// Получаем первый байт из строки 
var hexfirst = hex2byte.charAt(0) + hex2byte.charAt(1);
// Получаем второй байт из строки
var hexsecond = hex2byte.charAt(2) + hex2byte.charAt(3);
// Получаем десятичное число из 16-ых байтов в строке 
decfirst = parseInt(hexfirst, 16);
decsecond = parseInt(hexsecond, 16);

IR.Log(decfirst)
IR.Log(decsecond)
});
Екатерина, спасибо, есть ещё вопросик о HEX: существует готовый скрипт управления 16-ти битным словом по битам с обратной связью?
Есть необходимость управлять модулями вывода от 7 до 16 бит.

На мой взгляд, в следующих релизах неплохо было бы сделать управление отдельными битами в слове такой же стандартной функцией как слайдер с up/down button.
Добрый день, Евгений!

Для управления по битам, потребуется преобразовать числа в двоичную систему, точно так же как с 16-ой:

bytes = 0xFF;
bits = parseInt(bytes, 16).toString(2);

bit = bits.charAt(0) // от 0 до 15, если 16 битов

Сергей, это как раз понятно. Не понятно как собрать биты в слово и при этом учесть реальное состояние битов в модуле вывода, чтобы не отключить уже включенный бит. Обратная связь с модулем есть.
Добрый день, Евгений!
В событии EVENT_TAG_CHANGE, сохраняйте текущее состояние полученных битов, на их основе формируйте слово (например, заменив часть его на новые биты)
Сергей, пример с пояснениями можно?
Добрый день, Евгений!

Вот пример скрипта, в нем приходят данные в канал "Feedback 1" и на их основе формируется новая команда с замененным вторым битом. После этого она может быть отправлена.

// Слово для отправки
var command;

IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("Modbus TCP"), function(item, value_in_bytes) // активируем слушатель изменения любого тега драйвера ModBus TCP
{
if(item == "Feedback 1") // указываем имя регистра
{

// получаем биты из байтов
var bits = parseInt(value_in_bytes, 16).toString(2);
var bit0 = bits.charAt(0) // от 0 до 15, если 16 битов
var bit1 = bits.charAt(1) // от 0 до 15, если 16 битов
//.. и т.д

// Бит на замену
var other_bit = "1";

// Вставляем в команду новый бит
command = bit0 + other_bit;

// отправляем слово
SendCommand();
}
});

function SendCommand () {
        IR.GetDevice("Modbus TCP").Set("Имя команды", command);
}