Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Архив
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Кто программировал в Codesys ?

 Ответить Ответить
Автор
Сообщение
Valerik Смотреть выпадающим
Участник
Участник


Присоединился: 13 Апрель 2004
Online Status: Offline
Публикации: 58
Свойства публикации Свойства публикации   Ответить, цитируя автора - Valerik Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Кто программировал в Codesys ?
    Опубликовано: 24 Август 2005 21:49
Здравствуйте, вот такая проблема:
a:Real;
a:=4-3.9;
1. Результат = 9.99999-e002 почему не 0.1?

Результат нужно вывести на панель индикации
Поэтому Real_TO_String(a) и на панели отображается 9.99999-e002, а хотелось бы 0.1
Наверх
Voronenkov Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 15 Март 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 112
Свойства публикации Свойства публикации   Ответить, цитируя автора - Voronenkov Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 24 Август 2005 22:44

Попробуйте LREAL

 

Удачи

Vladimir Voronenkov
"Первая Миля", Authorized ICONICS Systems Integrator
Наверх
gggg Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Декабрь 2004
Online Status: Offline
Публикации: 321
Свойства публикации Свойства публикации   Ответить, цитируя автора - gggg Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 25 Август 2005 06:49

LREAL  - это то же самое действительное представление числа только длинное, оно занимает 64бита, а REAL 32,  

ну вот я только что проделал в Кодесисе эту операцию в режиме эмуляции - все показывает как надо, как Вы хотите

PROGRAM PLC_PRG
VAR
 a:REAL;
 d: REAL;
 b: REAL;
 c: LREAL;      (*длинное реальное*)
END_VAR

(*вычисления*)

a:= 4 - 3.9;                
d:=6-5;
b:=4-3.5;
c:=3.5-4.3;

в режиме Login, потом RUN, пошагово Step Over, результаты показывает в правом окошке: 

a=0.1

d=1

b=0.5

c=-0.8

а как Вы пытаетесь выводить и на какое табло (или программу)?, может у Вас просто не настроено это окно на формат Реал? 

Наверх
Voronenkov Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 15 Март 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 112
Свойства публикации Свойства публикации   Ответить, цитируя автора - Voronenkov Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 25 Август 2005 10:39

По разному бывает

 

Vladimir Voronenkov
"Первая Миля", Authorized ICONICS Systems Integrator
Наверх
gggg Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Декабрь 2004
Online Status: Offline
Публикации: 321
Свойства публикации Свойства публикации   Ответить, цитируя автора - gggg Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 25 Август 2005 11:46
ну тык Вы и поясните при каких условиях получилось то что на первой картинке, а при каких то что на второй...
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 25 Август 2005 21:42

Первоначально опубликовано Valerik

Результат = 9.99999-e002 почему не 0.1?

Это просто. Число 0.1 непредставимо в виде конечной двоичной дроби, девятки появились из-за округления (как это ни странно для нас, привыкших к десятичной системе ).

Интересно, что такой эффект наблюдается на платформах ARM и C16x, а при компиляции для 80386 это число отображается как 0.1. Видимо, арифметика там реализована более грамотно, и значения округляются в нужную сторону.


Первоначально опубликовано Valerik


Результат нужно вывести на панель индикации
Поэтому Real_TO_String(a) и на панели отображается 9.99999-e002, а хотелось бы 0.1

Попробуйте воспользоваться старым трюком:

a := REAL_TO_INT (a * 10.0) / 10.0;
sss := REAL_TO_STRING(a);

Функция REAL_TO_INT округляет вещественное число до ближайшего целого.

Инженер-системотехник
+7 (916) 477 3925
Наверх
Valerik Смотреть выпадающим
Участник
Участник


Присоединился: 13 Апрель 2004
Online Status: Offline
Публикации: 58
Свойства публикации Свойства публикации   Ответить, цитируя автора - Valerik Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 29 Август 2005 16:33
Спасибо, можно конечно действовать и так, но вот новая проблема: Real_To_String(0.1)='1.0e-1'
Наверх
gggg Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Декабрь 2004
Online Status: Offline
Публикации: 321
Свойства публикации Свойства публикации   Ответить, цитируя автора - gggg Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Август 2005 12:20

ну блин у меня тоже самое но как надо показывает =0.1

а Вы все сделали как советовал Максим Ананских ?

Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 05 Сентябрь 2005 13:42

МЭК функции преобразования в строки не имеют возможности форматирования. Желаемый вид числа можно сформировать уже в строке.

Расширенный вариант, идеи описанной Максимом:

VAR
 rA:     REAL;
 iA1,iA2:INT;
 sA:     STRING;
END_VAR

iA1 := TRUNC(rA); (*вырезаем отдельно целую часть*)
iA2 := REAL_TO_INT(rA*10)-iA1*10  ;  (*и округленные десятые*)
(*собираем результат в строку желаемого формата*)
sA := CONCAT(CONCAT (INT_TO_STRING(iA1),'.'),INT_TO_STRING(iA2));

Результат, всегда строка ‘0.1’, при значении rA равном 0.1 или 9.99999E-2;


К стати. Система исполнения CoDeSys написана на С и компилируется изготовителем PLC. Вызовы же функций REAL математики просто включены в систему исполнения. Т.е. в конечном итоге, здесь работают функции библиотек того компилятора С, которым пользовался изготовитель контроллера при адаптации CoDeSys под свое оборудование. Так если я ставлю в контроллер мат. сопроцессор то, что он выдаст, то CoDeSys и покажет. В итоге, описанные выше тонкие эффекты могут проявляться по-разному, в разных PLC под CoDeSys. Для надежного аккуратного вывода на панель нужно сформировать строку вывода, не полагаясь на REAL_TO_STRING.

Igor Petrov
Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz