Страница 149 из 1050 ПерваяПервая ... 4999139147148149150151159199249649 ... ПоследняяПоследняя
Показано с 1,481 по 1,490 из 10495

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #1481
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от kosmas Посмотреть сообщение
    Код:
    Тип   Нижний предел   Верхний предел   Размер памяти
    WORD      0                      65535                   16 Бит
    INT       -32768                32767                    16 Бит
    Т.е. я догадываюсь, что рамерность у WORD и INT одинаковая. То, что 0 в WORD это 0 в INT - тоже.
    Но то, что 32768 в WORD это -32768 в INT я и представить не мог...
    http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
    10.14 Элементарные типы данных

  2. #1482
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Требую объяснений про WORD_TO_INT
    WORD_TO_INT не делает ничего кроме копирования нулей и единичек на новое место. Т.к. в документации к прибору сказано, что он отдаёт знаковое 16-битное, а в конфигурации ПЛК может быть только беззнаковое 16-битное, то WORD_TO_INT это то, что вам нужно. Чтобы понять суть, погуглите где-нибудь про двоичное представление знаковых и беззнаковых целочисленных типов. Это школьный уровень.

  3. #1483
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,842

    По умолчанию

    Цитата Сообщение от kosmas Посмотреть сообщение
    Да, и как REAL округлить до двух знаков после запятой?
    Есть замечательная библиотека OSCAT и в ней функция ROUND
    Код:
     FUNCTION ROUND : REAL
    VAR_INPUT
    	in : REAL;
    	N : INT;
    END_VAR
    VAR
    	DECADES : ARRAY[0..8] OF REAL := 1.0,10.0,100.0,1000.0,10000.0,10000.0,100000.0,1000000.0,10000000.0;
    	X: REAL;
    END_VAR
    X := DECADES[LIMIT(0,N,8)];
    ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #1484
    Пользователь
    Регистрация
    13.08.2012
    Адрес
    Питер
    Сообщений
    127

    По умолчанию

    Ну, и чтобы добить тему....

    Цитата Сообщение от capzap Посмотреть сообщение
    http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
    10.14 Элементарные типы данных
    "Читал пейджер, много думал"... (с) Новый русский.

    Про элементарные типы читал. А вот что делает WORD_TO_INT - не нашел.

    Да, а чем отличаются WORD и UINT ?


    Цитата Сообщение от Yegor Посмотреть сообщение
    WORD_TO_INT не делает ничего кроме копирования нулей и единичек на новое место. Т.к. в документации к прибору сказано, что он отдаёт знаковое 16-битное, а в конфигурации ПЛК может быть только беззнаковое 16-битное, то WORD_TO_INT это то, что вам нужно. Чтобы понять суть, погуглите где-нибудь про двоичное представление знаковых и беззнаковых целочисленных типов. Это школьный уровень.
    Кажись разобрался. При появлении 1 в старшем разряде беззнакового целого, и интерпретировании его как знакового, просто меняется знак и уполовинивается диапазон. Там даже ничего никуда сдвигать не надо...

    Цитата Сообщение от petera Посмотреть сообщение
    Есть замечательная библиотека OSCAT и в ней функция ROUND
    Код:
     FUNCTION ROUND : REAL
    VAR_INPUT
    	in : REAL;
    	N : INT;
    END_VAR
    VAR
    	DECADES : ARRAY[0..8] OF REAL := 1.0,10.0,100.0,1000.0,10000.0,10000.0,100000.0,1000000.0,10000000.0;
    	X: REAL;
    END_VAR
    X := DECADES[LIMIT(0,N,8)];
    ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;
    О! Спасибо, буду иметь в виду! Про OSCAT я и забыл...

  5. #1485
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    357

    По умолчанию

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

    var
    i:int;
    f:word;
    end_var

    f.i:=true;

    Компилятор выдает ошибку
    Error 4027: Integer number or symbolic constant expected

    Если пишу

    f.0:=true;

    то все нормально, ошибок нет.

    Что я упустил?

    С уважением, Михаил.

  6. #1486
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от amn Посмотреть сообщение
    Здравствуйте. Есть небольшой вопрос. На форуме где-то писали, что можно обращаться к отдельным битам в словах через точку
    Нехило ты захотел, друг. То есть, я понимаю, вполне законное желание. Некоторые компиляторы такое допускают. Но что-то мне подсказывает, что здешний компилятор ждет исключительно константу в номере бита. Впрочем, он же об этом и пишет.
    В общем, я так никогда не делаю.

  7. #1487
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    357

    По умолчанию

    Просто увидел в посте #1253 этой ветки и захотел попробовать.

  8. #1488
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,256

    По умолчанию

    Если же хочется по индексу к биту, то util.lib putbit/extract

  9. #1489
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от amn Посмотреть сообщение
    Просто увидел в посте #1253 этой ветки и захотел попробовать.
    А документацию нет желания перечитать, там все про это написано. Если хотите биты именами объявлять, то их надо в качестве констант объявлять

  10. #1490
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Если же хочется по индексу к биту, то util.lib putbit/extract
    Развивая эту тему, хочу вот что понять:
    1) Есть ли хоть какой-то смысл в применении типа данных UDINT? Из того, что я понял, это тип. совершенно совпадающий с DWORD по представлению и диапазону значений, но, в отличие от последнего, на нем не реализуются команды битовой арифметики. Но если UDINT есть - значит он нужен? Зачем?
    Это просто чтобы понимать. Чистатеоретически

    2) Хочу уйти от DWORD к DINT. Естественно, в тех случаях, когда половины диапазона беззнакового мне вполне хватает.
    Цель - уменьшение числа разных типов. Поэтому в некотором множестве переменных я хочу вообще все целочисленные переменные тупо превратить в DINT и работать с ними очень единообразно (например. я захочу их впихнуть в массив или просто хочу в операциях с ними не думать о типах).
    Диапазона DINT мне хватает. Дробные (и рациональные) не интересуют. Способность ПЛК обрабатывать 32-разрядные числа так же быстро, как и 8-разрядные - вроде бы должно так быть, если процессор 32-разрядный. Ну, а если чуток не так быстро - смиримся. Здесь ведь речи идет о выгодах из единообразия, о прозрачности и удобстве отладки программ, о ее надежности, в конце концов.

    Какие уже увидел подводные камешки.

    Камешек А. Размер и траффик. Как только мы выползаем за пределы собственно ядра ПЛК, то размер имеет значение Например, запись в файл флеш-памяти... Ага, тут возрастает количество байтов. Далее. Передача по какому-нить внешнему порту. О! Траффик растет. Одно дело, передать несколько байт, другое - в 4 раза больше.
    Что по этой проблеме я намерен предпринять: там, где это имеет значение, использовать копии этих длиннючих переменных. Если, скажем, по смыслу переменная есть некий индекс с диапазоном до 255, то я ее передавать буду преобразовав DINT_TO_BYTE. То есть, в программе крутится вот этот единообразный 32-разрядный монстр, а если его кудысь послать надо - я уже смотрю по месту, сколько нужно байт.
    Но весь этот камушек - песчинка. Пока меня не пружит и 32-разрядные во флеш вкинуть или по модбасу пульнуть. Большее значение имеет грамотная организауия обмена, чем размер передаваемых данных...

    Камешек Б. Работа с перечислениями. Насколько я понял, ENUM-ы в КДС сохраняются в виде WORD. Можно ли как-то принудительно заставить компилятор рассматривать перечисления, как элементы указанного типа (DINT, как вы догадались)?
    В общем-то, я пробовал от переменной пользовательского типа отнять что-то, чтобы получилось за пределами - и ничего:

    Код:
    TYPE q :
    	(ww,ee,rr,tt,yy);
    END_TYPE
    
    VAR
    	diY:	DINT;
    	Enu:	q;
    END_VAR
    
    Enu := ww;
    diY := Enu - 2;
    Переменная diY спокойно и уверенно принимает значение -2, ка и ожидалось.
    Но вот то, что Enu есть 16-разрядная переменная в моем царстве 32-х бит... Как-то смущает.

    Камешек В. К переменным DINT неприменимы побитовые операции. Но битовая адресация с константным номером бита - работает. То есть, как я понимаю, diY.2 - вполне заменяет diY AND 4. Библиотечные putbit/extract работают одинаково хоть на DWORD, хоть на DINT.
    Так что вроде бы и здесь DINT не проигрывает...

    Ну, надо же и вопрос спросить Что я не учитываю? Какие действительно могут вылезти неприятности, если большая группа моих переменных (основные параметры программы, доступные оператору) будет DINT, несмотря на самый разный смысл и диапазон принимаемых значений?

Страница 149 из 1050 ПерваяПервая ... 4999139147148149150151159199249649 ... ПоследняяПоследняя

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •