Здравствуйте, вопрос по рецептам в СП3хх. В рецепте имеются значения которые должны передаваться в ПРку с типом "DWORD". Нужно ли в рецепте выделять по 2 регистра на значение? И воспринимает ли ПРка "DWORD"? Пробовал через копирование регистров из PSW в 4x, однако вылезают пятизначные числа. С отдельным регистром все работает, а вот с последовательностью получается подобная ахинея. Подскажите пожалуйста как это можно реализовать. Панель - мастер, ПР - слейв, это вроде важно.
Снимок.PNG
Доброго дня.
Извиняюсь, если подобное уже спрашивали ранее.
Мне надо реализовать возможность "дельты" для параметра (сумма или разность с текущим измеренным значением) в макросе.
Измеренное значение отображается в дисплее с типом DWord и форматом Float.
, где:Код:float tmp_val = 0; int delta = 0; DWORD temp_value; tmp_val = (delta >= 0) ? (DWord_2_Float(temp_value) + delta) : (DWord_2_Float(temp_value) - (delta * -1)); *(float*)(PSW+300) = tmp_val;
delta - переменная типа int, которая хранит собственно дельту;
tmp_val - переменная типа float, которая хранит промежуточное значение для вычислений;
temp_value - переменная типа DWord, которая хранит считанный с преобразователя параметр;
С положительной дельтой всё в порядке, а если дельта отрицательная - происходит переполнение что ли: на дисплее отображается 6.86+??. Типа того.
Проверял код в эмуляторе Си - всё впорядке:
Код:#include <stdio.h> int main (void) { float float_var = 10.1; int delta = -3; float temp = delta >= 0 ? float_var + delta : float_var - (delta * -1); printf("temp: %f\n", temp); return 0; }
Последний раз редактировалось stdenits; 02.11.2022 в 12:02.
stdenits , для отображения переменной типа INT, в дисплее надо поставить формат DEC.
INT это 1 регистр, поэтому WORD а не DWORD.
Не совсем понятно, как разница переменных флоат, у вас получила тип INT ?
Последний раз редактировалось kondor3000; 02.11.2022 в 11:41.
Возможно я не так выразился или вы меня не поняли.
Всё вычисляется и отображается как надо, если delta положительная (допустим, 0, 10 или 30).Код:// в промежуточную переменную типа Float (tmp_val) заносим сумму или разность считанного значения типа DWord (temp_value) и дельты delta типа Int (в зависимости от знака дельты) // Здесь же преобразуем DWord (temp_value) в Float tmp_val = (delta >= 0) ? (DWord_2_Float(temp_value) + delta) : (DWord_2_Float(temp_value) - (delta * -1)); // заносим значение промежуточной переменной tmp_val в регистр, например, PSW300 (и 301) - который и отображается в дисплее с типом DWord и форматом Float *(float*)(PSW+300) = tmp_val;
Если delta отрицательная (например, -3) и надо вычислить разность - выводится фигня, типа 6.86+??.
Последний раз редактировалось stdenits; 02.11.2022 в 12:22.
Дельта вносится пользователем через элемент Ввод данных с типом Word и форматом Dec.
Применили Int потому что для дельты, в нашем случае, достаточно только целых чисел.
А в чём заключается проблема для компилятора?
1) преобразовали DWord в Float;
2) если дельта отрицательная - умножаем дельту на -1, чтобы избавиться от знака - у дельты;
3) вычитаем из п.1 дельту.
Пробный код из Си компилятора.
Если я ошибаюсь - поправьте, пожалуйста.