1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Преобразование данных.

Unity Pro (Control Expert), Quantum, Premium, M340, M580, Hybrid DCS, Process Expert, Zelio, Twido, M17*, M2**, SCADAPACK, SoMachine, MachineExpert, ZelioSoft, TwidoSoft, TwidoSuite, TelePace

Модератор: Специалисты SE

Ответить

Автор темы
OOOleg
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 07 фев 2019, 15:24
Имя: Олег
Страна: Молдова

Преобразование данных.

Сообщение OOOleg »

Добрый день.
Пытаюсь преобразовать 2 последовательных 16 bit регистра полученных от прибора по modbus rtu в 32bit float число.
Для этого используется скрипт, но проблема что не все данные преобразовываются правильно, может сталкивался кто-то?

//determinare semn
IF Word1.15 THEN sign := 1; ELSE sign := 0; END_IF;
s1 := -1;
a := EXPT(s1, sign);

//Determinare E
E:=0; temp:=0;
IF Word1.7 THEN temp := 1; ELSE temp := 0; END_IF; E := E + (temp * 1);
IF Word1.8 THEN temp := 1; ELSE temp := 0; END_IF; E := E + (temp * 2);
IF Word1.9 THEN temp := 1; ELSE temp := 0; END_IF; E := E + (temp * 4);
IF Word1.10 THEN temp := 1; ELSE temp := 0; END_IF; E := E + (temp * 8);
IF Word1.11 THEN temp := 1; ELSE temp := 0; END_IF; E := E + (temp * 16);
IF Word1.12 THEN temp := 1; ELSE temp := 0; END_IF; E := E + (temp * 32);
IF Word1.13 THEN temp := 1; ELSE temp := 0; END_IF; E := E + (temp * 64);
IF Word1.14 THEN temp := 1; ELSE temp := 0; END_IF; E := E + (temp * 128);

b := EXPT(2, (E-127));

//Determinare sum
sum:=0; temp:=0;
IF Word1.6 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.500000000000000000000);
IF Word1.5 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.250000000000000000000);
IF Word1.4 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.125000000000000000000);
IF Word1.3 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.062500000000000000000);
IF Word1.2 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.031250000000000000000);
IF Word1.1 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.015625000000000000000);
IF Word1.0 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.007812500000000000000);
IF Word2.15 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.003906250000000000000);
IF Word2.15 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.001953725000000000000);
IF Word2.13 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000976562500000000000);
IF Word2.12 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000488281250000000000);
IF Word2.11 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000244140625000000000);
IF Word2.10 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000122070312500000000);
IF Word2.9 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000061035156250000000);
IF Word2.8 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000030517578125000000);
IF Word2.7 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000015258789062500000);
IF Word2.6 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000007629394531250000);
IF Word2.5 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000003814697265625000);
IF Word2.4 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000001907348632812500);
IF Word2.3 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000000953674316406250);
IF Word2.2 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000000476837158203125);
IF Word2.1 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000000238418579101562);
IF Word2.0 THEN temp := 1; ELSE temp := 0; END_IF; sum := sum + (temp * 0.000000119209289550781);

c := 1 + sum;

Real_val := a*b*c;

se_sib
освоился
освоился
Сообщения: 277
Зарегистрирован: 14 дек 2015, 12:15
Имя: Евгений
Страна: Россия
город/регион: Краснодар
Благодарил (а): 5 раз
Поблагодарили: 73 раза

Преобразование данных.

Сообщение se_sib »

Для какого ПЛК вы это делаете?
Если в SoMachine, то просто сливаете WORD в DWORD или в массив и перекладываете через указатель в REAL.
2WordReal.JPG
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ответить

Вернуться в «ПЛК»