Изменения бита в аналоговом значении

Подскажите как будет выглядеть синтаксис в правилах, чтобы задать в аналоговом значении состояние определенного бита?

Добрый день!
Прошу более подробно описать вашу задачу:
— что именно вы делаете;
— какого результата ожидаете;
— и что фактически получается на выходе.

Сейчас моё правило выглядит так:
defineVirtualDevice(“toXiot”, {
title: “toXiot”,
cells: {
di1: {type: “switch”, value: false},
di2: {type: “switch”, value: false},
di3: {type: “switch”, value: false},
do1: {type: “switch”, value: false},
do2: {type: “switch”, value: false},
do3: {type: “switch”, value: false},
}
});

defineRule
({
whenChanged: “hd0904/word_in”,
then: function ()
{
dev[“toXiot/di1”] = Boolean(dev[“hd0904/word_in”] & 1);
dev[“toXiot/di2”] = !Boolean(dev[“hd0904/word_in”] & 2);
dev[“toXiot/di3”] = Boolean(dev[“hd0904/word_in”] & 4);
}
});

defineRule
({
whenChanged: [“toXiot/do1”,“toXiot/do2”],
then: function ()
{
dev[“hd0904/word_out”] = dev[“toXiot/do1”]*1 + dev[“toXiot/do2”]*2;
}
});
в последнем блоке, чтобы bool переменные упаковать в 16бит слово, я просто перебором каждого bool высчитывают 16бит слово. И понимаю, что это можно гораздо красивее написать, если по изменению значений в bool переменной например di2, я буду просто менять значения бит1 в переменной hd0904/word_out, и так для всех остальных бит этой переменной. Мне просто знаний в JS немного не хватает)

Добрый день!
Можно попробовать реализовать через массив с указанием всех нужных битов — это упростит обработку и добавление новых каналов.
Также рекомендую обратиться к нашему роботу-помощнику для генерации правил — он хорошо справляется с подобными задачами, меня пока ни разу не подводил.

Можете пример показать с массивом и ссылку на робота-помощника.

Добрый день!
Наш робот доступен справа вверху:

изображение

Нужные примеры правил размещены по этой ссылке.

Если что-то будет непонятно — обязательно спрашивайте, с удовольствием помогу!

Никакой разницы с другими языками.
Пример подъема первого бита

var foo = 5; // 0101
var bar = 2; // 0010
result = foo | bar; // 0111

Опускаю первый бит:

var foo = 7; // 0111
var bar = 2; // 0010
log.info ( foo ^ bar); // 0101

здесь вы берёте два аналоговых значения и выполняете с ними побитовые операции, а мне нужно так взять бит3 в аналоговом значении и поставить ему либо false либо true. В Сodesys на языке ST есть такая конструкция analog.3 = true; - означает, что 4-у биту в переменной analog мы ставим true. так пробовал записать в правилах, то не выполняется такой синтаксис.

Добрый день!
Мне потребуется немного времени, чтобы уточнить детали — посовещаюсь с коллегами и вернусь с вариантом решения.

В данном случае - просто int.
Что есть “аналоговое значение”? Какой тип?
Я, к сожалению такого типа не знаю. Как это значение представляется в памяти?

Добрый день!

Из коробки такой функции мне неизвестно - можете написать свою, например, на основе побитовых операций.

Предложенный коллегой алгоритм в целом выполняет описанную вами функцию. Допустим у вас четырёхбитное число (здесь нужно знать тип данных)

Исходное число var foo = 5; // 0101. Допустим мы хотим установить первый бит в true. Выполняем

var bar = 2; // 0010
result = foo | bar; // 0111

Допустим теперь мы хотим установить второй бит в 0, исходное число также var foo = 5; // 0101, тогда

var bar = 11; // 1011
result = foo & bar; // 0001

Тут, мне кажется, надо использовать логическое умножение, а не предложенное коллегой исключающее или. Исключающее или будет работать, как переключатель, а не как присвоение биту значения false.

На всякий случай ещё уточню, что биты считаются справа налево, начиная с нулевого

Подскажите, правильно ли я поняла ваш вопрос? Помог ли мой ответ?

тип integer 16бит.

да ноом этапе получилась у меня получилась вот такая функция
function ChangeBitInWord(word,state,bit)
//Функция изменения определённого бита в регистре
{
if (state) word |= 1 << bit; //ставим бит в значение 1
else word &= ~(1 << bit); //ставим бит в значение 0
return word; //возвращаем значение функции
}
она работает, но хочется чтобы код имел вот такой вид, как в Codesys 3.5 на языке ST: word.2 = true(или false) ; т.е. в 16бит переменой word 2-й бит присваиваем значение true(или false); Так код выглядит очень просто и лаконично. Возможен ли такой синтаксис в правилах WB?

В JS нет типа “integer”. Только “bigint”: Восемь типов данных, typeof

Только если реализуете свой метод, модулем например.