Стартовая страница › Форумы › Понять, как работает ПО › Mqtt. Как превратить OFF и ON в числа?
- В этой теме 22 ответа, 4 участника, последнее обновление 1 год, 9 месяцев назад сделано
Mikhail.
-
АвторЗаписи
-
22.10.2024 в 14:49 #35181
phenix769УчастникДобрый день. Прошу вас поделится примером написания скрипта для Mqtt. Нужно данные 2@1729596485400, превратить в число (3). И не помешал бы пример как превратить OFF и ON превратить в число?
-
Тема изменена 1 год, 9 месяцев назад пользователем
phenix769.
22.10.2024 в 16:53 #35192
manjey73Участник2@1729596485400 — интересно, а где тут число 3?
22.10.2024 в 17:01 #35193
manjey73УчастникЕсли OFF и ON приходят как строки, то в канал они преобразуются в массив байт как число double
То по идее надо формулой брать GetByte и превращать в строку ASCII например, а потом проверять ее если там OFF то возвращать 0, если ON то 1.// Converts the specified value to an ASCII string up to 8 characters long. // Преобразует заданное значение в строку ASCII длиной до 8 символов. public string DecodeAscii(double val) { byte[] buf = BitConverter.GetBytes(val); return Encoding.ASCII.GetString(buf).TrimEnd((char)0); }За основу взять данную формулу. Только возdращать double после определения и проверки полученной строки.
типаpublic double GetOnOff(double val) { byte[] buf = BitConverter.GetBytes(val); string OnOff = Encoding.ASCII.GetString(buf).TrimEnd((char)0); if (OnOff == "ON") return 1; else if (OnOff == "OFF") return 0; else return double.NaN; }-
Ответ изменён 1 год, 9 месяцев назад пользователем
manjey73.
23.10.2024 в 11:55 #35202
MikhailМодераторДобрый день!
Сделайте скриншоты полученных данных в Коммуникаторе.23.10.2024 в 18:22 #35205
phenix769УчастникЭто скрипт на ON и OFF. Создаём одно значения в таблице item1(Смотрите видео: Rapid SCADA 6. Урок 14. Настройка MQTT-клиента)
let data1 = payload;
log(«Значения пришли >» + payload);
if (‘ON’ == data1) {
let data = 1;
log(«Истина >» + data );
setValue(0, 1);
} else {
let data = 0;
log(«Лож >» + data );
setValue(0, 0);
}23.10.2024 в 18:28 #35206
phenix769УчастникМне проще сравнить значения и присвоить свои данные на выход. Завтра буду с этим 2@1729596485400. Нужно хвост отпилить и оставить значения >2 . Завтра и в биты перевод попробую .
-
Ответ изменён 1 год, 9 месяцев назад пользователем
phenix769.
23.10.2024 в 18:36 #35208
phenix769УчастникУщё раз, кавычки исправил .
let data1 = payload;
log(‘Значения пришли >’ + payload);
if (‘ON’ == data1) {
let data = 1;
log(‘Истина >’ + data );
setValue(0, 1);
} else {
let data = 0;
log(‘Лож >’ + data );
setValue(0, 0);
}24.10.2024 в 09:45 #35213
phenix769УчастникЗадача передать первое значения до @. из 2@1729596485400.(в данном случае это 2)
Это рабочий вариант.let data1 = payload[0];
log(‘Значения пришли >’ + payload);if (‘1’ == data1)
{
let data = 1;
log(‘Истина >’ + data );
setValue(0, 1);
} elseif (‘2’ == data1)
{
let data = 2;
log(‘Истина >’ + data );
setValue(0, 2);
} elseif (‘3’ == data1)
{
let data = 3;
log(‘Истина >’ + data );
setValue(0, 3);
}else {
let data = 0;
log(‘Лож >’ + data );
setValue(0, 0);
}24.10.2024 в 10:34 #35214
phenix769УчастникТолько запятые меняем на двойные.
-
Ответ изменён 1 год, 9 месяцев назад пользователем
phenix769.
24.10.2024 в 10:45 #35216
manjey73УчастникТо есть это скриптами JS в MQTT, а не формулами в Scada так понимаю.
Хотя и формулами можно было раскатать всю строку, если ее в массив пихнуть.24.10.2024 в 11:04 #35217
a80808УчастникЛожь с мягким знаком пишется.
24.10.2024 в 13:03 #35226
MikhailМодераторДля отладки JavaScript можно либо выводить промежуточные результаты в журнал, либо найти какой-нибудь онлайн инструмент, который позволит пройти по скрипту по шагам.
24.10.2024 в 13:47 #35234
a80808УчастникТретий вариант — прокси-прога, которая читает из MQTT, парсит данные и отправляет в СКАДу уже нормальные данные.
«Чушь, конечно, но зато честно!» )))25.10.2024 в 21:07 #35250
phenix769Участникlet data = payload;
if (‘@’ == payload[1])
{ data = payload[0] ;
log(‘Значения пришли >’ + data ) ; }if (‘@’ == payload[2])
{ data = payload[0] + payload[1] ;
log(‘Значения пришли >’ + data ) ; }if (‘@’ == payload[3])
{ data = payload[0] + payload[1] + payload[2] ;
log(‘Значения пришли >’ + data ) ; }if (‘@’ == payload[4])
{ data = payload[0] + payload[1] + payload[2] + payload[3] ;
log(‘Значения пришли >’ + data ) ; }if (‘@’ == payload[5])
{ data = payload[0] + payload[1] + payload[2] + payload[3] + payload[4] ;
log(‘Значения пришли >’ + data ) ; }log(‘Значения преобразованы до пяти знаков до @>’ + data );
// Преобразование с 1@424242209, 12@424242209, 123@424242209, 1234@424242209,
// 12345@424242209 в 1, 12, 123, 1234, 112345.
// Третий вариант — не рабочий !.25.10.2024 в 21:26 #35251
phenix769Участникlet data = payload;
log(‘Значения пришли >’ + data );let data1 = 0;
let a = 0;
let i = 15; // ИЗМЕНИТЬ i = (8-бит(заменить на 7), 16-бит(заменить на 15)
while (i > 0 )
{
a = 0;
if (data — Math.pow(2, i) >= 0 )
{
data = data — Math.pow(2, i) ;
a = 1;
data1 = data1 + Math.pow(10, i) ;
}
log(‘setValue(item,бит >’+ i +’ значения >’+ a + ‘ )’);
setValue(i, a); // формирование от 15-бита до 1-бита и запись в канал.
i = i — 1;
}
a = 0;
if (data — 1 >= 0 )
{
data = data — 1 ;
a = 1;
data1 = data1 + 1;
}
log(‘setValue(item,бит >’+ i +’ значения >’+ a + ‘ )’);
setValue(i, a); // формирование 0-бита и запись в канал.
log(‘Значения преобразованы в бит >’ + data1 );// Раскладываем число на биты на нужное количество.
// Создаём дополнительно item по количеству нужных вам бит.
// В журнале смотрим изменения .-
Ответ изменён 1 год, 9 месяцев назад пользователем
phenix769.
-
Тема изменена 1 год, 9 месяцев назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.