Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Mitsubishi Electric. Контроллеры, преобразователи частоты, HMI _ Программирование _ Вопросы новичка

Автор: Waldislaw 7.10.2020 - 15:12

Только начал изучать ПЛК, у меня FX3G GXwork2 полностью в ST тк раньше сидел только в урезанном СИ микроконтроллеров. Вопросы которые я не смог понять/найти за эту неделю:
- как вызвать программный блок из основной программы, например на рисунке из POU_01 вызвать inte и вернуться;
- как перемещаться в одной программе по меткам (Goto);
- задать время повторения программы (цикл контроллера);
- управлять быстрыми выходами (выдать пачку импульсов за время меньшее чем цикл контроллера).
Задача минимум управлять 5-ю осями с серваками step/dir, линейная интерполяция по 2-м из них с точностью 0.1мм, без доп модулей это вполне возможно.

 

Автор: Sergei Troizky 8.10.2020 - 03:13

Если только начал изучать ПЛК, настоятельно рекомендую Ladder, а не ST.
Ladder лучше визуализирует логику и лучше для понимания общих принципов и инструкций ПЛК.
В ST, возможно, привычнее выглядят массивные вычисления, но ПЛК- это все же Программируемый ЛОГИЧЕСКИЙ Контроллер.
Спорить или переубеждать, однако, не стану. Имеющий уши да услышит.

Читаете ли Вы Руководство по программированию?
Судя по вопросам, нет. Читайте его.

"- задать время повторения программы (цикл контроллера)."
Программа непрерывно выполняется циклически, если контроллер не остановлен вручную либо по фатальной ошибке выполнения программы.
Выполнение кода программы занимает столько времени, сколько потребуется, и это время может (и в большинстве случаев будет) изменяться от цикла к циклу. Оно не может быть жестко задано либо ограничено извне.
Однако, в настройках контроллера можно задать минимальное время цикла. Именно минимальное, хотя это может называться constant scantime: если программа не уложится в это время, оно будет превышено.

Автор: Waldislaw 8.10.2020 - 10:55

Цитата(Sergei Troizky @ 8.10.2020 - 03:13) *
Если только начал изучать ПЛК, настоятельно рекомендую Ladder, а не ST.
Ladder лучше визуализирует логику и лучше для понимания общих принципов и инструкций ПЛК.
В ST, возможно, привычнее выглядят массивные вычисления, но ПЛК- это все же Программируемый ЛОГИЧЕСКИЙ Контроллер.
Спорить или переубеждать, однако, не стану. Имеющий уши да услышит.

Читаете ли Вы Руководство по программированию?
Судя по вопросам, нет. Читайте его.

"- задать время повторения программы (цикл контроллера)."
Программа непрерывно выполняется циклически, если контроллер не остановлен вручную либо по фатальной ошибке выполнения программы.
Выполнение кода программы занимает столько времени, сколько потребуется, и это время может (и в большинстве случаев будет) изменяться от цикла к циклу. Оно не может быть жестко задано либо ограничено извне.
Однако, в настройках контроллера можно задать минимальное время цикла. Именно минимальное, хотя это может называться constant scantime: если программа не уложится в это время, оно будет превышено.

Помоему столько языков в ПЛК что каждый может выбрать своё. Я уже накидал интерполяцию для 3-х осей, благо точность особо не нужна.
Я искал как из одной программы вызвать другую, и не нашел. Какой операнд? В первой программе вычисления происходят (видимо основная), во второй ничего не меняется.
Цикл моего контроллера 0,0005сек. Я просто сделал инкремент переменной и если она была равна 10000 то сбрасывал её и инвертировал выход Y0. Итого он инвертировался раз в 5 сек. Я так не смог найти где изменяется это значение.
Если есть возможноть, можете скинуть ссылку на руководство по st, желательно на русском вайл их нур дойч шпрехе

Автор: kaii 8.10.2020 - 16:12

Цитата(Waldislaw @ 7.10.2020 - 16:12) *
- как перемещаться в одной программе по меткам (Goto);
- задать время повторения программы (цикл контроллера);
- управлять быстрыми выходами (выдать пачку импульсов за время меньшее чем цикл контроллера).

Есть же инструкция CJ для прыжка к тому шагу программы который надо, хотя лучше CJP, а то все время будет скипать часть программы.
Зачем цикл задавать? Можно конечно через D8039, но зачем замедлять? Есть же системные маркера M8011-M8014 если отсчет по времени делать.
Быстрыми выходами эт шоль операция PLSY? До 200000 герц спец выход може выдать. И ткнуть ему тоже можно сколько надо испульсов. И флаги завершения есть и прочее.
http://www.esspb.ru/Documents/FX_manual.pdf то почитайте. Есть некоторые ошибочные места или переведено немного не так как на самом деле, но много нового откроете для себя.

Автор: Sergei Troizky 8.10.2020 - 17:42

https://www.consys.ru/documentation/GX_Works2_пposobie_2012_А_Ru.pdf

Автор: Waldislaw 9.10.2020 - 12:36

Цитата(kaii @ 8.10.2020 - 16:12) *
Цитата(Waldislaw @ 7.10.2020 - 16:12) *
- как перемещаться в одной программе по меткам (Goto);
- задать время повторения программы (цикл контроллера);
- управлять быстрыми выходами (выдать пачку импульсов за время меньшее чем цикл контроллера).

Есть же инструкция CJ для прыжка к тому шагу программы который надо, хотя лучше CJP, а то все время будет скипать часть программы.
Зачем цикл задавать? Можно конечно через D8039, но зачем замедлять? Есть же системные маркера M8011-M8014 если отсчет по времени делать.
Быстрыми выходами эт шоль операция PLSY? До 200000 герц спец выход може выдать. И ткнуть ему тоже можно сколько надо испульсов. И флаги завершения есть и прочее.
http://www.esspb.ru/Documents/FX_manual.pdf то почитайте. Есть некоторые ошибочные места или переведено немного не так как на самом деле, но много нового откроете для себя.

ST команды CJ и CJP не распознаёт. За мануал спасибо. PLSY то что нужно. В принципе я уже могу делать интерпляцию, но для более комфортной работы можно еще пару опросов.
Я могу делать отдельную программу и вызывать ее когда хочу? Можно ли в ST в пределах одной программы или функции перемещаться по меткам (типа Goto в бэйсике или Си)? Ну и последний вопрос: Как задать время повторения программы(время цикла программы)?
Спасибо зарание!!! Большое спасибо!

Автор: Sergei Troizky 9.10.2020 - 16:20

Цитата(Waldislaw @ 9.10.2020 - 12:36) *
ST команды CJ и CJP не распознаёт.

Ну вот вам и первый привет от языка ST.
Нет в нем прыжков по меткам типа Goto/Jump.

Цитата(Waldislaw @ 9.10.2020 - 12:36) *
Я могу делать отдельную программу и вызывать ее когда хочу?

В ST это делается путем создания функционального блока и обращения к нему по мере необходимости.

Автор: Waldislaw 10.10.2020 - 14:27

Цитата(Sergei Troizky @ 9.10.2020 - 16:20) *
Цитата(Waldislaw @ 9.10.2020 - 12:36) *
ST команды CJ и CJP не распознаёт.

Ну вот вам и первый привет от языка ST.
Нет в нем прыжков по меткам типа Goto/Jump.

Цитата(Waldislaw @ 9.10.2020 - 12:36) *
Я могу делать отдельную программу и вызывать ее когда хочу?

В ST это делается путем создания функционального блока и обращения к нему по мере необходимости.


Я скачал 6 мануалов по запросу GX Works2 manual и там нет ни слова о том как создавать экземпляр функциональго блока и вызывать его. Еклмн в общих словах, а если не в общих, то в SFC. Я сдаюсь. Как использовать функциональный блок в программе на ST? И сразу попутно, может ли функциональный блок использовать глобальные переменные.

Автор: ivgtrk 19.11.2020 - 13:50

Цитата(Waldislaw @ 7.10.2020 - 19:12) *
- как вызвать программный блок из основной программы, например на рисунке из POU_01 вызвать inte и вернуться;


Никак, т.к. блок POU_01 и inte сами по себе являются программами (POU). Они выполняются, если включены в пул задач (в данном случае это Program Setting -> Execution Program).
Для вызова определенных частей/блоков принято использовать функциональные блоки (FB).

Автор: ivgtrk 19.11.2020 - 14:07

Цитата(Waldislaw @ 10.10.2020 - 18:27) *
Я скачал 6 мануалов по запросу GX Works2 manual и там нет ни слова о том как создавать экземпляр функциональго блока и вызывать его. Еклмн в общих словах, а если не в общих, то в SFC. Я сдаюсь. Как использовать функциональный блок в программе на ST? И сразу попутно, может ли функциональный блок использовать глобальные переменные.


В программе на ST объявляете локальную переменную с типом нужного ФБ.


В программе вызываете блок и подключаете к нему формальные параметры:
Имя_Функц_блока ( TRUE, вх_парам1, вх_парам2, вых_парам );
Входные и выходные параметры в соответствии с их типами самого ФБ (разумеется). Они могут быть как локальными, так и глобальными.

Автор: Waldislaw 11.02.2021 - 12:52

Добрый день! Вопрос.
Делаю позиционирование на FX3GA-60MT.

IF M8002 THEN
dmov(TRUE,2000,D8146); (*максимальная скорость*)
mov (TRUE,k1000,D8148); (*время разгона мсек*)
mov (TRUE,k10,D8145); (*приращение скорости, что это такое?
какие только числа не ставил 0,10,100,10000 - без изменений ?????*)
M8147:=1;
END_IF;

DRVI(M8147,2000,1000,Y0,Y4);

Подключил к Y0 динамик, есть равномерный свист 2 секунды и все. Хотя я установил разгон/замедление 1000 мсек, слышно что их нет, т.е. свист без изменения частоты.Пробовал ставить DRVA - также.
И сразу попутно второй вопрос, как пользоваться в ST таймерами?

Автор: kaii 12.02.2021 - 19:43

Сперва откуда надыбали FX3GA? Я чет мануал не могу найти, лишь рекламную брошюрку мицубиши, которая лишь на сайте "заплати, получи".
По какому мануалу нашли что нужны D8146, D8148, D8145? В том что я нашел для FX3G совсем другие ячейки.
"как пользоваться в ST таймерами" - страдать.

Автор: Sergei Troizky 17.02.2021 - 18:52

https://we.tl/t-XWFj5Hw73l
Читайте раздел 7.9
Для позиционирования с разгоном/торможением используйте PLSR.

Автор: kaii 17.02.2021 - 19:53

Цитата(Sergei Troizky @ 17.02.2021 - 19:52) *
https://we.tl/t-XWFj5Hw73l
Читайте раздел 7.9
Для позиционирования с разгоном/торможением используйте PLSR.

Т.е. вас не смущает маленькая такая приписочка в самом начале раздела, что это руководство для позиционирования и примеры в нём ТОЛЬКО для контроллеров FX1N, FX1S? И то что в этой же приписке написано что нужно читать другое руководство для FX3U, FX3G, и оно, скорее всего, на русский не переведено.

Автор: Sergei Troizky 17.02.2021 - 21:55

Cмущает.

Вот для FX3 на английском, если кому нужно:
http://dl.mitsubishielectric.com/dl/fa/document/manual/plc_fx/jy997d16801/jy997d16801k.pdf


Автор: Waldislaw110 2.03.2021 - 23:44

Цитата(kaii @ 12.02.2021 - 19:43) *
Сперва откуда надыбали FX3GA? Я чет мануал не могу найти, лишь рекламную брошюрку мицубиши, которая лишь на сайте "заплати, получи".
По какому мануалу нашли что нужны D8146, D8148, D8145? В том что я нашел для FX3G совсем другие ячейки.
"как пользоваться в ST таймерами" - страдать.

Пришли они с двумя китайскими линиями автоматической нарезки трубы. Шел брак, скорости нет. В общем решили производственники его переделать. Делают одно - мне надо обманку на пару датчиков делать. Делают второе, у меня уже сопля на сопле из ардуинок. А потом вместо толкателя на серве захотели поставить роликовый узел. Я сказал, стопэ это уже пипец, а не станок. Еще подтупливал один контроллер. Сначала я хотел переделать программу ПЛК, но HMI была китайская, я ничего не нашел на нее (нужно было добавить количества задаваемых длин реза). Я плюнул, накидал плат Sprint-Layout60_rus и сделал из Arduino Mega Плк. На Arduino Nano сделал HMI (6 экранов по 8х7-сегм _ клава мембранная). Линию остановили на полную переделку и я за 3 месяца накидал программу. Больше мучался с экраном (вывод меню, редактирование параметров) чем с самой программой управления, ещё мучал разгон, т.к. ардуинка нифига с задачей не справлялась, пришлось городить предварительный расчёт таблицы разгона, потом вычищал баги. Я подумывал вернуть Митсубы в линию, но встретил непонятный гемор с языком ST. Отложил. Начальство увидев мои порывы, решило сварганить сварочный ЧПУ. Сначала 3-х осный, потом и до 6-ти осного додумали. Я, посмотрев мануалы, увидел что FX в принципе спокойно может решить эти проблемы. Мне сказали посчитать стоимость пяти серв, я спросил про моменты, мне сказали бери с запасом. Каким запасом я не понял поэтому посчитал китайские сервы 1кВт с редукторами для передачи шестерня-рейка, вышло полляма, поэтому пыл начальства поутих и слава богу. Из линии выжали кстати с 400 распилов в час до 1200, брак вообще исчез. Кстати ПЛК не тупил, тупил датчик обнуления. Он вообще оптический щелевой с IP20, а на станке на него СОЖ льётся. Короче расходник.
Мануал кстати 154315, Серия Melsec FX программируемые логические контроллеры руководство по программированию.

Автор: Waldislaw110 2.03.2021 - 23:50

Цитата(Sergei Troizky @ 17.02.2021 - 18:52) *
https://we.tl/t-XWFj5Hw73l
Читайте раздел 7.9
Для позиционирования с разгоном/торможением используйте PLSR.

Я читал раздел 7.9. И написал вам пример, который не работает, хотя составлен он по примеру из раздела 7.9.
PLSR вообще из раздела 6.7.9, это просто выдача пачки импульсов без разгона и торможения.

Автор: Waldislaw110 3.03.2021 - 00:13

Вообще странноватый этот ST.
Например нельзя к Word[unsigned] прибавить 2, несоответствие типов. Хотя в мануале явно прописано что это число от 0 до 65535. Ну фиг с ним. Буду пользоваться Word signed.
А вот чтобы считать таймера мне надо к dword прибавить D8010 (время цикла) и я не могу второй день найти преобразование из word в dword. dbl - редактор не находит и пишет ошибку. Хотя другие инструкции (типа mov,set) идут.
Пока искал нашел DBON. Что это такое? Ни в одном мануале и хэлпе нет такой инструкции. А редактор мне её предлагает.
Кстати по таймерам
MOV(X0,k10,T0);
компилится
а вот с добавкой
IF LDF(TO) THEN Y1:=1; END_IF;
уже parser error (хотя запись LDF предлагает сам редактор).

Автор: Waldislaw110 3.03.2021 - 00:17

И ещё я пытался восстановить свой пароль на форуме, ввожу почту, капчу. Пишет выслано, проверяю - нету. Проверил все спамы, корзины, фильтры. Ничего нет. Зарегистрировался на другой ящик - снова таже история, нет письма. Сегодня я дорвался до ноута и почты жены и зарегился через неё. До этого не мог - гипс мешал.

Автор: Sergei Troizky 3.03.2021 - 04:19

Цитата(Waldislaw110 @ 2.03.2021 - 23:50) *
Цитата(Sergei Troizky @ 17.02.2021 - 18:52) *
https://we.tl/t-XWFj5Hw73l
Читайте раздел 7.9
Для позиционирования с разгоном/торможением используйте PLSR.

Я читал раздел 7.9. И написал вам пример, который не работает, хотя составлен он по примеру из раздела 7.9.
PLSR вообще из раздела 6.7.9, это просто выдача пачки импульсов без разгона и торможения.

Из пары последовавших за этим постов следовал вывод, что этот мануал не для FX3.
А в FX1/FX2, PLSR именно с разгоном и торможением.

Автор: Sergei Troizky 3.03.2021 - 04:28

Цитата(Waldislaw110 @ 3.03.2021 - 00:13) *
Пока искал нашел DBON. Что это такое? Ни в одном мануале и хэлпе нет такой инструкции. А редактор мне её предлагает.

Так-таки ни в одном?

 

Автор: Waldislaw110 3.03.2021 - 14:22

Цитата(Sergei Troizky @ 3.03.2021 - 04:28) *
Цитата(Waldislaw110 @ 3.03.2021 - 00:13) *
Пока искал нашел DBON. Что это такое? Ни в одном мануале и хэлпе нет такой инструкции. А редактор мне её предлагает.

Так-таки ни в одном?

Ха-ха, я снёс свой pdf viewer, открыл в опере и всё нашёл.

Автор: masvel12 3.03.2021 - 21:08

Цитата(Waldislaw110 @ 3.03.2021 - 01:17) *
И ещё я пытался восстановить свой пароль на форуме, ввожу почту, капчу. Пишет выслано, проверяю - нету. Проверил все спамы, корзины, фильтры. Ничего нет. Зарегистрировался на другой ящик - снова таже история, нет письма. Сегодня я дорвался до ноута и почты жены и зарегился через неё. До этого не мог - гипс мешал.

Было и у меня такое со второго раза зарегился))

Автор: masvel12 3.03.2021 - 21:24

Цитата(Waldislaw110 @ 3.03.2021 - 01:13) *
Вообще странноватый этот ST.
Например нельзя к Word[unsigned] прибавить 2, несоответствие типов. Хотя в мануале явно прописано что это число от 0 до 65535. Ну фиг с ним. Буду пользоваться Word signed.
А вот чтобы считать таймера мне надо к dword прибавить D8010 (время цикла) и я не могу второй день найти преобразование из word в dword. dbl - редактор не находит и пишет ошибку. Хотя другие инструкции (типа mov,set) идут.
Пока искал нашел DBON. Что это такое? Ни в одном мануале и хэлпе нет такой инструкции. А редактор мне её предлагает.
Кстати по таймерам
MOV(X0,k10,T0);
компилится
а вот с добавкой
IF LDF(TO) THEN Y1:=1; END_IF;
уже parser error (хотя запись LDF предлагает сам редактор).

по поводу языка сам начал недавно изучать этот контроллер и писать на него проги ,но на ST мало примеров да и траблы с ним поэтому программлю на ladder rolleyes.gif Вот ссылка на мой канал https://www.youtube.com/watch?v=hplcJnvB7_w там есть видео, где я использую один модуль позиционирования и с одной осью и сервоприводом. Для вашей задачи с несколькими сервоприводами лучше обратиться в тех.поддержку там ребята адекватные.
У них видео серию Q есть )) эта ссылка на канал ихней https://www.youtube.com/channel/UCLNVjs_O-VsX6b4nIcxZdYA/search?query=Q%20postion

Либо посмотреть вот такое видео https://www.youtube.com/watch?v=VFTqTracNrw там несколько сервоприводов по сети SSNET настраиваются

вот такие дела rolleyes.gif

Автор: Waldislaw110 6.03.2021 - 23:43

Цитата(masvel12 @ 3.03.2021 - 21:08) *
Цитата(Waldislaw110 @ 3.03.2021 - 01:17) *
И ещё я пытался восстановить свой пароль на форуме, ввожу почту, капчу. Пишет выслано, проверяю - нету. Проверил все спамы, корзины, фильтры. Ничего нет. Зарегистрировался на другой ящик - снова таже история, нет письма. Сегодня я дорвался до ноута и почты жены и зарегился через неё. До этого не мог - гипс мешал.

Было и у меня такое со второго раза зарегился))

Я раз двадцать пытался.

Автор: Smith2007 14.09.2021 - 09:04

Впервые встретился с ПЛК FX1N.
К ПЛК подключена панель оператора OP320
Делаю первые шаги в освоении этого чуда.

Написал простейшую программу.
После перепрошивки, при включении ПЛК регистрам сразу назначаются указанные в условиях значения.
Такое ощущение, что на первом цикле условия не проверяются и выполняются все инструкции.
Думал что это связано с панелью оператора.
Нет. Отключаю ее и получаю тот же результат.
При этом в дальнейшем, код работает верно. Т.е. если в процессе работы регистры обнулить то условия работают верно.

Код
IF M8002=1 THEN
    M0 := 0;
    M3 := 0;
END_IF;

IF M0 THEN
    D132 := 1;
END_IF;

IF M3 THEN
    D168 := 100;
END_IF;


Подскажите пожалуйста, в какую сторону копать?


зы. На панели оператора 2 кнопки связаны с маркерами M0, M3. Тип "Revers".

Автор: Sergei Troizky 14.09.2021 - 15:27

Копайте в сторону Ladder-а.
И поверьте, это благой совет.
Нечего ST делать в этом классе ПЛК.

Автор: Smith2007 14.09.2021 - 17:28

Цитата(Sergei Troizky @ 14.09.2021 - 16:27) *
Копайте в сторону Ladder-а.
И поверьте, это благой совет.
Нечего ST делать в этом классе ПЛК.


Ladder не знаком совсем. Даже его логика мне совсем понятна.
У меня есть опыт С/С++ для микроконтроллеров, и ST чем-то очень отдаленно на него похож. Хотелось понять, что же я делаю не так.
Это же элементарные инструкции.
Этот же код на ПЛК Овен в среде Codesys прекрасно работает.
Подозреваю, что до начала выполнения программы, нужно что-то сделать еще, но не пойму что и как.


Автор: kaii 14.09.2021 - 18:51

Тут надо начать с того, что у вас оригинальный FX1N (который очень сложно найти уже) или китайская подделка с алиэкспреса?
По https://dl.mitsubishielectric.com/dl/fa/document/manual/plc_fx/jy997d34801/jy997d34801k.pdf, все делаете правильно, только пробелов не ставят.

Автор: Sergei Troizky 14.09.2021 - 21:45

Цитата(Smith2007 @ 14.09.2021 - 09:04) *
После перепрошивки, при включении ПЛК регистрам сразу назначаются указанные в условиях значения.
Такое ощущение, что на первом цикле условия не проверяются и выполняются все инструкции.
Думал что это связано с панелью оператора.
Нет. Отключаю ее и получаю тот же результат.
При этом в дальнейшем, код работает верно. Т.е. если в процессе работы регистры обнулить то условия работают верно.

Похоже, Вы просто не учитываете, что программа непрерывно выполняется циклически,
а наблюдаете Вы результат не первого прохода, а последнего законченного.
В первом проходе (скане) все указанное происходит, но результат мониторится лишь один скан (миллисекунды).
Его не увидеть глазом, но при желании можно зафиксировать в конце первого скана во вспомогательных регистрах.

Автор: Sergei Troizky 14.09.2021 - 21:47

Цитата(kaii @ 14.09.2021 - 18:51) *
Тут надо начать с того, что у вас оригинальный FX1N (который очень сложно найти уже) или китайская подделка с алиэкспреса?
По https://dl.mitsubishielectric.com/dl/fa/document/manual/plc_fx/jy997d34801/jy997d34801k.pdf, все делаете правильно, только пробелов не ставят.

А что, в китайском другая прошивка?

Автор: Smith2007 14.09.2021 - 22:26

Цитата(kaii @ 14.09.2021 - 19:51) *
Тут надо начать с того, что у вас оригинальный FX1N (который очень сложно найти уже) или китайская подделка с алиэкспреса?
все делаете правильно, только пробелов не ставят.


Покупал на Али для организации управления одним шаговым двигателем.
Из описания было указано, что на выходе Y0 можно получить стабильную частоту до 100 кГц.
Так оно и есть.
С подтяжкой к +24В получил вполне приемлемый сигнал на выходе.
До 100 кГц форма почти не меняется. При частотах до 20 кГц почти прямоугольник
Мне же достаточно 20 кГц.


Про пробелы не понял...

Автор: Smith2007 14.09.2021 - 22:41

Цитата(Sergei Troizky @ 14.09.2021 - 22:45) *
Похоже, Вы просто не учитываете, что программа непрерывно выполняется циклически,
а наблюдаете Вы результат не первого прохода, а последнего законченного.
В первом проходе (скане) все указанное происходит, но результат мониторится лишь один скан (миллисекунды).
Его не увидеть глазом, но при желании можно зафиксировать в конце первого скана во вспомогательных регистрах.


Сергей, я имею некоторый опыт программирования МК в среде RTOS и совсем немного в программировании ПЛК в среде Codesys (ST).
Эти моменты я прекрасно понимаю.
Следующий код работает верно. В том числе все IF, CASE ...
Больше времени ушло на исследование работы функций DDRVA/DDRVI (управление ШД)
Управление с панели оператора OP320 (тоже китайской сборки)

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

Код простейший
IF M0 THEN
.... пересчет;
END_IF;

Но пересчет выполняется при каждом старте, не зависимо от того какое условие.
Даже если
M0 := 0;
перед условием поставить.
Подозреваю, что при старте что-то может нужно еще инициализировать.
Пробовал задержку по таймеру выставить перед выполнением кода - не помогло.
Просто какая-то магия.


Код
(****************************************************************************
***************
Входы/Выходы
X0 - Сигнал датчику нуля оси Z
Y0 - STEP. Выход на драйвер ШД
Y4 - DIR. Выход на драйвер ШД

Регистры
M0            Bit                Запускает/останавливает движение по заданным координатам
M1            Bit                Ручное движение вверх
M2            Bit                Ручное движение вниз
M3            Bit                Режим скорости ручного перемещения (0 - медленно S1, 1 - быстро S)
M5            Bit                Поимк нулевой точки

D9            DWORD        Уставка Z в импульсах
D128        INT                Высота стола (0.1 мм)
D132        INT                Высота заготовки (0.1 мм)
D136        INT                Количество импульсов на 1 мм перемещения по оси Z
D140        INT                Скорость движения по оси Z (мм/сек). Автоматический режим
D142        INT                Скорость движения по оси Z (мм/сек). Ручное управление
D144        INT                Текущая координата Axis Z (0.1 мм)
D148        INT                Текущая высота от заготовки до линзы Work Z (0.1 мм)
D152        INT                Текущий номер линзы Lens (1..4)
D156        INT                Фокусное расстояние линзы F1 (0.1 мм)
D160        INT                Фокусное расстояние линзы F2 (0.1 мм)
D164        INT                Фокусное расстояние линзы F3 (0.1 мм)
D168        INT                Фокусное расстояние линзы F4 (0.1 мм)
D172        INT                MaxZ. Максимальное значение Z
D176        INT                Фокусное расстояние выбранной линзы

D8140    DWORD        Текущее значение координаты Z в импульсах

M8029    Bit                Сигнал завершения позиционирования (в одном цикле)
M8147    Bit                1 - происходит перемещение (Занято), 0 - ожидание команды
********************************************************************************
************)

IF M8002 = 1 THEN  (* Выполняется однократно при старте программы *)
    M0 := FALSE;
    M1 := FALSE;
    M2 := FALSE;
    M4 := FALSE;
END_IF;

(* Вычисляем чатсоту импульсов *)
dK := INT_TO_DINT(D136);     (* K *)
HiSpeed :=  INT_TO_DINT(D140);     (* Hi Speed *)
HiFreq := (dK * HiSpeed) / 10;
LoSpeed :=  INT_TO_DINT(D142);     (* Lo Speed *)
LoFreq := (dK * LoSpeed) / 10;

CASE D152 OF
    1: (* Линза 1 *)
        D176 := D156;
        FLeanse := INT_TO_DINT(D156);
    2: (* Линза 2 *)
        D176 := D160;
        FLeanse := INT_TO_DINT(D160);
    3: (* Линза 3 *)
        D176 := D164;
        FLeanse := INT_TO_DINT(D164);
    4: (* Линза 4 *)
        D176 := D168;
        FLeanse := INT_TO_DINT(D168);
    ELSE
        D176 := 0;
        FLeanse := 0;
END_CASE;

(* Вычисляем заданную координату Z в импульсах *)
TableH := INT_TO_DINT(D128); (* Высота стола *)
Mesure := INT_TO_DINT(D132); (* Высота заготовки *)
MaxZ := INT_TO_DINT(D172 ); (* MaxZ смещение*)
DestZ :=  MaxZ -  (TableH + Mesure + FLeanse); (* Значение Z в 0,1 мм с учетом смещения MaxZ*)
DestPulsZ := DestZ * (dK/10);  (* Вычисляем количество импульсов для смещения *)
DMOV( TRUE, DestPulsZ , D9);

(* Вычисляем текущую координату Z в 0,1 мм*)
DMOV( TRUE, D8140 , HardZ);
AxisZ :=  MaxZ - (HardZ * 10) / dK;
D144 := DINT_TO_INT(AxisZ);

(* Вычисляем текущее расстояние от заготовки до линзы Z1 в 0,1 мм*)
WorkZ := AxisZ - (TableH + Mesure);
D148 := DINT_TO_INT(WorkZ);

(* Soft Limit max *)
IF AxisZ > MaxZ THEN
    M0 :=FALSE;
    M1 := FALSE;
END_IF;
(* Soft Limit min *)
IF (AxisZ <= (TableH + Mesure)) THEN
    M0 := FALSE;
    M2 := FALSE;
END_IF;

(* По сигналам ручного управления отключить автоматическое M0 *)
IF M1 OR M2 THEN
    M0 := FALSE;
    M5 := FALSE;
END_IF;
DDRVA( M0 ,  DestPulsZ, HiFreq, Y0 , Y4);

(* Переключение скорости перемещения в ручном режиме *)
IF M3 THEN
    HandSpeed := HiFreq;
ELSE
    HandSpeed := LoFreq;
END_IF;

DDRVI( M1 , -80000 , HandSpeed , Y0 , Y4 );
DDRVI( M2 , 80000 , HandSpeed , Y0 , Y4 );

Y7 := M8147;

(* Поиск референтной точки/ мащинный 0 по датчику *)
DZRN( M5 , HiFreq, MaxZ * dK,  X0 , Y0 );

(* Сброс M0 по оканчании позиционирования *)
IF M8029 THEN
    M0 := FALSE;
    M5 := FALSE;
END_IF;

Автор: Smith2007 15.09.2021 - 00:28

Создал вторую задачу на FB
И в ней отдельно отрабатываю вычисления по сигналу M4, подаваемому с панели.
Операции выполняются с 4мя регистрами общими
D132 = D144 - D128 - D176

Костыль конечно получается. Но он работает

Автор: Sergei Troizky 15.09.2021 - 01:39

А почему у Вас: IF M1 OR M2 THEN ..., IF M3 THEN ..., IF M8029 THEN ...,
а в начале IF M8002 = 1 THEN ...?
Почему не IF M8002 THEN ...?

Автор: Smith2007 15.09.2021 - 12:50

Цитата(Sergei Troizky @ 15.09.2021 - 02:39) *
А почему у Вас: IF M1 OR M2 THEN ..., IF M3 THEN ..., IF M8029 THEN ...,
а в начале IF M8002 = 1 THEN ...?
Почему не IF M8002 THEN ...?


Делал проверки на другое условие кроме true. Поэтому осталось.
Думаю это не принципиально.

Это может быть причиной ошибок?

Автор: Sergei Troizky 15.09.2021 - 14:59

Цитата(Smith2007 @ 15.09.2021 - 12:50) *
Цитата(Sergei Troizky @ 15.09.2021 - 02:39) *
А почему у Вас: IF M1 OR M2 THEN ..., IF M3 THEN ..., IF M8029 THEN ...,
а в начале IF M8002 = 1 THEN ...?
Почему не IF M8002 THEN ...?


Делал проверки на другое условие кроме true. Поэтому осталось.
Думаю это не принципиально.

Это может быть причиной ошибок?

Пробуйте!
Но, во всей этой истории есть что-то непонятное.
А именно: биты с такими номерами не нужно сбрасывать в первом скане, они несохраняемые и поэтому уже сброшены.
Остается предположить, что либо их включает что-либо ранее в программе, либо вывод что они не сброшены в первом скане- ошибочен.

Автор: kaii 15.09.2021 - 17:01

Цитата(Sergei Troizky @ 14.09.2021 - 22:47) *
А что, в китайском другая прошивка?

Т.е. вы ни разу не натыкались на статьи что китайские подделки урезаны в функциональности? То команды не работают некоторые, то ST вообще не поддерживается, и прочее прочее.
Может быть уже лучше с этим стало, но...

Автор: Smith2007 15.09.2021 - 17:55

Цитата(Sergei Troizky @ 15.09.2021 - 15:59) *
...
Но, во всей этой истории есть что-то непонятное.
А именно: биты с такими номерами не нужно сбрасывать в первом скане, они несохраняемые и поэтому уже сброшены.
Остается предположить, что либо их включает что-либо ранее в программе, либо вывод что они не сброшены в первом скане- ошибочен.


В верху я явно инициализировал их после неудач с условием ибо уже не понимал кто их может взводить.
Как уже написал выше, я создал вторую задачу в рамках одной программы и создал ее на FBD
Вынес в нее только одну эту операцию. И все заработало нормально. Т.е. в действительности компилятор с ST чудит как-то.

зы. Заказал FX3U-14MT. Быть может с ним будет другая ситуация.
Кстати у меня есть еще один похожий ПЛК FX1N-14MR, несколько отличается плата и наличие дополнительного разъема. Он так же не верно исполняет в начале код с условием IF

Автор: Sergei Troizky 15.09.2021 - 23:07

Цитата(kaii @ 15.09.2021 - 17:01) *
Т.е. вы ни разу не натыкались на статьи что китайские подделки урезаны в функциональности?

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

Цитата(kaii @ 15.09.2021 - 17:01) *
То команды не работают некоторые ...

Это странно. Неужто китайцы писали свой софт, а не содрали с оригинала.

Цитата(kaii @ 15.09.2021 - 17:01) *
... то ST вообще не поддерживается...

А это к контроллеру вообще отношения не имеет.
ST- он в офлайн проекте ST, а контроллер выполняет код уже откомпилированный в IL.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)