0
Completed
Division of low and high bytes in 16-bit word
Ekaterina (head of support) 10 years ago
in Products / Modbus
•
updated by Sergey (expert) 10 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) });
Customer support service by UserEcho
Есть необходимость управлять модулями вывода от 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);
}