0
Завершен
Разделение старшего и младшего байта в 16-битном слове
Ekaterina (head of support) 10 лет назад
в Продукты / Modbus
•
обновлен Sergey (expert) 10 лет назад •
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) });
Сервис поддержки клиентов работает на платформе 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);
}