0
Completed

Division of low and high bytes in 16-bit word

Ekaterina (head of support) 5 years ago in Products / Modbus updated by Sergey (expert) 5 years ago 8
We get a decimal number (2 bytes) have to be converted to HEX, the low byte have to be separated from high byte. Separeated bytes have to be converted back to DEC to get two decimal digits by 8-bit.

IR.AddListener(IR.EVENT_TAG_CHANGE,IR.GetDevice("Modbus TCP"),function(item,value) // listener of ModBus TCP tag change
{
   if(item == "Feedback 1") //register name
   {
// we have a DEC number of 16-bit saved as a string
var dec2byte = "27542";
// Convert it in digit, and then in the HEX string
var hex2byte = parseInt(dec2byte).toString(16);
// Get the first byte from this string
var hexfirst = hex2byte.charAt(0) + hex2byte.charAt(1);
// Get the second byte from this string
var hexsecond = hex2byte.charAt(2) + hex2byte.charAt(3);
// get the DEC numbers from this HEX strings
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);
}