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;
Ну, и чтобы добить тему....
"Читал пейджер, много думал"... (с) Новый русский.
Про элементарные типы читал. А вот что делает 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, несмотря на самый разный смысл и диапазон принимаемых значений?
Тэк-с, попробуем вопрос покороче.
Вот скриншот из описания КДС v.2.3 на русском языке, пример доступа к битам:
Вложение 8358
Вот я его миленько скопипастил в программу - и ба! КДС ругаицца! Не понимает он моей символьной константы:
Вложение 8359
Или это я чой-то не понимаю? На всякий случай приаттачиваю как всегда исчерпывающее пояснение ошибки из того же описания:
Вложение 8360
А мне нужно... Я в ГЛОБАЛ наваял уже много таких констант... Что ж подправить? Подскажите, плз!
Вот не первый раз говорю что Вы дотошный, но вот опять что то не доконца прочитали. Трудно понять откуда Вы заскринили первую картинку, но если открыть справку самой среды разработки и добраться до раздела "доступ к битам в переменных", там красным выделено что необходимо для подобных присвоений :)
День добрый! В PLC Configuration для ПЛК63-М адресное пространство modbus для 4-байтных пользовательских переменный указано 82..286, соответственно добавляя переменные FloatP и сдвигая адрес на 4 получаем 282 как последний возможный адрес, т.е. 282+4=285. Двухбайтные конфигурационные переменные начинаются с адреса 288, т.е. 286+2=288 и 286-ой адрес никак не может разместить переменную FloatP. Кстати, Лектус тоже показывает ошибку адресации, если сдвигать на 2 байта для FloatP, что вроде как логично. Не могли-бы прояснить ситуацию? Заранее благодарен.
Из вполне себе официального описания КДСВложение 8361
Ищем 10 различий
Вложение 8363
Вложение 8362
Да, та опция "Замена констант" помогла. Спасибо!
1.Адреса в регистрах а не в байтах. Курим...
2.ПЛК 63/73 не поддерживает групповых запросов за исключением парных регистров в 82..286, системной области и копии системной области (в РЭ), отсюда - сдвиг на 2 байта приведет к обращению к кускам разных флоатов, а значит вернет что-то типа "иллегал адрес"
Правильно-ли я вас понимаю?
В руководстве по прогрпммированию написано "Доступ возможен только к одному регистру (при работе с двухбайтными параметрами) или к двум регистрам (при работе с 4-х байтными параметрами)". Т.е. размер регистра = 2 байта.
Отсюда, если адрес первой переменной FloatP 82 и этот адрес ссылается на два регистра (4 байта), то следующая переменная FloatP по идее должна иметь адрес 82+4=86 и т.д. Тогда непонятно почему последний адрес 286, если он способен адресовать только двухбайтный остаток (один регистр), в который FloatP уже не влезет, т.к. область двухбайтных переменных начинается с адреса 288?
А если адрес первой переменной IntP 332, то следующая переменная IntP должна иметь адрес 332+2=334, так?
Заранее благодарен.
Ну Вам же сказали, что адресация в регистрах, а не в байтах!
следующая переменная FloatP 82+2(регистра)=84Цитата:
следующая переменная FloatP по идее должна иметь адрес 82+4=86
следующая переменная IntP - 332+1(регистр)=333Цитата:
если адрес первой переменной IntP 332, то следующая переменная IntP должна иметь адрес 332+2=334
Здравствуйте, я студент 3 курса. В данное время пишу доклад на тему CoDeSys SP PLCWinNT V2.4. У меня возникли сложности по поиску информации, не затруднит ли вас ответит на некоторые вопросы?
А именно:
1) В моем докладе я изучаю виртуальный контроллер PLCWinNT, его функции и работу. Возможно ли работать с исполнительными механизмами такие как МЭО или измерительными приборами как термопара и прочее, использовав лишь PLCWinNT? То есть "превратить" наш пк в плк. При этом используя мощные пк, с операционкой win xp или win 7. Если возможно то, что для этого необходимо?
2)Система исполнения - CoDeSys SP RTE я так понимаю это отдельный софт, который непосредственно и превращает пк в плк. Когда я нажимаю Start system ничего не происходит. Что должно вообще произойти? И как вообще запустить эту программу на win 7?
4) Для чего может использоваться PLCWinNT на производстве?
3) Как вы думайте стоит ли развивать эту тему в дипломной работе, например по программированию плк фирмы "ОВЕН"?
Кодесис это не ОВЕН, хотя ОВЕН это Кодесис.
Ваши вопросы о CoDeSys SP RTE и PLCWinNT нужно задавать на официальном форуме CODESYS http://forum-ru.codesys.com/index.php
Позволю не согласиться, уважаемый коллега!
1) На том форуме не так просто зарегиться - нужно корпоративный адрес. Ну, или писать админам и уговаривать.
2) Тот форум чистадохлый :) Очень мало там тусуется специалистов. Поэтому, имхо, на здешнем форуме молодой человек получит ответы быстрее. Тем более, что они не Бог весть какого высокого уровня (хотя я лично не могу ответить - ну, дык, "не шмогла, сынок, не шмогла"...)
Желаю всяческих успехов коллеге FedorN. Побольше бы нам таких студентов!
http://forum-ru.codesys.com/viewtopic.php?t=895
http://www.forum-ru.3s-software.com/...&t=1843&p=3454
4. PLC WinNT на производстве вряд ли используется.
3. Развивать эту тему для диплома совершенно нет смысла, ИМХО. Ну по крайней мере на контроллерах ОВЕН.
Как вариант, если Вам будет интересно - для задач с не жесткими требованиями к реакции системы.
Например взять простейший PC малобюджетный. И сделать на нем контроллер, и, к примеру скомуницировать с какими-либо промышленными устройствами. Например по Ethernet (ModBus TCP).
Но перед этим стоит уточнить в компании Пролог стоимость лицензии WinNT. Экономическая часть в дипломе мало читабельна, но нужна...
на производстве не может использоваться винНТ так как срок его работы два часа. Он необходим для отладки кода не привязанного к физическим устройствам на прямую. Коммуникации отлаживать тоже не советую, если в дальнейшем они будут ставится на плк овен. На нем можно отрабатывать только общие вопросы
А так спасибо что развесилили
Эти «ПЛК» (PLCWinNT и SP RTE) могут работать с последовательным портом. Вооружившись преобразователем интерфейса RS232-RS485 и какой-нибудь коммуникационной библой под кодесис (для того же модбаса, например), вы как раз и получаете полноценный контроллер. У него, конечно, нет своих входов и выходов, но это всё решается модулями ввода-вывода.Цитата:
Возможно ли работать с исполнительными механизмами такие как МЭО или измерительными приборами как термопара и прочее, использовав лишь PLCWinNT? То есть "превратить" наш пк в плк. При этом используя мощные пк, с операционкой win xp или win 7. Если возможно то, что для этого необходимо?
С кодесисом идёт два софтовых ПЛК — SP RTE и PLCWinNT. Первый работает на уровне ядра в реальном времени. Второй запускается на уровне пользователя. Начать рекомендую со второго — его нужно просто запустить из «Пуска» и подключиться к нему на локалхосте. Со вторым работать не доводилось; сейчас попробовал установить, но там, судя по всему, XP надо, которой у меня нет давно.Цитата:
2)Система исполнения - CoDeSys SP RTE я так понимаю это отдельный софт, который непосредственно и превращает пк в плк. Когда я нажимаю Start system ничего не происходит. Что должно вообще произойти? И как вообще запустить эту программу на win 7?
Конкретно PLCWinNT только для отладки чего-нибудь с ком-портом. А вообще софтовые ПЛК с реальным временем вполне можно юзать на не слишком ответственных объектах.Цитата:
4) Для чего может использоваться PLCWinNT на производстве?
Вы не назвали свою специальность и не определились с объектом автоматизации. Если ограничитесь гаражными воротами и светильником, то это максимум небольшая курсовая работа. Так что придумайте объект пожирнее и вперёд... Ну, там, уличное освещение целого микрорайона, например... с учётом особенностей рельефа местности и контролем исправности осветительных элементов посредством... и т.д. =)Цитата:
3) Как вы думайте стоит ли развивать эту тему в дипломной работе, например по программированию плк фирмы "ОВЕН"?
Два часа это у демо-версии. Коммуникации нормально отлаживаются (не тестируются, а именно отлаживаются).Цитата:
на производстве не может использоваться винНТ так как срок его работы два часа. Он необходим для отладки кода не привязанного к физическим устройствам на прямую. Коммуникации отлаживать тоже не советую, если в дальнейшем они будут ставится на плк овен. На нем можно отрабатывать только общие вопросы
Егор, так как поднимается сокет в плк овен, нет ни у кого и разработчики КДС о такой особенности не в курсе и не учитывали. Насчет демо, а бедному студенту для отчетности требуется покупать лицензию или так и будет все показывать на демке
С замечанием про сокеты согласен, но ком-порт нормально работает вроде.
Двух часов демо-версии студенту за глаза хоть для работы над дипломом, хоть для его защиты. Я тут недавно одному заказчику прогу под ПЛК писал. Ну, как всегда многочасовые циклы, требование корректно восстановливаться при сбое питания и т.п. Короче, для удобства ввёл свои часы, которые можно в сто раз ускорить, и вместо TIME() везде писал свою PTIME(), а из Standard.lib пару нужных блоков переписал с нуля чтобы они тоже PTIME() вызывали. Красота же: задрал ползунок на 50x во время отладки — и прогнал суточный процесс за считанные минуты. Не надо константы дёргать, условия в тру форсировать и прочей фигнёй страдать. Попутно ещё идеальная постановка на паузу получилась (обычный TIME() ведь не остановишь). Я это к чему... Два часа для отладки «на столе» это уйма времени.
другой безперспективничек, не Вы ли высчитывали что время цикла 63мс, ну и кому такой цикл нужен не великоваты ли будут антидребезговые функции к примеру, опрос тот же по последовательному порту, модуль уснет пока ему запросы будут доставлятся
"стоит ли развивать эту тему в дипломной работе"
Перспективы нет, там докладывать отсилы минут пять
Спасибо всем с ответами, очень помогли. Я не правильно выразился на счет дипломной работы, просто я буквально недавно стал программировать на CoDeSys простенькие программы типа: светофор , открывание кодовых дверей, управление мэо ...в общем сама суть программирования понравилась...и мысля возникла, связать кодесис с дипломным проектом. Сейчас постигаю эту программу и хотелось, так сказать, узнать мнение людей которые работают с этим... А специальность моя, автоматизация производственных процессов и электротехники.
Есть ли где-то в библиотеках генератор случайных чисел? что-то не нашел...
Еще один ф.блок не из OSCAT-овской библиотеки, но тоже бесплатной -"HBMutilities"
Цитата:
FUNCTION_BLOCK rand (* Generation of Pseudo Random Numbers *)
VAR_INPUT
initvalue: DWORD; (* Initialization value *)
END_VAR
VAR_OUTPUT
SRND: DWORD; (* procedure works like rnd, but it is *)
END_VAR (* improved [no util.lib, better input/ *)
VAR (* output definition ... *)
a1: BOOL;
a2: BOOL;
a5: BOOL;
a18: BOOL;
a0: BOOL;
Q: DWORD;
END_VAR
F Q=0 THEN
IF initvalue<>0 THEN
Q:=initvalue;
ELSE
Q:=123456;
END_IF;
END_IF;
a1:=Q.2;
a2:=Q.3;
a5:=Q.6;
a18:=Q.18;
a0:=(((a1 XOR a2) XOR a5) XOR a18);
Q:=2*Q;
Q.0:=a0;
SRND:=Q;
А если значение полученное с помощью rand пропустить через эту функцию
То получится случайное число от -1 до +1Цитата:
FUNCTION DW2REAL : REAL (* Conversion from DWORD into REAL. *)
VAR_INPUT (* useful for the FB "rnd". pseudo *)
DW: DWORD; (* random numbers can be transformed*)
END_VAR (* to range [-1,...,+1] *)
VAR
END_VAR
DW2REAL:=2*((DWORD_TO_REAL(DW)/4294967296)-0.5); (* That's it !*)
Эта функция из той же библиотеки "HBMutilities"
День добрый! В PLC Configuration для ПЛК63-М в адресном пространстве modbus создал 103 (0..102) пользовательские переменные типа FloatP с адресами 82..286 (с шагом 2). Теперь пытаюсь создать пользовательские переменные типа IntP соответственно c адресами 332..511, но рабочими из них оказываются только 14 (0..13) с последним адресом 346, поскольку далее, например, такой код программы Х := ADR(%QW3.14.0) выдает ошибку несуществующего адреса, тогда как Х := ADR(%QW3.13.0) не выдает. Не могли-бы прояснить в чем проблема? Заранее благодарен.
Подскажите пожалуйста, как для ПЛК63 в CodeSys выходы REAL превратить в BOOL, ведь насколько я понимаю, то для модификаций с релейными выходами или ключами они таковыми и должны быть ?
таргет файл общий на L и M модификацию, без указания типов выбираемых выходов.
Однако, BOOL_TO_REAL в проект, но не проще было тип выхода менять ? :(
И может кто знает, как макрос сохранить в виде библиотеки ? а то пока научился только создавать свои библиотеки только из самого проекта. (переделал ППЗУ и двоичный шифратор от товарища rovki)
для CodeSys, и заодно вопрос, есть возможность задавать параметры внутри библиотеки, или обязательно должны быть вынесены параметры в виде входов ?
для CodeSys, и заодно вопрос, есть
возможность задавать параметры
внутри библиотеки, или
обязательно должны быть
вынесены параметры в виде
входов ?
вы с документацией ознакамливались. Зачем библиотека если макрос это обычное ПОУ блок или функция в зависимости нужно сохранять внутренние переменные
Подскажите как присвоить значения многомерному массиву
например:
mass: ARRAY [0..1] OF ARRAY[0..3] OF INT:=1,2,3,4,5,6,7,8;
значения присваиваются только первому "ряду", то есть mass [1][0] :=0;
capzap я пока не понял, как макросы эти сохранять, в любом виде, хоть макросом, хоть библиотекой.
Тут больше наверное проблемы не знания обращений непосредственно с программой. Так же не получилось копировать из окна одной программы в окно другой. Может я делаю что-то не так, но ни комбинации клавиш не срабатывают, ни кнопки на панели команд