http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
10.14 Элементарные типы данных
http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
10.14 Элементарные типы данных
WORD_TO_INT не делает ничего кроме копирования нулей и единичек на новое место. Т.к. в документации к прибору сказано, что он отдаёт знаковое 16-битное, а в конфигурации ПЛК может быть только беззнаковое 16-битное, то WORD_TO_INT это то, что вам нужно. Чтобы понять суть, погуглите где-нибудь про двоичное представление знаковых и беззнаковых целочисленных типов. Это школьный уровень.Требую объяснений про WORD_TO_INT
Есть замечательная библиотека 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
Ну, и чтобы добить тему....
"Читал пейджер, много думал"... (с) Новый русский.
Про элементарные типы читал. А вот что делает WORD_TO_INT - не нашел.
Да, а чем отличаются WORD и UINT ?
Кажись разобрался. При появлении 1 в старшем разряде беззнакового целого, и интерпретировании его как знакового, просто меняется знак и уполовинивается диапазон. Там даже ничего никуда сдвигать не надо...
О! Спасибо, буду иметь в виду! Про OSCAT я и забыл...
Здравствуйте. Есть небольшой вопрос. На форуме где-то писали, что можно обращаться к отдельным битам в словах через точку. Пробую:
var
i:int;
f:word;
end_var
f.i:=true;
Компилятор выдает ошибку
Error 4027: Integer number or symbolic constant expected
Если пишу
f.0:=true;
то все нормально, ошибок нет.
Что я упустил?
С уважением, Михаил.
Просто увидел в посте #1253 этой ветки и захотел попробовать.
Если же хочется по индексу к биту, то 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, как вы догадались)?
В общем-то, я пробовал от переменной пользовательского типа отнять что-то, чтобы получилось за пределами - и ничего:
Переменная diY спокойно и уверенно принимает значение -2, ка и ожидалось.Код:TYPE q : (ww,ee,rr,tt,yy); END_TYPE VAR diY: DINT; Enu: q; END_VAR Enu := ww; diY := Enu - 2;
Но вот то, что Enu есть 16-разрядная переменная в моем царстве 32-х бит... Как-то смущает.
Камешек В. К переменным DINT неприменимы побитовые операции. Но битовая адресация с константным номером бита - работает. То есть, как я понимаю, diY.2 - вполне заменяет diY AND 4. Библиотечные putbit/extract работают одинаково хоть на DWORD, хоть на DINT.
Так что вроде бы и здесь DINT не проигрывает...
Ну, надо же и вопрос спросить Что я не учитываю? Какие действительно могут вылезти неприятности, если большая группа моих переменных (основные параметры программы, доступные оператору) будет DINT, несмотря на самый разный смысл и диапазон принимаемых значений?