PDA

Просмотр полной версии : ПЛК73. REAL_TO_STRING - крякозябры.



petera
06.10.2011, 17:42
Получил ПЛК73, начал разрабатывать программу управления и параллельно изучать CoDeSys. Столкнулся с проблемой:
Функция REAL_TO_STRING работает только в эмуляции. При загрузке в контроллер она не работает, возникают крякозябры даже без вывода на ЖКИ.
Приходится выделять целую и дробную часть преобразовывать их через INT_TO_STRING и склеивать, что не есть гуд.
Простой пример прилагаю.
Кто знает помогите пожалуйста!
Это только для ПЛК73 или для всех ОВЕНОВ?
48264827

Александр Приходько
07.10.2011, 13:43
Да, такой Эффект есть, поэтому из библиотеки Work_mode берем функцию Show_real.

Александр Приходько
07.10.2011, 14:52
Пример во вложении:

petera
07.10.2011, 15:48
Спасибо за ответ.
Как я понял, это проблема и в ПЛК63 и ПЛК73?
А как для других ПЛК (110, 160). Естественно не вывод на ЖКИ, а работа самой функции REAL_TO_STRING?
Show_real это при работе ЖКИ в режиме work_mode,
а если нужно выводить число в формате REAL в монопольном режиме придется делать примерно так?

FUNCTION R_TO_ST : STRING
VAR_INPUT
varReal: REAL;
END_VAR
VAR
END_VAR

R_TO_ST:=INT_TO_STRING(TRUNC(varReal*10)/10);
R_TO_ST:=CONCAT(R_TO_ST, '.');
R_TO_ST:=CONCAT(R_TO_ST,INT_TO_STRING(TRUNC(varRea l*10)MOD 10));

Здесь один знак после запятой и нет округления с учетом отброшенных знаков, но код простой и маленький.
Подсмотрел у Oscat функцию REAL_TO_STRF:

FUNCTION REAL_TO_STRF : STRING(20)
VAR_INPUT
IN : REAL;
N : INT;
END_VAR
VAR
O: REAL;
i: INT;
END_VAR

(* LIMIT N to 0 .. 7 *)
N := LIMIT(0,N,7);
(* round the input to N digits and convert to string *)
O := ABS(in) * EXP(N* 2.30258509299405);
REAL_TO_STRF := DINT_TO_STRING(REAL_TO_DINT(O));
(* add zeroes in front to make sure sting is at least 8 digits long *)
FOR i := LEN(REAL_TO_STRF) TO N DO REAL_TO_STRF := CONCAT('0', REAL_TO_STRF); END_FOR;
(* add a dot if n > 0 *)
IF n > 0 THEN REAL_TO_STRF := INSERT(REAL_TO_STRF, '.', LEN(REAL_TO_STRF) - N); END_IF;
(* add a minus sign if in is negative *)
IF in < 0 THEN REAL_TO_STRF := CONCAT('-', REAL_TO_STRF); END_IF;

Здесь и большой диапазон представления, и выбор кол. знаков после запятой и работает округление для отброшенных знаков.

masich
07.05.2015, 08:46
Попробовал на плк 73 простой и маленький код - работает, большое спасибо!!!;)

dr_alf
16.05.2017, 16:23
Пример во вложении:
Не получается скачать вложение, открывается черный квадрат Малевича и маленькая белая точка посредине.
И так происходит с многими вложениями на вашем форуме, которые я пытаюсь скачать.
Как это победить?

Spawn
08.02.2018, 12:31
Show_real это при работе ЖКИ в режиме work_mode,
а если нужно выводить число в формате REAL в монопольном режиме придется делать примерно так?
FUNCTION R_TO_ST : STRING
VAR_INPUT
varReal: REAL;
END_VAR
VAR
END_VAR
R_TO_ST:=INT_TO_STRING(TRUNC(varReal*10)/10);
R_TO_ST:=CONCAT(R_TO_ST, '.');
R_TO_ST:=CONCAT(R_TO_ST,INT_TO_STRING(TRUNC(varRea l*10)MOD 10));
Здесь один знак после запятой и нет округления с учетом отброшенных знаков, но код простой и маленький.
Если значение varReal будет отрицательным (например -2.154716), то значение переменной функции будет равно '-2.-1'.
Правильнее, на мой взгляд, будет так:

FUNCTION R_TO_ST : STRING
VAR_INPUT
varReal: REAL;
END_VAR
VAR
END_VAR

R_TO_ST:=INT_TO_STRING(TRUNC(varReal));
R_TO_ST:=CONCAT(R_TO_ST, '.');
R_TO_ST:=CONCAT(R_TO_ST,INT_TO_STRING(TRUNC(varRea l*10*SEL(varReal < 0, 1, -1))MOD 10));

petera
08.02.2018, 13:29
Тогда уж так

R_TO_ST:=INT_TO_STRING(TRUNC(varReal*10)/10);
R_TO_ST:=CONCAT(R_TO_ST, '.');
R_TO_ST:=CONCAT(R_TO_ST,INT_TO_STRING(TRUNC(ABS(va rReal*10))MOD 10));

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

Spawn
09.02.2018, 00:03
Никак не пойму великий смысл этого действа:


R_TO_ST:=INT_TO_STRING(TRUNC(varReal*10)/10);
Может тогда уж так:


R_TO_ST:=INT_TO_STRING(TRUNC(varReal));
R_TO_ST:=CONCAT(R_TO_ST, '.');
R_TO_ST:=CONCAT(R_TO_ST,INT_TO_STRING(TRUNC(ABS(va rReal*10))MOD 10));