PDA

Просмотр полной версии : Hardella IDE



Страницы : 1 [2] 3 4 5 6

Владимир Ситников
12.12.2016, 18:49
ну там все функции и есть уже готовый вставляешь те что в бибке (те что надо по технологии движения) задаешь параметры и поехали , + эти блоки должны работать на уровне (процесса управления PRU) + передавать свои основные параметры на уровень выше в кодезис, так например мы делаем в PRU программу бесконечное движение оси с параметром скорости, а параметр скорости берем из процесса кодезиса. Это как обычно это делают, в той же Дельте.

Мы друг друга не понимаем.
Кто будет указывать *куда именно* будут передаваться данные в PRU?

Грубо говоря, у одного ШД висит на fast out1, а у другого на fast out4.
Кто будет КДС библиотеку перенастраивать на разные выхода?

murdemon
12.12.2016, 18:54
ну это должно быть возможно делать в виде конфигуратора ШД. Что куда подключено + тут же должны добавляться и настраиваться функции PLCOpen motion, и прописываться mapping между PRU и PLC Codesys

dima64
13.12.2016, 14:03
Из работ по 1.6.0 осталась проверка и документация (чтобы по много раз одно и то же не писать в этой теме)

Документация будет на русском (родном) языке?

Александр Бакин
14.12.2016, 08:02
выкладываю свой вариант кода для управления одним ШГ. У меня подключены 4 ШГ у контроллеру - работают нормально. по 2шт одновременно.

(* 1-й верхний*)
IF (state1=STOP_STEPPER OR state1=INIT_STEPPER) AND rungen1=FALSE THEN SetPos_1presHig1:=SetPos_1presHig; oldpos2:=Pos_1presHig; END_IF
IF SetPos_1presHig1<>Pos_1presHig AND rungen1=FALSE THEN
Way1PresHig:=SetPos_1presHig1>Pos_1presHig;
IF SetPos_1presHig>Pos_1presHig AND (state1=INIT_STEPPER OR state1=STOP_STEPPER) THEN
difpos1:=SetPos_1presHig1-Pos_1presHig;
ELSIF SetPos_1presHig1<Pos_1presHig AND (state1=INIT_STEPPER OR state1=STOP_STEPPER) THEN
difpos1:=Pos_1presHig-SetPos_1presHig;
END_IF
Way1PresHigOut:=NOT Way1PresHig;
IF state1=run_stepper OR state1=ACCEL_STEPPER OR state1=DECEL_STEPPER THEN Pos_1presHig:=oldpos2+pos1*BOOL_TO_WORD(Way1Preshi g)-pos1*(BOOL_TO_WORD(NOT Way1PresHig)); END_IF
IF state1=init_STEPPER THEN
rungen2:=TRUE;
END_IF
out1:=4;
ELSE
Way1PresHigout:=FALSE;
END_IF
IF state1=stop_stepper THEN rungen1:=FALSE; rungen2:=FALSE; END_IF
Gen1Hig( ENABLE:=rungen1 OR rungen2 , MIN_SPEED:=0 , MAX_SPEED:=Speed1PresHig , QUANTITY:= difpos1 , ACCEL_RAMP:=2000 , DECEL_RAMP:=2000, OUT_NUM:=out1 , STATE=>state1 , CURRENT_SPEED=> , PULSES_GENERATED=>pos1 );

Александр Бакин
14.12.2016, 12:13
Вариант использования PRU_Stepper для управления ШГ.


IF (state1=STOP_STEPPER OR state1=INIT_STEPPER) AND rungen1=FALSE THEN SetPos_1presHig1:=SetPos_1presHig; oldpos2:=Pos_1presHig; END_IF
IF SetPos_1presHig1<>Pos_1presHig AND rungen1=FALSE THEN
Way1PresHig:=SetPos_1presHig1>Pos_1presHig;
IF SetPos_1presHig>Pos_1presHig AND (state1=INIT_STEPPER OR state1=STOP_STEPPER) THEN
difpos1:=SetPos_1presHig1-Pos_1presHig;
ELSIF SetPos_1presHig1<Pos_1presHig AND (state1=INIT_STEPPER OR state1=STOP_STEPPER) THEN
difpos1:=Pos_1presHig-SetPos_1presHig;
END_IF
Way1PresHigOut:=NOT Way1PresHig;
IF state1=run_stepper OR state1=ACCEL_STEPPER OR state1=DECEL_STEPPER THEN Pos_1presHig:=oldpos2+pos1*BOOL_TO_WORD(Way1Preshi g)-pos1*(BOOL_TO_WORD(NOT Way1PresHig)); END_IF
IF state1=init_STEPPER THEN
rungen2:=TRUE;
END_IF
out1:=4;
Speed1PresHig:=3000;
Ramp:=2000;
ELSE
Way1PresHigout:=FALSE;
do4:=TRUE;
END_IF
IF state1=stop_stepper THEN rungen1:=FALSE; rungen2:=FALSE; END_IF
IF AlarmAktivGen THEN
Speed1PresHig:=0;
Ramp:=0;
Difpos1:=0;
IF State1=run_stepper OR state1=ACCEL_STEPPER OR state1=DECEL_STEPPER THEN
Rungen1:=NOT rungen1;
Rungen2:=FALSE;
ELSE
rungen1:=FALSE;
Rungen2:=FALSE;
END_IF
END_IF

Gen1Hig( ENABLE:=rungen1 OR rungen2 , MIN_SPEED:=0 , MAX_SPEED:=Speed1PresHig , QUANTITY:= difpos1 , ACCEL_RAMP:=ramp, DECEL_RAMP:=ramp, OUT_NUM:=out1 , STATE=>state1 , CURRENT_SPEED=> , PULSES_GENERATED=>pos1 );

Владимир Ситников
19.12.2016, 16:17
Выпустил Hardella 1.6.0 (см https://hardella.com/download/) и запустил сайт: https://hardella.com/

В очередной версии:
- можно программировать оба PRU ядра, и полностью управлять 4 выходами и 2 входами
- встроен блок ШД

Если что-то не описал -- пишите в комментариях.
Если опечатки (или, например, непонятно написано), то можно выделить фрагмент на сайте и нажать ctrl+enter.


Документация будет на русском (родном) языке?

В основном да (см пример https://hardella.com/docs/pru/examples/four-blinkning-leds/ ), но я продублирую на английский.


а PRU ввиде таска к Codesys прикрутить нельзя? (по типу как функции прерывания 20mks) Или там язык совсем другой? или как этот процесс заливки PRU вообще проходит ?

PRU выполняется на другом процессоре. С точки зрения Codesys, заливка PRU программы выглядит как "запись байт по определённому адресу".
Программируется-то на языке ST, но с точки зрения КДС это выглядит как филькина грамота (т.е. как один массив байт)

Постарался тут описать: https://hardella.com/docs/pru/codesys-setup/


Ура, товарищи!

Владимир Ситников
19.12.2016, 20:19
Возвращаясь к теме: в 1.6.0 я добавил блок управления ШД, который работает с постоянной длительностью цикла.
Грубо говоря, если длительность PRU цикла 1 мкс, то импульс может быть либо 1 мкс, либо 2 мкс, либо 3 мкс, ну вы поняли?

Казалось бы 1 мкс это довольно хорошо, но нет.
Например, если нужна частота 50кГц, то это будет 20 1мкс циклов.
21 цикл это 47619Гц, а 19 циклов это 52631 Гц.

Чтобы в таких условиях выполнять "плавный разгон", блок делает размазывание ошибки.
Если частота не попадает в "точное значение микросекунд", то блок выдаёт смесь (задержка становится то 19 то 20 мкс)

С математической точки зрения, конечно, всё хорошо.


Но интересно проверить работает ли это на практике
Внимание, вопрос: кто-нибудь может проверить работу ШД на реальном ШД?
На частотах до 10кГц вряд ли что-нибудь изменится, а вот на более высоких уже интереснее.

PS. Инструкция по ШД программе тут: https://hardella.com/docs/pru/examples/step-motor/

Владимир Ситников
20.12.2016, 11:00
Запустил сайт, на котором буду размещать новые версии и документацию: https://hardella.com/


Сам удивляюсь. Может В.Ситников меня в черный список включил. ;)

Если во всех браузерах не работает и браузеры обновлены, то проверьтесь на вирусы. Сайт работает под управлением cloudflare.com с их стандартными настройками безопасности. Если что-то не работает, то практически наверняка проблема на стороне браузера.

Евгений Багаев
21.12.2016, 10:47
Уважаемые форумчане, в связи с тем, что в данной теме идет обсуждение Hardella IDE, название будет переименовано.
Посты по обсуждению Hardella IDE будут переноситься в данную тему.
Прошу также обсуждение данной среды вести на сайте разработчика hardella.com на форуме.

Вольд
21.12.2016, 12:15
Уважаемые форумчане, в связи с тем, что в данной теме идет обсуждение Hardella IDE, название будет переименовано.
Посты по обсуждению Hardella IDE будут переноситься в данную тему.
Прошу также обсуждение данной среды вести на сайте разработчика hardella.com на форуме.

Замечательно. Может теперь "цензоры" поумерят свой пыл. Это пример цивилизованного решения проблемы.

Вот могут же в фирме "ОВЕН" когда захотят. ;)

capzap
21.12.2016, 21:50
:) ужасная IDE, сперва не давала вообще ни какие функции ввести и переменные, всё в красноте было. Решил на видео записать, не повторялось. Когда получалось добиться красноты, так видео не включено было. Всё что записал, это стабильно повторялось и несколько не то

Владимир Ситников
21.12.2016, 22:40
несколько не то

О, кто-то попробовал. Я уж думал вообще никто не запускал...

На самом деле, да, тут есть некая проблема. Да, это проблема среды, что при изменении "имени блока" параметры краснеют (так быть, конечно, не должно).
Надо поправить, но руки никак не доходили до этого.

Объясню источник проблемы: параметры (IN, PT) на самом деле знают слишком много. Параметр IN знает, что он именно PT параметр блока TOF.
А когда название блока заменяют на TON, то параметр начинает паниковать: в блоке TON должен быть другой PT параметр (должен быть PT от TON'а, а не PT от TOF'а).

На текущий момент, для обхода проблемы, можно подвести курсор к параметру, нажать ctrl+пробел и "автодополнить" -- параметр сменится на правильный.

IVM
22.12.2016, 10:08
:) ужасная IDE, сперва не давала вообще ни какие функции ввести и переменные, всё в красноте было. Решил на видео записать, не повторялось. Когда получалось добиться красноты, так видео не включено было. Всё что записал, это стабильно повторялось и несколько не то

Это проблемы роста. Москва то же не сразу строилась. ;)

Вольд
22.12.2016, 10:13
:) ужасная IDE, сперва не давала вообще ни какие функции ввести и переменные, всё в красноте было. Решил на видео записать, не повторялось. Когда получалось добиться красноты, так видео не включено было. Всё что записал, это стабильно повторялось и несколько не то

capzap, а среда шустро работает или тормозит ?

capzap
22.12.2016, 10:24
это всё относительно, но пока что нетбинс, тиапортал, кдс3 и 2 работают быстрее, может быть андроид студио помедленее. Это только субъективное впечатление самой работы, в разработке пока сравнивать не чего, отстает от всех. Разработчик видимо ни когда не работал в винде, папка с проектами создалась за обычными "пределами видимости" пользователя. Русским меню и не "пахнет", объект с глобальными переменными вообще в ступор ввел

Вольд
22.12.2016, 10:28
Здоровая критика - это хорошо. Сделать русское меню будет не сложно. Главное что процесс пошел. ;)

capzap
22.12.2016, 10:34
дело ведь не каким языком написано, а чтоб оно еще и работало, назначение RUN я так и не понял, ни чего не запустилось

Владимир Ситников
22.12.2016, 10:53
дело ведь не каким языком написано, а чтоб оно еще и работало, назначение RUN я так и не понял, ни чего не запустилось

Вкладка run внизу появилась? (она же View > Tool Windows > Run)
Что там написано?

Если run совсем не появилось, то что написано в event log? (View > Tool Windows > Event log)

PS. Пробелы в папке с проектом есть?

Собственно, у меня запускается так (это windows 7, стандартный пример):
28285

Владимир Ситников
25.12.2016, 23:13
:) ужасная IDE, сперва не давала вообще ни какие функции ввести и переменные, всё в красноте было. Решил на видео записать, не повторялось. Когда получалось добиться красноты, так видео не включено было. Всё что записал, это стабильно повторялось и несколько не то

Поправил в Hardella 1.6.1 (https://hardella.com/download/).
Оказалось, что в 1.6.0 автообновление нерабочее, поэтому 1.6.1 придётся заново качать.
Но есть плюс: в 1.6.1 я механизм обновлений отладил.


объект с глобальными переменными вообще в ступор ввел
А в чём ступор? Есть идеи, где глобальные будут лучше лежать?
Как сделать без глобальных я не придумал. Они нужны для того, чтобы PLC configuration и сама программа были развязаны (например, можно было менять PLC configuration, а программа при этом бы оставалась целой)

В КДС точно так же: глобальные переменные в специальном объекте лежат.

capzap
26.12.2016, 07:59
если заглянете в объект глобальных переменных в режиме онлайн, то там и так будут отображаться все именованные кaнaлы конфигуратора и когда открываю и вижу в глобальных дублирование, это не понятно, хоть и подписано что инпут и оутпут, а где тогда модуль бутона и статистики, я например ими всегда пользуюсь, про модбас и др. промолчу только потому что почти не пользуюсь, но не только же я программирую, они как будут выглядеть
по поводу проекта, мне минут 10 понадобилось чтоб написать простейший код
tik(IN:=NOT tik.Q,PT:=T#5s);написание кода в черепахе превращается в постоянное клацание по ctrl+space и то если я напишу PT маленькими буквами, то и это уже не поможет, даже когда удаль и напишу большими всёравно остается краснота

Владимир Ситников
26.12.2016, 12:28
если заглянете в объект глобальных переменных в режиме онлайн, то там и так будут отображаться все именованные кaнaлы конфигуратора и когда открываю и вижу в глобальных дублирование, это не понятно, хоть и подписано что инпут и оутпут, а где тогда модуль бутона и статистики, я например ими всегда пользуюсь, про модбас и др. промолчу только потому что почти не пользуюсь, но не только же я программирую, они как будут выглядеть
ПЛК под рукой нет, но в режиме симуляции в глобальных переменных только глобальные переменные (по умолчанию вообще пусто)

PLC Configuration (modbus, button, статистика и т.п.) сейчас выглядит так:
28358

Ну и параметры modbus:
28359


PT маленькими буквами, то и это уже не поможет, даже когда удаль и напишу большими всёравно остается краснота
Я пробовал разные варианты, и если в конце оказывается PT заглавными, то всё ок: http://recordit.co/j5wRMeqEP8 (http://g.recordit.co/j5wRMeqEP8.gif). Тут ctrl+пробел ни разу не нажимался, только буквы и стрелки для перемещения курсора.



мне минут 10 понадобилось чтоб написать простейший код tik(IN:=NOT tik.Q,PT:=T#5s);
Технически, если именно так и писать, то ctrl+пробел можно и не нажимать. Вот список клавиш: t i k I N n o t t i k . Q стрелка_вправо , P T T # 5 s
В целом, можно T # опустить, а сразу написать 5s.

Но, да, надо посмотреть как сделать регистро-независимый ввод.

capzap
27.12.2016, 18:33
нет просто набрать t i k I N n o t t i k не получается
И зачем он скопки создает, если в экспортном файле их снова нет

Владимир Ситников
27.12.2016, 18:39
нет просто набрать t i k I N n o t t i k не получается

Да, я почему-то забыл скобки. Открывающую нужно нажать. Тут можно подумать. Возможно, стоит сделать так, чтобы скобки сами появлялись если переменная это ФБ.

Т.е. так: t i k ( I N n o t t i k . Q стрелка_вправо , P T T # 5 s


http://recordit.co/SGoBIOnd0O ( http://g.recordit.co/SGoBIOnd0O.gif )


И зачем он скопки создает, если в экспортном файле их снова нет
Скобка после NOT'а создаётся "для читаемости". Да, их надо бы убрать.

capzap
27.12.2016, 18:43
я про скобки которые появляются после элемента NOT на видео

Владимир Ситников
27.12.2016, 18:57
я про скобки которые появляются после элемента NOT на видео

Я про них же.

Вот как сейчас реализован "оператор NOT".
28395
Т.е. скобка появляется, если под not'ом находится что-нибудь сложнее простой переменной (внизу size>1).
Наверное, это какой-то старый эксперимент.

Из-за этого возникают такие эффекты:
http://recordit.co/nNP2C56xuJ ( http://g.recordit.co/nNP2C56xuJ.gif )
При добавлении OR "во внутрь скобок" скобки как бы остаются у NOT'а.

Если поправить описание NOT'а (убрать скобки) то будет так:
http://recordit.co/756nkj9qx2 ( http://g.recordit.co/756nkj9qx2.gif )

Т.е. запись NOT tik.Q OR FALSE будет означать NOT(tik.Q) OR FALSE, но выглядеть без скобок. В целом, да, так лучше.

Sulfur
28.12.2016, 07:16
Владимир Ситников
Начал разбираться с Хандреллой. Переписал свои хотелки с нуля. Компиляция проходит, получаю файл *.exp, читаю его в КДС, а дальше не могу сообразить.
Ранее вы предоставляли *.lib, было очень удобно. Однако я нигде не могу найти как сделать *.lib из моего проекта Хандреллы.

Владимир Ситников
28.12.2016, 09:03
Владимир Ситников
Начал разбираться с Хандреллой. Переписал свои хотелки с нуля. Компиляция проходит, получаю файл *.exp, читаю его в КДС, а дальше не могу сообразить.
Ранее вы предоставляли *.lib, было очень удобно. Однако я нигде не могу найти как сделать *.lib из моего проекта Хандреллы.

Хороший вопрос.
А нужно ли lib?

Может, достаточно просто импортировать полученный *.exp в проект и всего делов?

*.lib создать несложно:

Просто создаёшь проект, импортируешь туда *.exp и жмёшь сохранить как... Выбираешь тип файла *.lib, сохраняешь, и готова библиотека.

Sulfur
28.12.2016, 09:19
При экспорте проекта PRU появляется много POU, не могу сообразить как к ним обращаться из PLC_PRG. С либами все проще. Во всяком случае для меня.
ЗЫ: Прошу сильно не пинать - я не профессиональный программист.

Владимир Ситников
28.12.2016, 10:47
При экспорте проекта PRU появляется много POU, не могу сообразить как к ним обращаться из PLC_PRG. С либами все проще. Во всяком случае для меня.
ЗЫ: Прошу сильно не пинать - я не профессиональный программист.

Здесь пример "как обращаться из plc_prg": https://hardella.com/docs/pru/codesys-setup/

По факту, никаких отличий от lib нет, за исключением того, что код попадает непосредственно в проект.
Тут есть и положительный момент: если не переимпортировать exp файл, то код PRU программы останется тем же самым и ничего не сломается. А с библиотеками нужно следить за версиями.

capzap
28.12.2016, 12:24
а где лежат шаблоны создания экспортных файлов и есть ли возможность их править

Владимир Ситников
28.12.2016, 12:45
а где лежат шаблоны создания экспортных файлов и есть ли возможность их править

Про какие шаблоны речь?
PRU шаблоны или "шаблон экспорта обычных ФБ/программ в exp"?

Зачем их менять?

Cделать-то можно (в том числе, можно менять шаблоны даже без перекомпиляции Hardella -- там расширяемость ого го какая). Но сложность составления шаблонов, конечно, повыше, чем сложность написания ST кода.
Поэтому я, скорее, не за возможность редактирования сырых шаблонов, а за расширение пользовательского интерфейса, чтобы можно было галочками или ещё как выбрать нужное.

Сами ФБ выгружаются "1 к одному" (ну, program выгружается как program). Чего там менять?
Описываются так (всё это можно прямо в Hardella открыть и посмотреть):
28411

Шаблоны выгрузки PRU программ описываются так:
28412

capzap
28.12.2016, 13:14
зачем менять вариантов на самом деле много, например формировать файлы для тиапортала,а не КДС или использовать директивы,не думаю что их работа как то учитывается в черепахе,а писать ручками в КДС, тогда зачем переходить на внешний редактор

Владимир Ситников
28.12.2016, 15:07
зачем менять вариантов на самом деле много, например формировать файлы для тиапортала
Так, может, и сделать поддержку этого самого tia portal'а?

На текущий момент я не вижу большого спроса на возможность создания шаблонов на стороне пользователей среды. Тут проще добавлять нужные форматы по ходу.


Например, на добавление PRU ушло меньше месяца.
Из наиболее заметного -- для поддержки PRU в сам ST язык добавлены директивы, которыми обозначается приём-передача данных между "основным циклом ПЛК" и PRU сопроцессором. Уже из этих директив и собирается как сама PRU программа, так и ответная часть в КДС программе.

Обновление среды занимают меньше мегабайта. Проблем вообще не вижу.

Добавляем формат, выпускаем обновление и всего делов. Самое сложное -- формализовать какой именно формат реально нужен. Разумеется, я не предлагаю использовать Hardella вместо текстового редактора.


директивы,не думаю что их работа как то учитывается в черепахе

Если нужны, то их можно добавить в синтаксис черепахи. Либо прямо директивами (ну, чтобы не опечатываться), либо просто текстовое поле типа комментария (так, конечно, делать на порядок проще, но лучше уж по-нормальному делать, ведь директивы КДС без пол-литра не напишешь).


тогда зачем переходить на внешний редактор

Причины могут быть разные:
1) Проверка ошибок на ходу. Тут и банальное "несовпадение типов данных", так и более сложное. Например, "в case рассмотрены не все случаи enum'а", или "у двух веток IF одинаковое условие". Или "условие всегда ложно".

2) Hardella упрощает поддержку проекта (ту часть, когда идёт доработка, или выяснение "а почему тут так"). Навигация по коду, поиск использований, переименование переменных. В КДС переменную не переименуешь и т.п.
Поддержка git/svn. Можно прямо в среде посмотреть историю, посмотреть когда менялась конкретная строка и т.п.

3) Для PRU программирования, например, вообще альтернатив нет. Тут не стоит вопрос "зачем мне использовать Hardella, если есть CoDeSys". Выбора вообще нет. Либо Hardella, либо никак.

4) Расширяемость в конце концов. Ждать от КДС интеграцию с чем-либо вряд ли стоит. А тут можно сделать, и интеграция будет не из запуска 100500 утилит, а в общем редакторе.


Возможен как экспорт данных (например, разнообразные форматы выгрузки, списки переменных, ну фиг знает что нужно), так и импорт данных.

Например, был умелец, который предлагал программировать в Visio (http://www.owen.ru/forum/showthread.php?t=11839&page=2&p=75077&viewfull=1#post75077). Видели?

С одной стороны он говорит, что "КДС редактор не всегда удобен" (тут, наверное, можно его понять, иногда в visio можно "красивее" нарисовать), но с другой, я не считаю, что использование Visio как стороннего редактора жизнеспособно. По-моему, Visio это тупиковый путь. Оно решает какую-то одну узкую задачу, никак не помогает в других, и никак не расширяется.

В этом плане, у редактора на базе Hardella потенциал развития гораздо выше: без проблем можно добавлять и текстовые языки, и таблицы, и графику. Как пример, я могу загружать описания КДС таргетов и показывать их (дерево компонент, таблицы параметров и т.п.)

5) Возможно, когда-нибудь и без КДС можно будет работать. Про ОВЕН не будем загадывать, но, например, приборы МЗТА работают без КДС. У них свой runtime, и в ПЛК заливаются программы на C. Особых проблем генерировать C-код из Hardella нет (да и сам производитель с радостью рассказывает как оно устроено), и вполне можно замкнуть цикл. Т.е. разработка, заливка в ПЛК, online. Это, конечно, не дело ближайших месяцев, но почему бы и нет?

6) Автоматическое тестирование. Т.е. возможность указать "вот при таких входах должны быть такие значения на выходах". Так, чтобы во-первых программа реально работала так, как ожидается, а во-вторых, чтобы при доработках старое поведение не ломалось.

Сейчас и в КДС и в ОЛ для тестирования нужно "прощёлкивать" вручную. В Hardella же есть план как сделать автоматическое "прощёлкивание" и проверку значений.

Sulfur
29.12.2016, 11:44
Здесь пример "как обращаться из plc_prg"
Правильно ли я понимаю, что инициализацию PRU в PLC_PRG можно сделать так:

var
init:BOOL; (*Флаг инициализации*)
end_var

IF NOT init THEN
<<<вызов хххх_Pru0Init() и хххх_Pru1Init() с пустыми параметрами>>>
init:=TRUE;
END_IF;
<<<обращение к POU ххх_Pru0(1)MemoryTransfer с разными параметрами>>>

Владимир Ситников
29.12.2016, 11:59
Правильно ли я понимаю, что инициализацию PRU в PLC_PRG можно сделать так:

var
init:BOOL; (*Флаг инициализации*)
end_var

IF NOT init THEN
<<<вызов хххх_Pru0Init() и хххх_Pru1Init() с пустыми параметрами>>>
init:=TRUE;
END_IF;
<<<обращение к POU ххх_Pru0(1)MemoryTransfer с разными параметрами>>>

Да, так можно.

А можно и без if not init (внутри хххх_Pru0Init тоже есть аналогичная переменная).

Если точнее, то хххх_Pru0Init принимает аргумент enable:BOOL и по переднему фронту проводит сброс PRU ядра и заливку программы. Так можно менять PRU программы на ходу.

Sulfur
31.12.2016, 08:01
Владимир Ситников
Вопрос по ххх_Pru0(1)MemoryTransfer.
Могу ли я в основном проекте в начале PLC_PRG (в начале цикла) обратиться к ххх_Pru0(1)MemoryTransfer только с чтением переменных обмена (чтение из PRU), а в конце PLC_PRG (в конце цикла) к этой же ххх_Pru0(1)MemoryTransfer, но только к записи переменных обмена (запись в PRU)?
Или будет достаточно просто один раз прописать сопоставление переменным ххх_Pru0(1)MemoryTransfer с переменными PLC_PRG в начале цикла?

Владимир Ситников
31.12.2016, 09:51
Сейчас MemoryTransfer производит обмен всех переменных.
Потому вызывать MemoryTransfer нужно согласно купленным билетам, т.е. согласно тому, как необходимо по логике.

Просто стоит учитывать, что между вызовами MemoryTransfer (даже в рамках одного цилка ПЛК) PRU программа может успеть выполнить несколько итераций.




обратиться к ххх_Pru0(1)MemoryTransfer только с чтением переменных обмена (чтение из PRU), а в конце PLC_PRG (в конце цикла) к этой же ххх_Pru0(1)MemoryTransfer, но только к записи переменных обмена (запись в PRU)?

Да, так можно.
Фактически тут будет "запись тех же самых значений, что записывались ранее".
Вообще, мысль разделить чтение и запись интересная.

Если хотите, можно использовать такой синтаксис:


MemoryTransfer.motor_enable := TRUE;
MemoryTransfer.fast := TRUE;

MemoryTransfer(); (* собственно, обмен *)

motorState := MemoryTransfer.motorState; (* чтение *)



Или будет достаточно просто один раз прописать сопоставление переменным ххх_Pru0(1)MemoryTransfer с переменными PLC_PRG в начале цикла?
Зависит от того, какая логика нужна. Вызывать MemoryTransfer можно много раз внутри одного цикла ПЛК, и каждый раз можно получать "более новые" значения.

Sulfur
31.12.2016, 10:48
Зависит от того, какая логика нужна.
Логика простая - в начале цикла опрашиваем всё, что опрашивается, делаем вычисление, и пишем результаты во всё, что пишется. В данном случае фазы "опрашивается" и "пишется" объединены в одном модуле.


Просто стоит учитывать, что между вызовами MemoryTransfer (даже в рамках одного цилка ПЛК) PRU программа может успеть выполнить несколько итераций.

Я это понимаю. Именно из этих соображений критичные ко времени действия организованы в PRU-части. В ПЛЦ_ПРГ остается только "обслуга", либо медленные процессы\счетчики.

Владимир Ситников
31.12.2016, 11:43
Логика простая - в начале цикла опрашиваем всё, что опрашивается, делаем вычисление, и пишем результаты во всё, что пишется. В данном случае фазы "опрашивается" и "пишется" объединены в одном модуле.

Получается, если вместо одной текущей программы memorytransfer сделать две (для опроса и для записи), то будет понятнее?

В остальном работает?

Newcomer
01.01.2017, 13:59
Добрый день.

Зашел на сайт https://hardella.com/ и обнаружил, что подробности Крути ШД без забот (Узнать больше) изложены на английском.

Это какой-то косяк ?

Хочу попробовать использовать технологию PRU для работы с быстрыми входами/выходами ПЛК110[М02]. К первым двум быстрым входам подключен энкодер. К четырем быстрым выходам два драйвера ШД.

Теперь вопрос - есть ли готовая библиотека, разработанная посредством Hardella или надо скачивать, запускать Hardella и генерировать эти блоки.

Еще один вопрос - оставшиеся 2 быстрых входа можно будет как-то использовать.

Владимир Ситников
01.01.2017, 16:24
Добрый день.

Зашел на сайт https://hardella.com/ и обнаружил, что подробности Крути ШД без забот (Узнать больше) изложены на английском.

Это какой-то косяк ?

Да. Поправил.
Большинство страниц написаны на русском и английском языках, и тут попал английский текст.


Хочу попробовать использовать технологию PRU для работы с быстрыми входами/выходами ПЛК110[М02]. К первым двум быстрым входам подключен энкодер. К четырем быстрым выходам два драйвера ШД.

Теперь вопрос - есть ли готовая библиотека, разработанная посредством Hardella или надо скачивать, запускать Hardella и генерировать эти блоки.

Нужно скачать Hardella, и составить нужную PRU программу. Готовой нет.
Блоки обработки ШД и энкодера входят в поставку Hardella.


Еще один вопрос - оставшиеся 2 быстрых входа можно будет как-то использовать.
Любым нужным образом.

Например, можно сделать быстрые счётчики (https://hardella.com/docs/pru/examples/fast-counter/), или подключить AB энкодер (https://hardella.com/docs/pru/examples/fast-encoder/), или ещё как.

Newcomer
01.01.2017, 16:53
Нужно скачать Hardella, и составить нужную PRU программу. Готовой нет.
Блоки обработки ШД и энкодера входят в поставку Hardella.

Что значит составить PRU программу ? Мне нужно из основной программы опрашивать энкодер и управлять драйверами ШД. Вроде раньше у вас были соответствующие ФБ, к которым можно было обращаться из основной программы.

Английский текст так и остался.

Владимир Ситников
01.01.2017, 17:03
Что значит составить PRU программу ? Мне нужно из основной программы опрашивать энкодер и управлять драйверами ШД. Вроде раньше у вас были соответствующие ФБ, к которым можно было обращаться из основной программы.

Hardella генерирует тот код, который нужен для обмена данными между PRU и основным циклом.

Посмотрите примеры. Если непонятно, можно дополнить документацию. Но, блин, для "составления программы энкодера" достаточно лишь нажать "File - new project - fast encoder - ok", потом нажать run на PRU configuration. Создадутся и программа для PRU, и код для работы из основного цикла.

Newcomer
01.01.2017, 17:05
Не поддерживаются сложные выражения. Т.е. чтобы записать d := a+b-c нужно делать промежуточную переменную и записывать как u := b-c; d:= a+b;

Тут у вас ошибка.

Должно быть: d:= a+u;

Newcomer
01.01.2017, 17:07
Hardella генерирует тот код, который нужен для обмена данными между PRU и основным циклом.

Посмотрите примеры. Если непонятно, можно дополнить документацию. Но, блин, для "составления программы энкодера" достаточно лишь нажать "File - new project - fast encoder - ok", потом нажать run на PRU configuration. Создадутся и программа для PRU, и код для работы из основного цикла.

Ну, так и сделаю. ;)

Владимир Ситников
01.01.2017, 17:11
Не поддерживаются сложные выражения. Т.е. чтобы записать d := a+b-c нужно делать промежуточную переменную и записывать как u := b-c; d:= a+b;

Тут у вас ошибка.

Должно быть: d:= a+u;

Ага, спасибо, подобное можно просто на странице выделить и alt+enter нажать - мне письмо уйдет.

Но, возможно, на праздниках сделаю поддержку сложных выражений

Newcomer
01.01.2017, 17:13
Читаю потихоньку разделы сайта. По моему мнению сайт получился хороший. Простым понятным языком прописано все необходимое.

Похоже, проблемы работы с энкодерами, драйверами ШД и сервоприводами в ПЛК110[М02] решены профессионально.

Хороший подарок к Новому году. Спасибо Деду Морозу - Владимиру Ситникову. ;)

Владимир Ситников
01.01.2017, 17:14
Английский текст так и остался.
Нужно или 4 часа подождать, или кэш браузера сбросить. Сейчас все страницы на 4 часа кэшируются.

Newcomer
01.01.2017, 17:20
Нужно или 4 часа подождать, или кэш браузера сбросить. Сейчас все страницы на 4 часа кэшируются.

Русский текст появился.

Newcomer
01.01.2017, 17:30
А что значит это:

GPG подписи созданы ключом 2048R/410C47B1 Vladimir Sitnikov (fingerprint = 1A60 90D3 223D CA95 BFD2 5C0E 38F4 7D3E 410C 47B1). Если хотите проверить .asc подпись, можете загрузить ключ с сервера MIT.

Владимир Ситников
01.01.2017, 18:08
А что значит это:

GPG подписи созданы ключом 2048R/410C47B1 Vladimir Sitnikov (fingerprint = 1A60 90D3 223D CA95 BFD2 5C0E 38F4 7D3E 410C 47B1). Если хотите проверить .asc подпись, можете загрузить ключ с сервера MIT.

Например, тут есть описание: https://www.opennet.ru/docs/RUS/gph/ch01s04.html

Смысл в том, что asc это цифровая подпись и никто кроме меня не может подписать файл моей подписью

Иными словами, sha256 позволяет проверить лишь то, что файл получен верно, без ошибок. Но, если злоумышленник подменит дистрибутив программы и подменит sha256 файл, то подлога не заметить. Цифровую подпись же не поделаешь, поэтому если asc проходит проверку, то это уж точно тот файл, который я выпускал.

Но, это всё, скорее, "на всякий случай". Сайт работает только через https, т.е. все передаваемые данные шифруются, поэтому даже "просто подменить файл" далеко не так-то просто.

Newcomer
01.01.2017, 18:16
А точную ссылку на страницу, с которой загружается Java SE Development Kit 8 можете дать. Чтобы ткнунь в эту самую загрузку и все.

Владимир Ситников
01.01.2017, 19:14
А точную ссылку на страницу, с которой загружается Java SE Development Kit 8 можете дать. Чтобы ткнунь в эту самую загрузку и все.

Так ссылка "с сайта oracle.com" на странице загрузки и ведёт на нужную страницу. Прямую ссылку на файл с JDK сделать невозможно - это будет противоречить лицензии на JDK.

Альтернативный вариант - включить JDK в состав Hardella. Но это увеличит размер дистрибутива и последующих обновлений.

Newcomer
02.01.2017, 12:31
Так ссылка "с сайта oracle.com" на странице загрузки и ведёт на нужную страницу. Прямую ссылку на файл с JDK сделать невозможно - это будет противоречить лицензии на JDK.

Альтернативный вариант - включить JDK в состав Hardella. Но это увеличит размер дистрибутива и последующих обновлений.

А чем отличается Java SE Development Kit 8u111 от Java SE Development Kit 8u112 ?

Владимир Ситников
02.01.2017, 13:01
А чем отличается Java SE Development Kit 8u111 от Java SE Development Kit 8u112 ?

Конкретная версия для Hardella не важна. Можно просто брать последнюю.
8u111 (нечетные версии) это исправление проблем безопасности, а 8u112 это 8u111+какие-то доработки.

Newcomer
04.01.2017, 15:13
Надеюсь основную программу можно будет писать в CoDeSys, а не в Hardella ?

Владимир Ситников
04.01.2017, 15:34
Надеюсь основную программу можно будет писать в CoDeSys, а не в Hardella ?
Конечно, именно под такой вариант сейчас всё и сделано

Владимир Ситников
04.01.2017, 20:28
"сложные" выражения оказалось сделать не так сложно:
28572

Более сложный момент -- знаковые типы данных, сравнения (в том числе сравнение знаковых типов) и преобразования типов (разнообразные INT_TO_DWORD и т.п.)

Newcomer
05.01.2017, 19:26
При первой компиляция PRU проекта неудачно указал путь для размещения результатов. Среда пишет, что путь плохой, но задать новый путь не предлагает. Как переназначить путь ?

Владимир Ситников
05.01.2017, 19:28
При первой компиляция PRU проекта неудачно указал путь для размещения результатов. Среда пишет, что путь плохой, но задать новый путь не предлагает. Как перезадать путь ?

Меню Run -> Edit Configurations, слева выбираем конфигурацию (скорее всего, она одна и уже выбрана), справа указываем путь:
28579

Newcomer
05.01.2017, 19:32
А почему Hardella так долго загружается ?

Владимир Ситников
05.01.2017, 19:41
А почему Hardella так долго загружается ?

Долго это сколько?
У меня секунд 10 (не замерял, но, вроде, так).

Я, честно говоря, среду редко закрываю -- поэтому "длительность загрузки" не ощущаю.

Аналогично, когда на java программирую, то IntelliJ IDEA тоже не выключаю. Выключаю, только когда нужно продлить время работы ноута от батарейки (ну, тогда всё лишнее приходится тушить).

Newcomer
05.01.2017, 19:45
И какой у вас ноут ?

Владимир Ситников
05.01.2017, 19:51
И какой у вас ноут ?



Название модели: MacBook Pro
Идентификатор модели: MacBookPro11,3
Имя процессора: Intel Core i7
Скорость процессора: 2,6 GHz
Количество процессоров: 1
Общее количество ядер: 4
Кэш 2-го уровня (в каждом ядре): 256 КБ
Кэш L3: 6 МБ
Память: 16 ГБ


Где-то года два с половиной назад покупал.

Если запускается очень долго, то есть следующие варианты:
1) Проверить антивирус -- иногда он сильно мешает
2) Проверить жёсткий диск (особенно, если ему больше 2-3 лет). Если там есть битые блоки, то чтение битых блоков может быть ооочень медленным. Простейший способ проверить в Windows -- запустить Пуск-Выполнить-resmon и посмотреть раздел "жёсткий диск" на предмет параметра "размер очереди/ среднее время ответа". Если среднее время ответа больше 100мс, то это беда-печаль, а не диск.

Владимир Ситников
05.01.2017, 19:59
Собственно, в "Resource Monitor'е" смотреть сюда:
28580

Времена больше 100мс -- подозрительно. Времена больше 1сек -- беда, больше 10сек -- совсем печаль.

Я недавно таким методом вычислил "подыхающий диск" и успел заменить на новый.

Newcomer
05.01.2017, 20:01
У меня Core i3, поэтому и загружается долго.

Newcomer
05.01.2017, 20:05
А как деинсталлировать Hardella ?

Владимир Ситников
05.01.2017, 20:21
А как деинсталлировать Hardella ?

Папку удалить и всего делов.
Ещё можно удалить папку %USERPROFILE%\.IDE61131-15

Владимир Ситников
05.01.2017, 22:56
Ну и система типов в КДС.

SINT OR SINT не определено, а SINT + SINT это INT.

28581

Первая строка не компилируется, а вторая проходит. Ну как так?

Вольд
06.01.2017, 11:43
А с чего бы это первая строка должна нормально компилироваться ?

Владимир Ситников
06.01.2017, 11:51
А с чего бы это первая строка должна нормально компилироваться ?

А почему бы и нет?

Если записывать как dword_var := -1 XOR -2, то КДС считает, что результат XOR'а это SINT и нормально компилирует!
Получается, результат зависит от того, записано ли "-1" или же используется переменная аналогичного типа.

28586

Вольд
06.01.2017, 11:57
Битовые операторы применимы для типов ANY_BIT.

В IEC 61 131-3 под записью ANY_BIT понимаются все типы данных указанные в следующем перечне: DWORD, WORD, BYTE, BOOL.

SINT в этом списке нет.

Владимир Ситников
06.01.2017, 12:01
В IEC 61 131-3 под записью ANY_BIT понимаются все типы данных указанные в следующем перечне: DWORD, WORD, BYTE, BOOL.

SINT в этом списке нет.

А почему тогда работает -1 XOR -2 ?

Видел я это ANY_BIT, но КДС позволяет весьма вольно конвертировать между типами.
Например:
dword_var := -1; -- не работает (якобы, нельзя преобразовать -1 в DWORD)
А такое уже работает: dword_var := sint_var;

Вообще шикарно. Я бы либо запрещал оба варианта (требовал явного TO_DWORD), либо разрешал оба. Зачем делать правила, которые по-разному работают для литералов и переменных?

Владимир Ситников
06.01.2017, 12:07
Если уж совсем придерживаться "букве 61131", то для ANY_BIT не определены операции +/-.

Т.е. запись dword_var := dword_var + 1; уже должна выбрасывать ошибку "невозможно складывать ANY_BIT".
Удобно ли будет так программировать?
Да, по букве закона, но уже наверняка все привыкли dword'ы складывать и вычитать.

Если же "разрешать" и по факту считать это как dword_var := DWORD_TO_UDINT(dword_var) + 1, то результат сложения это UDINT, и нужно разрешать неявное приведение типа UDINT -> DWORD (чтобы не приходилось записывать явно dword_var := TO_DWORD(TO_UDINT(dword_var) + 1); )

Newcomer
06.01.2017, 14:23
Создание проекта для PRU программы

Для создания проекта нужно:

На экране приветствия нажать кнопку Create New Project или в главном меню выбрать: File > New > Project...

А где там главное меню ? Есть только экран приветствия. Как из экрана приветствия перейти к главному меню ?

Newcomer
06.01.2017, 14:43
Hardella.

Из-за ограничений прошивки ПЛК110, доступны 3 варианта.

Почему не возможна четвертая комбинация PLC Configuration - Свободная программа ?

Владимир Ситников
06.01.2017, 15:04
Почему не возможна четвертая комбинация PLC Configuration - Свободная программа ?
Это спрашивайте у фирмы ОВЕН. Я без понятия, и догадки на ум не приходят.

Владимир Ситников
06.01.2017, 15:06
А где там главное меню ? Есть только экран приветствия. Как из экрана приветствия перейти к главному меню ?
Главное меню появляется при открытии хоть какого-нибудь проекта.
Зачем к нему переходить с экрана приветствия?

Newcomer
06.01.2017, 15:09
Редактор в Hardella ввел меня в ступор. Как в нем текст вводить ?

Владимир Ситников
06.01.2017, 15:17
Редактор в Hardella ввел меня в ступор. Как в нем текст вводить ?

Давайте конкретнее. Что именно не получается ввести?

Сейчас редактор работает в регистро-зависимом режиме.
Например, если переменная объявлена как myVar, то набирать нужно именно в таком регистре. Если набрать myvar, то оно так и останется красным.

Владимир Ситников
06.01.2017, 15:18
Редактор в Hardella ввел меня в ступор. Как в нем текст вводить ?

И, да, раздел про редактирование текста (https://hardella.com/docs/ide/editor/#Введение-выражений) читали?

Newcomer
06.01.2017, 17:03
To В.Ситников. Сварганил из двух ваших проектов свой, который мне нужен. Но у меня там в одном месте краснота. ;) Поясните, пожалуйста, в чем причина.

Владимир Ситников
06.01.2017, 17:37
To В.Ситников. Сварганил из двух ваших проектов свой, который мне нужен. Но у меня там в одном месте краснота. ;) Поясните, пожалуйста, в чем причина.

Понял проблему.
В самом начале нужно добавить "тело программы": http://recordit.co/D35kJ4ReHA (оно же в виде анимированного gif: http://g.recordit.co/D35kJ4ReHA.gif)
Надо бы сделать, чтобы оно само добавлялось.

Общее "правило": в любой непонятной ситуации нажимай ctrl+пробел.

Newcomer
06.01.2017, 18:26
Понял проблему.
В самом начале нужно добавить "тело программы": http://recordit.co/D35kJ4ReHA (оно же в виде анимированного gif: http://g.recordit.co/D35kJ4ReHA.gif)
Надо бы сделать, чтобы оно само добавлялось.

Общее "правило": в любой непонятной ситуации нажимай ctrl+пробел.

Спасибо. Завтра попробую поправить.

Newcomer
07.01.2017, 11:28
Владимир, почему у меня строка красная ? Вроде все правильно прописано.

Newcomer
07.01.2017, 11:41
Вот еще момент. Нажимаю ctrl+пробел и выскакивает сообщение.

Владимир Ситников
07.01.2017, 11:48
Вот еще момент. Нажимаю ctrl+пробел и выскакивает сообщение.

Ну, да. В этом списке нужно выбрать этот единственный пункт "statementlist" и писать код уже после этого

Newcomer
07.01.2017, 11:48
В этой ситуации что делать ? Нажатие ctrl+пробел не помогает.

Владимир Ситников
07.01.2017, 11:51
В этой ситуации что делать ? Нажатие ctrl+пробел не помогает.

ctrl+пробел, появится выпадающий список, потом enter. Надпись <no body> уйдёт, будет пустая строка -- в ней уже можно писать код.

Newcomer
07.01.2017, 11:51
Ну, да. В этом списке нужно выбрать этот единственный пункт "statementlist" и писать код уже после этого

Не возможно там ничего выбрать.

Newcomer
07.01.2017, 11:51
ctrl+пробел, появится выпадающий список, потом enter. Надпись <no body> уйдёт, будет пустая строка -- в ней уже можно писать код.

Нет там никакого выпадающего списка. Есть пустое желтое поле и сообщение в длинной строке.

Newcomer
07.01.2017, 12:05
Если стоит в скобках No body, то ничего делать не возможно.

Убрал No body и все пошло как вы писали.

Newcomer
07.01.2017, 12:22
У вас в ФБ для PRU предполагается, что на быстрые входы ПЛК заведено три сигнала энкодера. Я Z-сигнал не использую. Что будет если не подключать Z-сигнал ?

Владимир Ситников
07.01.2017, 12:57
У вас в ФБ для PRU предполагается, что на быстрые входы ПЛК заведено три сигнала энкодера. Я Z-сигнал не использую. Что будет если не подключать Z-сигнал ?

Посмотрите исходник (ctrl+щелчок мыши на PRU_ABZ_ENCODER) и узнаете что будет.
Ничего особенного и не будет. Будет работать как AB-энкодер.
Ну, сигнал "zeroDetected" никогда в true не перейдет.

Newcomer
07.01.2017, 13:42
У вас Z-сигнал для чего используется ?

Владимир Ситников
07.01.2017, 14:02
У вас Z-сигнал для чего используется ?

Чтобы сбрасывать показания энкодера и возвращать статус "найдена z метка".

Newcomer
07.01.2017, 14:07
Как можно целиком скопировать текст в окне Hardella ?

Newcomer
07.01.2017, 14:08
Чтобы сбрасывать показания энкодера и возвращать статус "найдена z метка".

Возвращать статус "найдена z метка" - это я понимаю. А зачем нужно сбрасывать показания энкодера ?

Владимир Ситников
07.01.2017, 14:15
Возвращать статус "найдена z метка" - это я понимаю. А зачем нужно сбрасывать показания энкодера ?

Хороший вопрос. Сходу более умного ничего не придумал, вот так и сделал.

Совсем не сбрасывать тоже нельзя. Ведь одного статуса "найдена z метка" мало, надо знать "когда она найдена" (сколько было на энкодере).

Ну и сама Z метка может защищать от накопления ошибки в случае, если где-нибудь в середине импульс пропустился (по вине энкодера, проводов или плк).
В таком случае, наверное, стоит в блоке указывать "ожидаемое количество импульсов между Z метками", и чтобы он следил за тем совпадает ли.

Владимир Ситников
07.01.2017, 14:16
Как можно целиком скопировать текст в окне Hardella ?

Есть горячая клавиша ctrl+W -- расширить область текущего выделения. Т.е. сначала выделяется слово, потом выражение, потом блок кода, и так далее.
Если нажимать много раз -- то выделится вся программа.

Ну или "как во всех остальных программах":
1) shift+стрелки курсора
2) зажимаем мышку и выделяем

Newcomer
07.01.2017, 14:56
А почему нет Save project As

Владимир Ситников
07.01.2017, 15:03
А почему нет Save project As

А что под этим подразумевается?

Newcomer
07.01.2017, 15:23
А что под этим подразумевается?

Сохранить проект в указанную папку.

Владимир Ситников
07.01.2017, 15:40
Сохранить проект в указанную папку.

Кхм. Никогда не приходил в голову такой сценарий использования.
Это для чего?

Записал тут: https://github.com/Hardella/ide61131/issues/11, но звучит сомнительно.

capzap
07.01.2017, 15:43
Кхм. Никогда не приходил в голову такой сценарий использования.

Вы видимо считаете что владение git с молоком матери приходит

Newcomer
07.01.2017, 15:48
Кхм. Никогда не приходил в голову такой сценарий использования.
Это для чего?

Записал тут: https://github.com/Hardella/ide61131/issues/11, но звучит сомнительно.

Практически в любом приложении есть такая возможность. Например, Блокнот. Выбрал в меню Файл -> Сохранить как и появилось окно.

Владимир Ситников
07.01.2017, 16:03
Вы видимо считаете что владение git с молоком матери приходит

Я издревле пользуюсь IntelliJ IDEA, и там нет понятия "клонировать проект" / "save as". Мне не было нужно, и я вообще не задумывался о том, что "такое может быть". Разумеется, когда я не знал git я создавал "папки с резервными копиями"

В целом, простого копирования файлов должно быть достаточно. Т.е. копируем всю папку с проектом в новое место и открываем.

Гипотетически, можно сделать такой пункт меню, но, может, достаточно просто из "проводника" выполнять копирование когда нужно?
Это настолько частая операция?

Newcomer
07.01.2017, 16:09
Как мне в эту программу:

PROGRAM Step2_Enc
variables:
@Export
state : BOOL;

body:
IF enable THEN
state := NOT state;
END_IF;
FAST_OUTPUTS(out3 := state, out4 := NOT state);
END_PROGRAM

добавить этот код:

variables:
@Export(position, counter, zeroDetected)
inputs : FAST_INPUTS;

body:
encoder(a := inputs.in1, b := inputs.in2, z := inputs.in3);

У меня с вашим редактором проблемы. Какой-то он очень умный для меня. ;)

Владимир Ситников
07.01.2017, 16:28
Как мне в эту программу:


PROGRAM Step2_Enc
variables:
@Export
state : BOOL;

body:
IF enable THEN
state := NOT state;
END_IF;
FAST_OUTPUTS(out3 := state, out4 := NOT state);
END_PROGRAM

добавить этот код:


variables:
@Export(position, counter, zeroDetected)
inputs : FAST_INPUTS;

body:
encoder(a := inputs.in1, b := inputs.in2, z := inputs.in3);

У меня с вашим редактором проблемы. Какой-то он очень умный для меня. ;)

Редактор действительно своеобразный, и, я добавлю "упражнения с редактором" при первом запуске среды.

Тем не менее, что конкретно не получается? Скопировать или с нуля написать?
Если в двух словах, то переменные нужно копировать отдельно, код отдельно.
Скопировать сразу всю программу можно, но вот куда её вставлять?
Вставлять программу на место того, где должны быть выражения?

Поведение ctrl+c/v описано тут: https://hardella.com/docs/ide/editor/#Копирование-и-вставка


Как вариант, например, так:
1) Выделяем переменную "inputs : FAST_INPUTS;" (например, shift стрелка вверх-вниз, или просто поставить курсор на точку с запятой)
2) Жмём ctrl+c
3) переходим в Step2_Enc, ставим курсор туда, куда нужно вставлять
4) Жмём ctrl+v

Аналогично можно скопировать и вызов encoder(a := inputs

Newcomer
07.01.2017, 16:38
При копировании в конце строки появляются : и ; Как их убрать ?

Scream
07.01.2017, 17:41
Я издревле пользуюсь IntelliJ IDEA, и там нет понятия "клонировать проект" / "save as". Мне не было нужно, и я вообще не задумывался о том, что "такое может быть". Разумеется, когда я не знал git я создавал "папки с резервными копиями"

В целом, простого копирования файлов должно быть достаточно. Т.е. копируем всю папку с проектом в новое место и открываем.

Гипотетически, можно сделать такой пункт меню, но, может, достаточно просто из "проводника" выполнять копирование когда нужно?
Это настолько частая операция?

Может тем кто не знаком с git сделаете урок когда на работе и дома на разных ПК стоит hardella и надо перенести проект с работы домой, как пример.
скачали git, создали учетку на bitbucket, ввели пароль, на работе сделали commit and push, дома сделали checkout from Version Control
вдруг оценят, хотя...

Владимир Ситников
07.01.2017, 17:45
При копировании в конце строки появляются : и ; Как их убрать ?

Можно картинку с проблемой?

такое мешает?
28604

Это "поле ввода для переменной", и оно убирается либо клавишей del, либо backspace (в зависимости от того, где находится курсор)
Например, ставим курсор на <no name> и нажимаем del
Или ставим курсор после символа ; и нажимаем backspace.

Newcomer
07.01.2017, 17:49
GIT - это не главное. Важнее разобраться с редактором, который использован в Hardella. Это то же какой-то стандарт или В.Ситников его сам придумал ?

Newcomer
07.01.2017, 17:53
У меня такой вопрос - как в имеющийся текст добавить свои строки ? Вот я открыл текст готовой программы и хочу добавить туда новую строку. Каков порядок действий ? Куда изначально поставить курсор (редактор не позволяет поставить курсор куда попало) и что дальше делать ?

Владимир Ситников
07.01.2017, 17:58
GIT - это не главное. Важнее разобраться с редактором, который использован в Hardella. Это то же какой-то стандарт или В.Ситников его сам придумал ?

Редактор не я придумал, это разработка JetBrains: https://www.jetbrains.com/mps/

Есть научные исследования о том, как "простые смертные" воспринимают такой редактор и находят ли они его удобнее.
Недавно был очередной доклад на тему "использование подобного редактора для программирования микроконтроллеров на C". http://2016.splashcon.org/event/itsle2016-lessons-learned-about-language-engineering-from-the-development-of-mbeddr

Собственно, слайды: http://voelter.de/data/presentations/buildingMbeddr2016.pdf

Там есть слайд 71:
28605

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

Newcomer
07.01.2017, 18:01
А обычный, всем привычный, редактор нельзя было использовать ?

Владимир Ситников
07.01.2017, 18:01
У меня такой вопрос - как в имеющийся текст добавить свои строки ? Вот я открыл текст готовой программы и хочу добавить туда новую строку. Каков порядок действий ? Куда изначально поставить курсор (редактор не позволяет поставить курсор куда попало) и что дальше делать ?

Покажите картинку "начальное состояние" (чтобы было видно курсор) и что нажимаете.

Нажатие enter должно создавать новую строку в большинстве случаев.
Если курсор находится в области передачи параметров в ФБ (внутри скобок), то enter будет добавлять новый параметр в список.

Newcomer
07.01.2017, 18:15
Вот эту строку как ввести ?

Newcomer
07.01.2017, 18:29
Все остальные строки ввел. Осталась только строка из предыдущего поста. Ctr + пробел для этой строки не работает.

Владимир Ситников
07.01.2017, 18:36
Вот эту строку как ввести ?

https://hardella.com/docs/pru/data-exchange/

28607

Т.е. подвести к переменной, нажать alt+enter и выбрать "exchange with host".

В целом, можно добавить реакцию на @ (чтобы появлялось @Echange), но, честно говоря, не уверен, что вообще такой "синтаксис" правилен. Смотрится несколько странно, но в голову ничего лучше не приходит.

Владимир Ситников
07.01.2017, 18:38
А обычный, всем привычный, редактор нельзя было использовать ?

Нет.

Сделать удобную среду с текстовым редактором сложно.
Редактировать что-нибудь типа "PLC Configuration" в текстовом виде тоже никак.
Сделать CFC или подобное в текстовом редакторе вообще невозможно.

Да, здесь редактор своеобразный, но зато без проблем можно встраивать таблицы, картинки галочки, выпадающие списки, разные подсказки, графические языки и прочее.

Newcomer
07.01.2017, 18:50
Все что надо ввел, проект компилируется без ошибок. Спасибо В.Ситникову.

Из того, что сделал В.Ситников слепил свой проект - энкодер + 2 драйвера ШД.

Прилагаю свой проект. Владимир, посмотрите, пожалуйста, все ли я правильно сделал.

Newcomer
07.01.2017, 18:52
Редактор действительно простой, если в нем разобраться. Все основано на подсказках. Но пользоваться им не очень удобно.

Владимир Ситников
07.01.2017, 19:34
Но пользоваться им не очень удобно.

В идеале, конечно, должно быть "неотличимо от текстового". Надо просто последовательно выправлять углы -- т.е. править конкретные моменты. Поэтому я и прошу сообщать о том, когда нажимаемое не соответствует ожидаемому.

Например, как в примере про "@Export" можно сделать, чтобы эта штука появлялась по символу @.
Но, с другой стороны, как без подсказок пользователь узнает что это самое @Export вообще бывает?

Владимир Ситников
07.01.2017, 19:37
Прилагаю свой проект. Владимир, посмотрите, пожалуйста, все ли я правильно сделал.
Выглядит верно.

Newcomer
07.01.2017, 19:48
В Hardella IDE на панели меню очень много вкладок с выпадающими списками. Интересно все ли это работает ?

Владимир Ситников
07.01.2017, 20:10
В Hardella IDE на панели меню очень много вкладок с выпадающими списками. Интересно все ли это работает ?

Ну, работать-то оно боле-менее должно, но, вполне возможно, часть нужно скрыть, а часть адаптировать под нужды конкретной среды.
Фактически, большая часть это штатный инструмент JetBrains MPS. Моего кода там немного.

Например, Edit -> Find -> Find Usages входит в штатную поставку и просто работает. Мне не приходилось ничего делать, чтобы это меню появилось и/или заработало.

С другой стороны, раздел "debug" есть, но по факту отладка и online режим сейчас не реализован.

Newcomer
08.01.2017, 13:43
Причесать бы среду не мешало, а то глаза разбегаются от всего что там есть.

Ну, а проделанная Владимиром Ситниковым работа впечатляет. Respect !

Newcomer
08.01.2017, 14:12
Опять проблема. Как правильно вбить default program чтобы IDE не отторгала ? ;)

Владимир Ситников
08.01.2017, 14:34
Опять проблема. Как правильно вбить default program чтобы IDE не отторгала ? ;)

За этим нужно идти в ОВЕН на поклон.

Объясняю: PRU программирование без PRU0 программы не поддерживается на уровне прошивки ПЛК.
Т.е. хоть ты тресни, но либо вообще все PRU программы по умолчанию, либо хотя бы PRU0 программа должна быть.

Поэтому default program может возникать в PRU1, но не может в PRU0.


Какой смысл создавать PRU configuration, и указывать PRU0==default, PRU1==default?

Newcomer
08.01.2017, 14:44
За этим нужно идти в ОВЕН на поклон.

Там кланяться бесполезно. ;)

Newcomer
08.01.2017, 16:42
А как переназначить путь для размещения результатов компиляции проекта ?

Владимир Ситников
08.01.2017, 16:53
А как переназначить путь для размещения результатов компиляции проекта ?

Уже обсуждали, вроде, не?
http://www.owen.ru/forum/showthread.php?t=23013&page=33&p=232722&viewfull=1#post232722

Newcomer
08.01.2017, 17:01
Точно, память у меня дырявая.

Newcomer
08.01.2017, 17:37
А почему не получается поменять путь Solution location. Если вместо C:\User\user...... задать, например D:\P.... , то папка создается, а проект не открывается.

Владимир Ситников
08.01.2017, 17:53
А почему не получается поменять путь Solution location. Если вместо C:\User\user...... задать, например D:\P.... , то папка создается, а проект не открывается.

Не нужно использовать "solution project" и "language project". Возможно, я их скрою, но сейчас, вроде, нет простого способа их скрыть.
Если же выбрать что-нибудь из группы "Codesys" или "PRU", то среда в принципе не предлагает выбора для "solution location".


Папка для проекта настраивается параметром "project location" (сразу под именем проекта)

Newcomer
09.01.2017, 18:31
При компиляции проекта получаю это. Как объявить эти два блока. В списке пользовательских ФБ их нет.

Владимир Ситников
09.01.2017, 18:49
При компиляции проекта получаю это. Как объявить эти два блока. В списке пользовательских ФБ их нет.

А не нужно объявлять эти два блока.
Нужно импортировать то, что сгенерировалось в Hardella.

Какие блоки есть в пользовательских ФБ?

Newcomer
09.01.2017, 19:04
Я пытаюсь работать с проектом Step motors из Hardella. .exp файл импортировал.

Владимир Ситников
09.01.2017, 19:05
Я пытаюсь работать с проектом Step motors из Hardella.

Какие блоки есть в пользовательских ФБ?
Снимок экрана вкладки POU можно посмотреть?

Newcomer
09.01.2017, 19:10
Вот снимок.

Владимир Ситников
09.01.2017, 19:13
Вот снимок.

Значит опечатка у меня.
Пример был раньше с одним ШД, а потом я добавил второй и не обновил документацию.

По факту блоки называются SteppersConfig_Pru0MemoryTransfer, SteppersConfig_Pru0Init и т.п.
Т.е. буква s между Stepper и Config.

Newcomer
09.01.2017, 19:16
Так будет правильно ?

Владимир Ситников
09.01.2017, 19:17
Так будет правильно ?

Да, так верно.

Newcomer
09.01.2017, 19:18
Еще вопрос. Не обязательно загружать оба *.prg файла ?

Newcomer
09.01.2017, 19:21
После загрузки PRU0.prg и PRU1.prg файлы будут сохраняться при отключении питания ПЛК ?

Владимир Ситников
09.01.2017, 19:21
Еще вопрос. Не обязательно загружать оба *.prg файла ?

Если с PRU1 из основного цикла не работать, то PRU0.prg достаточно

Владимир Ситников
09.01.2017, 19:22
После загрузки PRU0.prg и PRU1.prg файлы будут сохраняться при отключении питания ПЛК ?

Да, будут.

Newcomer
09.01.2017, 19:40
Для этого нужно:

1. Загрузить файл PRU0.prg в контроллер (и PRU1.prg, если требуется) через CoDeSys меню Online > Write file to PLC

2. Перезагрузить ПЛК

Что значит Перезагрузить ПЛК ? Выключить и включить питание ПЛК ?

Владимир Ситников
09.01.2017, 19:50
Что значит Перезагрузить ПЛК ? Выключить и включить питание ПЛК ?

Да, например, так. Или загнать в watchdog.

Newcomer
11.01.2017, 11:35
Посмотрите исходник (ctrl+щелчок мыши на PRU_ABZ_ENCODER).

Не пойму где надо щелкнуть.

Владимир Ситников
11.01.2017, 11:45
Не пойму где надо щелкнуть.

А много вариантов? Щёлкать нужно PRU_ABZ_ENCODER в объявлении переменной

Вот: http://recordit.co/j4mzUpkugq

Newcomer
11.01.2017, 11:56
Ваша правда. ;)

Newcomer
11.01.2017, 12:03
А редактировать исходный текст можно ?

Владимир Ситников
11.01.2017, 12:12
А редактировать исходный текст можно ?

Ну и вопросы. Среда и предназначена для редактирования исходного кода.

Если вопрос "можно ли редактировать исходный код встроенного блока PRU_ABZ_ENCODER", то нет, встроенные блоки редактировать нельзя. Если нужно, то можно сделать копию (ctrl+c / ctrl+v) в свой проект и у себя править как нужно.

Для того, чтобы скопировать весь блок целиком, это нужно делать в дереве проекта.

Вот пример: http://recordit.co/PC04VErAID

Newcomer
11.01.2017, 12:14
Переменная position в коде что это такое ?

Владимир Ситников
11.01.2017, 12:15
"значение энкодера". Оно же "положение энкодера".

Newcomer
11.01.2017, 12:19
"значение энкодера". Оно же "положение энкодера".

А counter тогда что ?

Владимир Ситников
11.01.2017, 12:24
А counter тогда что ?

Количество обработанных импульсов.
position учитывает направление вращения энкодера, а counter нет.

Newcomer
11.01.2017, 12:28
Количество обработанных импульсов.
position учитывает направление вращения энкодера, а counter нет.

И для чего нужен counter ?

Владимир Ситников
11.01.2017, 12:33
И для чего нужен counter ?

Кому-то, может, и нужен. Общий пробег измерять или ещё что-нибудь такое.

Я думал, что "стандартный CTU" может его заменить, но нет. У стандартного CTU есть функция "автосброса значения", и от неё никак не отказаться.

Newcomer
11.01.2017, 12:48
А как сделать чтобы в position можно было писать из основной программы ?

Владимир Ситников
11.01.2017, 12:52
А как сделать чтобы в position можно было писать из основной программы ?

А зачем?

Что ожидается, если "энкодер бежит", и тут пришла команда на запись из основной программы?
Как-никак, там есть задержки на коммуникацию.

Newcomer
11.01.2017, 12:54
А зачем?

Что ожидается, если "энкодер бежит", и тут пришла команда на запись из основной программы?
Как-никак, там есть задержки на коммуникацию.

Когда энкодер стоит можно будет position обнулить.

Владимир Ситников
11.01.2017, 13:00
Когда энкодер стоит можно будет position обнулить.

Нужен пример конкретной задачи.
Вместо "обнуления position" можно же просто в основной программе сохранить текущее значение, и потом его всегда вычитать. Чем не подходит?

Какая должна быть реакция на Z метку после "ручного" обнуления?
А, если текущее значение и так равно 0? (грубо говоря, Z метка неизвестно где, энкодер ещё не двигался, система только-только запущена)

Newcomer
11.01.2017, 13:03
В буржуйских ПЛК ФБ работы с энкодером имеет море прибамбасов. Ваш ФБ хорош, но это простейший вариант обработки сигналов энкодера.

Я хочу усовершенствовать ваш код , вот и спрашиваю про то, как можно записать из основной программы в position.

Newcomer
11.01.2017, 13:06
Обычно Z метку используют для подсчета числа полных оборотов вала энкоднра. Обнулять position по приходу Z метки я думаю не надо.

Newcomer
11.01.2017, 13:07
Нужен пример конкретной задачи.
Вместо "обнуления position" можно же просто в основной программе сохранить текущее значение, и потом его всегда вычитать. Чем не подходит?

Какая должна быть реакция на Z метку после "ручного" обнуления?
А, если текущее значение и так равно 0? (грубо говоря, Z метка неизвестно где, энкодер ещё не двигался, система только-только запущена)

Когда энкодер стоит можно записать в position какое-то значение. Вал энкоднра начал вращаться, position начал уменьшаться. position стал равен нулю, на выходе ФБ установился флаг, что приехали.

Sulfur
11.01.2017, 13:13
Владимир Ситников
Доброго здравия, Владимир!
Разобрался малость с Харделлой, переписал свой проект ENCODER&COUNTER под свои хотелки. Внес кое какие изменения:
1. Переписал модуль энкодера. Убрал из него счетчик, заменил алгоритм опроса на проверенный временем и надежностью вариант.
2. В предложенном Вами варианте выходная переменная показаний энкодера выдавала четырехкратное значение разрешения энкодера. Т.е. если энкодер 360имп\об, то за один оборот показания составляли 1440. В ПЛЦ_ПРГ приходилось делать деление с отбрасыванием дробной части. В моем варианте показания соответствуют разрешению энекодера.
3. В модуле счетчика убрал перечислитель, т.к. необходимость в нем отсутствует
4. В ПРУ_0 и ПРУ_1 сделал трансляторы для непосредственного доступа к FDO1..4 из ПЛЦ_ПРГ.

На реальном железе пока не проверял, но скоро займусь этим.

Вопрос: папка проекта находится в C:\Users\%UserName%\MPSProjects\Project_xxx?
Хотел передать вам на рассмотрение и критику.

Владимир Ситников
11.01.2017, 13:24
В ПЛЦ_ПРГ приходилось делать деление с отбрасыванием дробной части
Можно отбрасывать, а можно и учитывать.
Оно же фактически позволяет повысить точность на том же самом энкодере.
Чем плохо использовать полную точность?


Вопрос: папка проекта находится в C:\Users\%UserName%\MPSProjects\Project_xxx?
Да, это оно. Здорово, что всё получается.
Не всё понял, но на конкретном проекте, думаю, будет яснее.

Возможно, стоит добавить кнопку "сохранить проект в виде zip архива".

Sulfur
11.01.2017, 14:10
Вот мой проект

Владимир Ситников
11.01.2017, 15:02
Вот мой проект

Выглядит хорошо. В принципе, задача простая и у каждого может быть своё видение "как проще".

По самому блоку энкодера правильные вопросы поднимаются: нужно ли сбрасывать значение при достижении Z метки или нет.

Newcomer
11.01.2017, 15:54
Владимир вы не можете проверить мой проект (см. вложение) ? На моем ПЛК он почему-то не работает. Выход 3 ПЛК не переключается (светодиод не загорается).

Newcomer
11.01.2017, 20:20
Владимир, чем порадуете ?

capzap
11.01.2017, 21:29
хрен поймёшь где использовалась конкретная переменная, где в неё пишут, значения, а где из неё читают.
может так, вспомнилось что то)

Владимир Ситников
11.01.2017, 21:56
может так, вспомнилось что то)
Технически, да, про переменную я неправильно сказал.

Но для POU не работает. Для POU не получается сделать "Show cross references" и узнать где вызывается.
Для типа данных -- тоже не получается. Не работает ни в окне POU (например, если переменная объявлена как enum тип), так и на определении самого enum'а нельзя сделать "Show cross references".

Перейти к объявлению POU можно, а к объявлению переменной -- нет.

Можно ли "вернуться назад" после операции "zoom (alt+enter)" -- непонятно (я не смог).

Отформатировать код можно? Тоже нет?

Sulfur
12.01.2017, 13:31
По самому блоку энкодера правильные вопросы поднимаются: нужно ли сбрасывать значение при достижении Z метки или нет.
В моем случае просто обязательно. От показаний этого энкодера работают еще 14 исполнительных устройств. Есть градус включения и градус выключения. Если не обнулять по Z, то после первого оборота вся логика работы устройств просто встанет. Позднее я предоставлю полный проект, когда он будет готов

IVM
12.01.2017, 13:33
Владимир вы не можете проверить мой проект (см. вложение) ? На моем ПЛК он почему-то не работает. Выход 3 ПЛК не переключается (светодиод не загорается).

Собирался попробовать Hardella, но прочитал сообщение от Newcomer и засомневался.

В связи с этим возникли вопросы к В.Ситникову:
1) проекты, представленные на сайте Hardella рабочие или нет ?
2) то, что вы разработали платно или нет ?

Владимир Ситников
12.01.2017, 23:14
Владимир вы не можете проверить мой проект (см. вложение) ? На моем ПЛК он почему-то не работает. Выход 3 ПЛК не переключается (светодиод не загорается).

Изменил таргет на 110-32М v2, залил в ПЛК -- работает.
Визуально оба выхода постоянно горят (ну, глазами килогерц всё равно не увидишь, поэтому так и должно быть, что визуально оно просто горит).

Вот видео из КДС: http://recordit.co/R65u4Wcdu7
Счётчик импульсов бежит, всё в порядке.

Что у вас показывает КДС в момент работы программы?

Возможно, у 110-32 и 110-30 по разному распаяны выходы. Тут уж не знаю.


PLCInfo
PLC model MODEL PLC 110-32
Binary VERSION 0.3.43
Need Target version >= 3.07
Compiled: 14:24:18 Sep 15 2015
STM32 binary version 114
MAC 6A:77:00:FF:FE:F4
IP 10.0.6.10
GATE 10.0.6.1
MASK 255.255.255.0

Владимир Ситников
12.01.2017, 23:26
В связи с этим возникли вопросы к В.Ситникову:
1) проекты, представленные на сайте Hardella рабочие или нет ?
Если следовать "духу" примеров, то да, рабочие (по крайней мере, на моём ПЛК110-32М02 работают).
Буква в букву не проверял, т.е. опечатки не исключены.


2) то, что вы разработали платно или нет ?
Бесплатно.

Но от благодарности я не откажусь.

Владимир Ситников
12.01.2017, 23:28
В моем случае просто обязательно. От показаний этого энкодера работают еще 14 исполнительных устройств. Есть градус включения и градус выключения. Если не обнулять по Z, то после первого оборота вся логика работы устройств просто встанет. Позднее я предоставлю полный проект, когда он будет готов

Может, тогда добавить счётчик "количества оборотов"?
Или ABZ энкодеры никогда не используются "более чем на 1 оборот"?

Владимир Ситников
12.01.2017, 23:39
Возможно, у 110-32 и 110-30 по разному распаяны выходы. Тут уж не знаю.

0) Из простого КДС быстрый выход нормально управляется?

1) Можно попробовать: PRU1 (посмотреть будут ли реагировать другие два fast output).

Если fast output 3 действительно не загорается, то можно попробовать так
2) Более простую программу. Например, "пример blink"
3) Спросить у ОВЕН одинаково ли управление fast output3 у 110-32М02 и 110-30М02. Возможно, на разных ПЛК выходы управляются разными битами
4) Сделать PRU программу, которая выдаст единички во все выходы PRU и посмотреть включится ли fast output.
5) Написать простую (не PRU) программу, мигающую 3-им быстрым выходом, и из памяти ПЛК считать где находится этот самый секретный бит

Sulfur
13.01.2017, 10:25
Может, тогда добавить счётчик "количества оборотов"?
Или ABZ энкодеры никогда не используются "более чем на 1 оборот"?

В моем случае совершенно бессмысленно. Экодер в процессе работы крутится постоянно, в зависимости от его показаний включаются и выключаются разные хлопушки-моргушки. Причем есть устройства который включаются например в 330*, а выключются в 45*. Т. е. устройство включается в одном цикле, а выключается в следующем.
Ну если только этот счетчик использовать как счетчик продукции. Было бы разумно, если бы качество вырабатываемй продукции было 100%. К сожалению на имеющихся машинах это не так.

Newcomer
13.01.2017, 15:56
Изменил таргет на 110-32М v2, залил в ПЛК -- работает.
Визуально оба выхода постоянно горят (ну, глазами килогерц всё равно не увидишь, поэтому так и должно быть, что визуально оно просто горит).

Вот видео из КДС: http://recordit.co/R65u4Wcdu7
Счётчик импульсов бежит, всё в порядке.

Что у вас показывает КДС в момент работы программы?

Возможно, у 110-32 и 110-30 по разному распаяны выходы. Тут уж не знаю.



Поставил самые свежие прошивку и Target для ПЛК110-30[М02]. Толку ноль.

Секунд через 5 После запуска программы рвется связь с CoDeSys. Быстрые выходы ПЛК не переключаются.

Быстрые выходы проверял, они исправны.

Владимир Ситников
13.01.2017, 16:06
Поставил самые свежие прошивку и Target для ПЛК110-30[М02]. Толку ноль.

Секунд через 5 После запуска программы рвется связь с CoDeSys. Быстрые выходы ПЛК не переключаются.

Быстрые выходы проверял, они исправны.

Если организуете удалённый доступ к ПЛК и переведёте его в режим стоп (хвала тумблеру!), то могу посмотреть что там творится.

Newcomer
13.01.2017, 16:40
Если организуете удалённый доступ к ПЛК и переведёте его в режим стоп (хвала тумблеру!), то могу посмотреть что там творится.

Залил PRU0.prg и PRU1.prg и ШД, управляемый от PRU0 закрутился.

Newcomer
13.01.2017, 16:47
Возник вопрос по безостановочному вращению вала ШД. Нет ли возможности постоянно не делать этот самый перезапуск чтобы не было кратковременного останова ШД.

STEPPER_PRU0_stepper_enable := SteppersConfig_Pru0MemoryTransfer.STEPPER_PRU0_ste pper_state <> STOP_STEPPER_RUN_STATE

Владимир Ситников
13.01.2017, 16:50
Залили PRU0.prg и PRU1.prg и ШД, управляемый от PRU0 закрутился.

Странно, но, похоже, нужно подключать debug 232 и смотреть что пишет ПЛК при запуске (ну, если интересно разобраться почему без PRU1.prg не работает).

Владимир Ситников
13.01.2017, 16:52
Возник вопрос по безостановочному вращению вала ШД. Нет ли возможности постоянно не делать этот самый перезапуск чтобы не было кратковременного останова ШД.

STEPPER_PRU0_stepper_enable := SteppersConfig_Pru0MemoryTransfer.STEPPER_PRU0_ste pper_state <> STOP_STEPPER_RUN_STATE

Вроде, обсуждали уже. Вариант указать quantity = 4294967295 подойдёт?
На скорости 10000 этого хватит на 4 суток.

Newcomer
13.01.2017, 16:52
Странно, но, похоже, нужно подключать debug 232 и смотреть что пишет ПЛК при запуске (ну, если интересно разобраться почему без PRU1.prg не работает).

А у вас без PRU1.prg работает ? Возможно я что-то не так делал и поэтому без PRU1.prg не работало. Этот момент я еще уточню.

Владимир Ситников
13.01.2017, 16:53
А у вас без PRU1.prg работает ?

Надо проверить. Не помню.

Newcomer
13.01.2017, 16:56
Вроде, обсуждали уже. Вариант указать quantity = 4294967295 подойдёт?
На скорости 10000 этого хватит на 4 суток.

У меня скорость 20 000, значит будет без остановки работать 2 суток ?

Владимир Ситников
13.01.2017, 16:59
У меня скорость 20 000, значит будет без остановки работать 2 суток ?

А, нет, 4294967295 (оно же 16#FFffFFff) при нулевом decel_ramp означает, что крутиться будет вечно.

Newcomer
13.01.2017, 17:01
А, нет, 4294967295 (оно же 16#FFffFFff) при нулевом decel_ramp означает, что крутиться будет вечно.

Замечательно. Хвала Владимиру Ситникову. ;)

Newcomer
15.01.2017, 12:43
Документ, в котором упоминается ПЛК Modicon М258 фирмы Schneider Electric. А вот ссылка на документ, в котором описаны все подробности: http://www.botekotomasyon.com/WEB/Urunlerimiz/KumandaVeKontrol/PLC/M258/IO/High%20Speed%20Counting.pdf

Возможно В.Ситников и все заинтересованные лица смогут почерпнуть что-то интересное для пополнения и совершенствования ФБ для PRU.

Newcomer
15.01.2017, 14:19
Ну и вопросы. Среда и предназначена для редактирования исходного кода.

Если вопрос "можно ли редактировать исходный код встроенного блока PRU_ABZ_ENCODER", то нет, встроенные блоки редактировать нельзя. Если нужно, то можно сделать копию (ctrl+c / ctrl+v) в свой проект и у себя править как нужно.

Для того, чтобы скопировать весь блок целиком, это нужно делать в дереве проекта.

Вот пример: http://recordit.co/PC04VErAID

Владимир, а видео помедленнее сделать можно, а то мое медленное мышление не поспевает за вашими быстрыми руками. ;)

Еще размер формы надо увеличить, иначе в некоторых местах не все попадает в изображение.

Newcomer
15.01.2017, 14:50
SteppersConfig_Pru0Init(); - эту программу достаточно вызвать один раз ?

Владимир Ситников
15.01.2017, 14:57
SteppersConfig_Pru0Init(); - эту функцию достаточно вызвать один раз ?

Да. В документации так и сказано.

Newcomer
15.01.2017, 15:06
SteppersConfig_Pru0MemoryTransfer(
STEPPER_PRU0_dir := TRUE,
STEPPER_PRU0_stepper_accel_ramp := 5000,
STEPPER_PRU0_stepper_decel_ramp := 5000,
STEPPER_PRU0_stepper_max_speed := 2000,
STEPPER_PRU0_stepper_min_speed := 0,
STEPPER_PRU0_stepper_quantity := 1000,
(*STEPPER_PRU0_stepper_enable := SteppersConfig_Pru0MemoryTransfer.STEPPER_PRU0_ste pper_state <> STOP_STEPPER_RUN_STATE*)
);

Эту программу достаточно вызвать один раз чтобы ШД отработал задание ?

Владимир Ситников
15.01.2017, 15:15
SteppersConfig_Pru0MemoryTransfer(
Эту программу достаточно вызвать один раз чтобы ШД отработал задание ?
Типа того, но enable же кто-то должен перевести в TRUE хотя бы раз?
И при этом вы не узнаете когда он закончит.

Newcomer
15.01.2017, 15:36
А можно вместо

STEPPER_PRU0_stepper_enable := SteppersConfig_Pru0MemoryTransfer.STEPPER_PRU0_ste pper_state <> STOP_STEPPER_RUN_STATE

написать

STEPPER_PRU0_stepper_enable := TRUE чтобы ШД работал без остановки ?

Владимир Ситников
15.01.2017, 15:45
STEPPER_PRU0_stepper_enable := TRUE чтобы ШД работал без остановки ?
Зависит от остальных параметров.
Для "бесконечного" режима, да, достаточно.

Если же количество импульсов конечно, то после их генерации ШД остановится и будет ждать передёргивания enable входа.

Newcomer
15.01.2017, 15:58
Типа того, но enable же кто-то должен перевести в TRUE хотя бы раз?
И при этом вы не узнаете когда он закончит.

При первом вызове SteppersConfig_Pru0MemoryTransfer() enable будет переведен в TRUE и ШД запустится.

Если ШД должен работать постоянно, то контролировать ничего не надо. Когда придет пора надо просто вызвать однократно программу SteppersConfig_Pru0MemoryTransfer() и остановить ШД, т.е. перевести enable в FALSE.

Я правильно понимаю ?

Владимир Ситников
15.01.2017, 16:10
Если ШД должен работать постоянно, то контролировать ничего не надо. Когда придет пора надо просто вызвать однократно программу и остановить ШД.

Да, так можно.

Newcomer
16.01.2017, 13:15
Сделал проект для двух ШД и одного энкодера. Скомпилировал проект в Hardella, сделал импорт .exp файла в проект CoDeSys. Как управлять драйверами ШД понятно. Не понятно как опрашивать энкодер.

Компилятор CoDeSys выдает кучу ошибок.

Владимир Ситников
16.01.2017, 13:26
Не понятно как опрашивать энкодер.

А что именно непонятно?



PROGRAM SteppersConfig_Pru0MemoryTransfer
...
VAR_OUTPUT
running : BOOL;
writeFails : DWORD;
readFails : DWORD;
STEPPER2_Enc_PRU0_encoder_counter : WORD;
STEPPER2_Enc_PRU0_encoder_position : WORD;
STEPPER2_Enc_PRU0_encoder_zeroDetected : BOOL;
STEPPER2_Enc_PRU0_stepper_state : STEPPER_RUN_STATE;
STEPPER2_Enc_PRU0_stepper_step_count : DWORD;
END_VAR
...


STEPPER2_Enc_PRU0_encoder_position это и есть текущее положение энкодера.

Иными словами, нужно вызвать программу SteppersConfig_Pru0MemoryTransfer, и после этого смотреть на значение
SteppersConfig_Pru0MemoryTransfer.STEPPER2_Enc_PRU 0_encoder_position

Newcomer
16.01.2017, 14:08
Компилятор CoDeSys выдает ошибки.

Владимир Ситников
16.01.2017, 14:11
Компилятор CoDeSys выдает ошибки.

Ищем в гугле PRU_FB_GET_PARAMETER, находим такое:

28750

Отвечает на вопрос?

Newcomer
16.01.2017, 14:15
Правильно. Я создал новый проект CoDeSys, а библиотеку не добавил.

Newcomer
16.01.2017, 15:32
Докладываю. Удалось без проблем раскрутить мощный ШД до 1350 об/мин за 2,5 сек. при хорошем крутящем моменте на валу.

Hardella рулит. ;) Спасибо Владимиру Ситникову.

Владимир Ситников
16.01.2017, 16:02
Докладываю. Удалось без проблем раскрутить мощный ШД до 1350 об/мин за 2,5 сек. при хорошем крутящем моменте на валу.

А можно видео какое-нибудь?
1350 об/мин это сколько импульсов в секунду?

Newcomer
16.01.2017, 16:29
А можно видео какое-нибудь?
1350 об/мин это сколько импульсов в секунду?

Видео к сожалению пока нет.

1350 об/мин - это 90 000 Гц на входе Step драйвера ШД.

Newcomer
17.01.2017, 11:31
На сайте Hardella написано:

Характеристики ПЛК110 М02

Работа PRU программ проверялась на ОВЕН ПЛК110 М02.
Количество PRU: 2 шт. PRU0 и PRU1
Быстрые входы 1, 2, 3 и 4 заведены на PRU0

Но в РЭ написано, что у ПЛК110-X.30[М02] и ПЛК110-X.32[М02] только 2 быстрых входа 1 и 2.

Значит быстрые входы 3 и 4 доступны только в ПЛК110-X.60[М02] ? Учтено ли это в Hardella ?

Владимир Ситников
17.01.2017, 11:59
На сайте Hardella написано:...
Значит быстрые входы 3 и 4 доступны только в ПЛК110-X.60[М02] ? Учтено ли это в Hardella ?

Хороший вопрос. Вроде, раньше в теме кто-то говорил, что при загрузке PRUx.prg в ПЛК перестают работать "два не быстрых" входа.
Может оказаться, что PRU0 подключено к двум быстрым входам и двум простым.

Думаю, надо пробовать. Честно говоря, работу входов я не проверял (на моём ПЛК, кстати, тоже только 2 fast in).

Newcomer
17.01.2017, 12:01
Хороший вопрос. Вроде, раньше в теме кто-то говорил, что при загрузке PRUx.prg в ПЛК перестают работать "два не быстрых" входа.
Может оказаться, что PRU0 подключено к двум быстрым входам и двум простым.

Думаю, надо пробовать. Честно говоря, работу входов я не проверял (на моём ПЛК, кстати, тоже только 2 fast in).

Тогда я переадресую этот вопрос специалистам "ОВЕН".

Владимир Ситников
17.01.2017, 12:04
Вот то сообщение:

Перестают управляться 2 быстрых (ПЛК-110.32) и первые 2 простых входов. 26835
Не заливать, конечно можно, но и генерировать нечем будет. Нафига тогда эти PRU предложили?

Возможно, в этих ПЛК первые два простых входа тоже распаяны на PRU. Интересно, какая предельная частота оптронов там?
Если так, то может оказаться, что за счёт PRU можно превратить 2 обычных входа в быстрые (ну, частота наверняка будет пониже, но всё таки).

Newcomer
17.01.2017, 12:08
Вот то сообщение:


Возможно, в этих ПЛК первые два простых входа тоже распаяны на PRU.

Не первые два, а возможно вторые два.

Филоненко Владислав
17.01.2017, 12:39
На всей линейке 110-хх первые 4 входа подключены к PRU. Но на некоторых моделях 2 оптрона не быстрые, а обычные.
Предел по частоте обычных оптронов не превышает 5-10 кГц.

Newcomer
17.01.2017, 13:47
На всей линейке 110-хх первые 4 входа подключены к PRU. Но на некоторых моделях 2 оптрона не быстрые, а обычные.
Предел по частоте обычных оптронов не превышает 5-10 кГц.

Получается во всей линейке 110-хх 4 первых дискретных входа доступны PRU, только входы 3 и 4 у двух моделей не быстрые.

Newcomer
17.01.2017, 13:59
To В.Ситников. Сделал из ваших стандартных ФБ проект для PRU (см.вложение). К первым двум быстрым дискретным входам ПЛК110-Х.30 подключен энкодер (фазы А и В), к четырем быстрым дискретным выходам подключены два драйвера ШД.

ШД нормально управляются, а с энкодером творится что-то непонятное. При медленном вращении вала энкодера считываемое значения принимает попеременно два состояния - 0 и 65535.

Через конфигуратор энкодер опрашивается нормально.

Newcomer
17.01.2017, 16:10
Владимир, смотрю код вашего ФБ для энкодера и не могу понять смысл некоторых конструкций.

Например, это что означает:

changedA := a <> prevA;

aSameAsB :=a = b;

Владимир Ситников
17.01.2017, 16:11
При медленном вращении вала энкодера считываемое значения принимает попеременно два состояния - 0 и 65535
Может, фазы перепутаны?

Т.е. A или B фаза подключена к "in3" и блок постоянно думает, что "достигнута Z метка и сбрасывает значение position".

Если сделать простые счётчики импульсов и считать in1, in2, in3, то оно ожидаемым образом работает?

Собственно, у Sulfur получилось и встроенный блок использовать, и свой сделать: http://www.owen.ru/forum/showthread.php?t=23013&p=233210&viewfull=1#post233210

Владимир Ситников
17.01.2017, 16:28
changedA := a <> prevA;
Это проверка того было ли изменение по фазе A.


aSameAsB :=a = b;
Это проверка того совпадают ли фазы A и B.

Ну, простое сравнение двух переменных.

Newcomer
17.01.2017, 17:37
Может, фазы перепутаны?

Т.е. A или B фаза подключена к "in3" и блок постоянно думает, что "достигнута Z метка и сбрасывает значение position".

Если сделать простые счётчики импульсов и считать in1, in2, in3, то оно ожидаемым образом работает?

Собственно, у Sulfur получилось и встроенный блок использовать, и свой сделать: http://www.owen.ru/forum/showthread.php?t=23013&p=233210&viewfull=1#post233210

Энкодер подключен к первому и второму быстрым дискретным входам ПЛК. Импульсы от энкоднра на входы приходят. Третий и четвертый входы ПЛК свободны.

Newcomer
17.01.2017, 17:42
Собственно, у Sulfur получилось и встроенный блок использовать, и свой сделать: http://www.owen.ru/forum/showthread.php?t=23013&p=233210&viewfull=1#post233210

Он там пишет, что на реальном железе не проверял. Я сейчас работаю с реальным железом.

Newcomer
17.01.2017, 17:55
Владимир, а программы в CoDeSys у меня правильно написана ? Вы мои проекты смотрели ?

Владимир Ситников
17.01.2017, 17:58
Он пишет, что на реальном железе не проверял. Я сейчас работаю с реальным железом.

Кхм, точно.

Надо сделать проект со "счётчиками импульсов" на каждом из in1, in2, in3, in4 и посмотреть какие входы работают, а какие нет.
Сделаешь? (возможно, придётся убрать блок ШД, т.к. под всё это может не хватить памяти)
У меня в ближайшее время не будет доступа к железу (а там нужно физически подавать сигналы и смотреть что в программе).

Посмотрел код обработки входов (ну, которым Hardella входы опрашивает) -- выглядит верно.

Владимир Ситников
17.01.2017, 17:59
Владимир, а программы в CoDeSys у меня правильно написана ? Вы мои проекты смотрели ?

Да, КДС программа нормальная. Там и ошибиться-то негде.

Newcomer
17.01.2017, 18:16
Я сейчас сделал свой дубовый ФБ для энкодера. Посмотрите пожалуйста.

Владимир Ситников
17.01.2017, 18:18
Я сейчас сделал свой дубовый ФБ для энкодера. Посмотрите пожалуйста.

Там в чём вопрос? На что смотреть?

Newcomer
17.01.2017, 18:26
Сам проект корректно сделан ?

Владимир Ситников
17.01.2017, 18:51
Сам проект корректно сделан ?

Да, блок работает (мои тесты энкодера он проходит), но у вас A и B фазы перепутаны относительно моего блока.

Newcomer
17.01.2017, 19:10
Да, блок работает (мои тесты энкодера он проходит), но у вас A и B фазы перепутаны относительно моего блока.

Перестановка фаз роли не играет. При подключении энкодера концы всегда можно поменять местами.

Владимир Ситников
17.01.2017, 19:12
Перестановка фаз роли не играет. При подключении энкодера концы всегда можно поменять местами.

Для тестов -- играет. Тест подаёт заранее заложенные сигналы на входы A и B, и проверяет значение на выходе энкодера.

Newcomer
17.01.2017, 19:19
Завтра напишу что получилось.

Newcomer
18.01.2017, 12:36
С моим дубовым ФБ опроса энкоднра ситуация такая. ШД нормально управляются, а при медленном вращении вала энкодера считываемое значения (position) принимает попеременно два состояния - 0 и 1. Фазы А и В энкодера подключены к 1 и 2 быстрым дискретным входам ПЛК.

Код ФБ опроса энкодера прилагаю.

Владимир Ситников
18.01.2017, 12:49
С моим дубовым ФБ опроса энкоднра ситуация такая
Как я и говорил, надо сделать 4 счётчика и посмотреть какие из них будут считать, а какие нет.

Возможно, физическая распайка не соответствует документации.

Sulfur
18.01.2017, 12:55
Владимир Ситников
Начал испытания в железе на столе. Обнаружил проблему с обменом.
Когда обращаюсь так:

Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;(*Показания энекодера*)
имею пустые данные, т. е. обмена нет. Как со входными, так и с выходными данными.
Когда обращаюсь так:

ENCODER_AND_COUNTER_Pru0MemoryTransfer(
PRU_ENCOER_COUNTER_DO3:=FDO3 , (*Прямое управление выходом FDO3*)
PRU_ENCOER_COUNTER_DO4:=FDO4 , (*Прямое управление выходом FDO4*)
PRU_ENCOER_COUNTER_count_Enable:=RunTransport ,(*Запуск транспорта*)
PRU_ENCOER_COUNTER_count_Lenght:= Lenght ,(*Пройденный путь*)
running=> ,
writeFails=> ,
readFails=> ,
PRU_ENCOER_COUNTER_Enc_Position=>Enc ,(*Показания энкодера*)
PRU_ENCOER_COUNTER_Enc_ZeroDetect=>ZeroDetect ,(*Обнаружение машинного нуля*)
PRU_ENCOER_COUNTER_count_Path=>Path );(*Пройденный путь транспорта*)
То проблем нет, всё работает нормально.
В обоих случаях компиляция происходит без ошибок и предупреждений.
Вполне допускаю, что напутал с синтаксисом в первом случае.

Newcomer
18.01.2017, 13:05
Так работает

PRU_ENCOER_COUNTER_Enc_Position=>Enc ,(*Показания энкодера*)

а так не работает

Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;(*Показания энкодера*)

capzap
18.01.2017, 13:12
Владимир Ситников
Начал испытания в железе на столе. Обнаружил проблему с обменом.
Когда обращаюсь так:

Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;(*Показания энекодера*)
имею пустые данные, т. е. обмена нет. Как со входными, так и с выходными данными.
Когда обращаюсь так:

ENCODER_AND_COUNTER_Pru0MemoryTransfer(
PRU_ENCOER_COUNTER_DO3:=FDO3 , (*Прямое управление выходом FDO3*)
PRU_ENCOER_COUNTER_DO4:=FDO4 , (*Прямое управление выходом FDO4*)
PRU_ENCOER_COUNTER_count_Enable:=RunTransport ,(*Запуск транспорта*)
PRU_ENCOER_COUNTER_count_Lenght:= Lenght ,(*Пройденный путь*)
running=> ,
writeFails=> ,
readFails=> ,
PRU_ENCOER_COUNTER_Enc_Position=>Enc ,(*Показания энкодера*)
PRU_ENCOER_COUNTER_Enc_ZeroDetect=>ZeroDetect ,(*Обнаружение машинного нуля*)
PRU_ENCOER_COUNTER_count_Path=>Path );(*Пройденный путь транспорта*)
То проблем нет, всё работает нормально.
В обоих случаях компиляция происходит без ошибок и предупреждений.
Вполне допускаю, что напутал с синтаксисом в первом случае.

наверное в первом случае просто присваиваете одной переменной выход ПОУ, а во втором выполняете ПОУ

Владимир Ситников
18.01.2017, 13:16
наверное в первом случае просто присваиваете одной переменной выход ПОУ, а во втором выполняете ПОУ

Да, верно. Переменные обновляются только после вызова. Сами по себе, разумеется, не обновляются.

Т.е. такой вариант должен работать:


ENCODER_AND_COUNTER_Pru0MemoryTransfer(
...
);
Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;

Newcomer
18.01.2017, 13:19
Получается в первом случае обмена с PRU0 нет поэтому состояние position и не меняется.

Newcomer
18.01.2017, 13:23
Да, верно. Переменные обновляются только после вызова. Сами по себе, разумеется, не обновляются.

Т.е. такой вариант должен работать:

ENCODER_AND_COUNTER_Pru0MemoryTransfer(
...
);
Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;

Владимир, а у меня та же самая история ?

Так не работает.

SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);
ENC := SteppersConfig_Pru0MemoryTransfer.STEPPER2_Enc_PRU 0_encoder_position;


Если сделать так, то энкодер будет опрашиваться ?

SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_encoder_position => ENC,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);

Владимир Ситников
18.01.2017, 13:34
Если сделать так, то энкодер будет опрашиваться ?
По-моему, это эквивалентные варианты записи и работать они должны одинаково.

Если работают по-разному, значит я чего-то не понимаю в ST (что не исключено).

Newcomer
18.01.2017, 13:36
А разве у Sulfur не та же самая проблема была что и у меня ?

Ведь PRU-программа работает автономно, ее не обязательно постоянно вызывать.

Если так обратиться, то можно получить текущее значение Position

Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;

Почему же это не работает ?

Владимир Ситников
18.01.2017, 13:47
А разве у Sulfur не та же самая проблема была что и у меня ?

Ведь PRU-программа работает автономно, ее не обязательно вызывать.

Если так обратиться, то можно получить текущее значение Position

Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;

Почему же это не работает ?

Ещё раз: вызов ENCODER_AND_COUNTER_Pru0MemoryTransfer() осуществляет обмен данными.
Если не вызывать, то никаого обмена не будет, и никакие переменные обновляться не будут.

Если просто читать ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_ENCOER_ COUNTER_Enc_Position и ничего больше не делать, то значение будет одним и тем же.

Тем не менее, в сообщении 485 (http://www.owen.ru/forum/showthread.php?t=23013&p=233742&viewfull=1#post233742) код похож на правильный:


SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);

SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := TRUE,
STEPPER1_PRU1_stepper_accel_ramp := 10,
STEPPER1_PRU1_stepper_decel_ramp := 10,
STEPPER1_PRU1_stepper_max_speed := 300,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 100000,
STEPPER1_PRU1_stepper_enable := TRUE
);

ENC := SteppersConfig_Pru0MemoryTransfer.STEPPER2_Enc_PRU 0_encoder_position;


Т.е. сначала Pru0MemoryTransfer, затем чтение STEPPER2_Enc_PRU0_encoder_position. Выглядит верно.

Sulfur
18.01.2017, 13:48
Да, верно. Переменные обновляются только после вызова. Сами по себе, разумеется, не обновляются.

Т.е. такой вариант должен работать:


ENCODER_AND_COUNTER_Pru0MemoryTransfer(
...
);
Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;

Насколько я понял, нужно в начале цикла ПЛЦ_ПРГ сделать вызов ПРУ-ПОУ (ENCODER_AND_COUNTER_Pru0MemoryTransfer в моем случае) с пустыми параметрами, и после этого должно заработать непосредственное обращение к любой переменной ПРУ-ПОУ?

В принципе, то, как сейчас работает устраивает. Однако для большей понятности программы (в первую очередь для себя, ибо "с памятью моей что-то стало") хотелось бы иметь возможность обращаться к нужным переменным обмена из любого места ПЛЦ-ПРГ.

Newcomer
18.01.2017, 13:50
Вариант 1

SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_encoder_position => ENC,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);

Вариант 2

SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);

ENC := SteppersConfig_Pru0MemoryTransfer.STEPPER2_Enc_PRU 0_encoder_position;


Оба варианта кода правильные ?

Владимир Ситников
18.01.2017, 13:53
Насколько я понял, нужно в начале цикла ПЛЦ_ПРГ сделать вызов ПРУ-ПОУ (ENCODER_AND_COUNTER_Pru0MemoryTransfer в моем случае) с пустыми параметрами, и после этого должно заработать непосредственное обращение к любой переменной ПРУ-ПОУ?

Да, можно так.




В принципе, то, как сейчас работает устраивает. Однако для большей понятности программы (в первую очередь для себя, ибо "с памятью моей что-то стало") хотелось бы иметь возможность обращаться к нужным переменным обмена из любого места ПЛЦ-ПРГ.
Как вариант, можно добавить в начало и в конец вызовы MemoryTransfer без параметров (как бы для чтения и для записи).
А между делом (в любом месте программы обращаться к ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_ENCOER_ COUNTER_Enc_Position и подобным)

Так устраивает? Или я чего-то не понял?

Владимир Ситников
18.01.2017, 13:54
Оба варианта кода правильные ?

Да, оба варианта правильные, как я и говорил в 509 (http://www.owen.ru/forum/showthread.php?t=23013&page=51&p=233864&viewfull=1#post233864)