0
Answered

Разделение двух байтов.

Кирилл 7 years ago updated by Aleksandr Romanov (CTO) 7 years ago 16

Добрый день. Не подскажите как можно осуществить разделение двух байтов,  которые получены из регистра под адресом 16534? И теперь разделенные два байта вывести на два разных дисплея? Спасибо. 

https://stackoverflow.com/questions/29712951/how-to-convert-two-8-bits-to-16-bits-and-vice-versa-in-javascript

    var firstNumber = 1118; // extracted from Uint16Array
    var high = ((firstNumber >> 8) & 0xff);
    var low = firstNumber & 0xff;
    IR.Log(high + ", "+ low); // 94, 4
    var _firstNumber = (((high & 0xff) << 8) | (low & 0xff));
    IR.Log(_firstNumber); // 1118

Получение и отправка данных драйвера уже была описана http://support.iridiummobile.net/topics/13550-bitovaya-maska-modbus-tcp/#comment-81283

Что такое "два разных дисплея"?

Что такое "два разных дисплея"?


Это два разных Itemа. Два квадрата нарисованные в поле создания. И с написанными в них $V.)) 

  var firstNumber = 1118; // extracted from Uint16Array

Это получается число задается внутри блока программы. В моем же случае. Я получаю из регистра значение. Может есть команда с помощью которой можно объявить регистр, и вытащить из него значение числа?

Я начал писать, но какая то глупость получается. 

var gDriver = IR.GetDevice("Modbus TCP");
{
   var num = 0x649F;
   var hibyte = num >> 8;
   var lobyte = num & 0xFF;
   
IR.Log("hibyte");
IR.Log("lobyte");
});

+1

по ссылке выше моем комментарии

IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("Modbus TCP")), function(name, value) 
{  
  IR.Log(" Name: " + name + " Value: " + value);
  if (name=="Channel_Feedback 16406") {
    var high = ((value >> 8) & 0xff);
    var low = value & 0xff;        
    IR.Log(value + " h: " + high + " l: " + low);
    //dev.Set("Channel_Command 16406", value );
  }
});

если не по событию

var dev=IR.GetDevice("Modbus TCP");
var value=dev.GetFeedback("Channel_Feedback 16406");

Так, с этим вроде бы понятно. А как вывести теперь значение этого регистра на два квадрата? Чтобы значение младшего байта было в одном квадрате, а значение старшего было в соседнем?

Да, Вы правильно поняли)

IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("Modbus TCP")), function(name, value) 
{  
  if (name=="16534") {
    var high = ((value >> 8) & 0xff);
    var low = value & 0xff;        
    IR.Log(value + " h: " + high + " l: " + low);
    IR.GetPage("Page 2").GetItem("Item 1").Value = high
    IR.GetPage("Page 2").GetItem("Item 2").Value = low
  }
});

Воткнул в JS данный код. Предварительно создал два Item. Накинул из канала FeedBack с заданными регистрами две связи на эти Item. Запустил эмулятор. Получил на двух итемах дублированные значения из регистра. Они не изменили вида. Может я делаю все по кривому?

Channel_Feedback 16406

это было имя feedback'а, для Item'ов добавлять не надо

только должно быть верное имя feedback'а в сравнении

name=="abcde 16534"


name=="Channel_Feedback 16534"

нужно указать в таком формате?

Потому что мой фитбэк называется 16534

Нет, просто перенести имя фидбэка в кавычки, "16534" тоже должно работать, если фидбэк так называется

Все равно не получается.

Второй день сижу. Не могу понять. В чем проблема? Помогите пожалуйста. Ответ выводится аналогичный.

IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("Modbus TCP")), function(name, value) 
{  
  if (name=="16534") {
    var high = ((value >> 8) & 0xFF);
    var low = value & 0xFF;        
    IR.Log(value + " h: " + high + " l: " + low);
    IR.GetPage("Page 1").GetItem("1").Value = high
    IR.GetPage("Page 1").GetItem("2").Value = low
  }
});

Ошибка нашлась в листинге. Была написана лишняя скобка. Скрипт работает. Спасибо.