Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Вопросы новичка
Mitsubishi Electric. Контроллеры, преобразователи частоты, HMI > Контроллеры Melsec FX > Программирование
Waldislaw
Только начал изучать ПЛК, у меня FX3G GXwork2 полностью в ST тк раньше сидел только в урезанном СИ микроконтроллеров. Вопросы которые я не смог понять/найти за эту неделю:
- как вызвать программный блок из основной программы, например на рисунке из POU_01 вызвать inte и вернуться;
- как перемещаться в одной программе по меткам (Goto);
- задать время повторения программы (цикл контроллера);
- управлять быстрыми выходами (выдать пачку импульсов за время меньшее чем цикл контроллера).
Задача минимум управлять 5-ю осями с серваками step/dir, линейная интерполяция по 2-м из них с точностью 0.1мм, без доп модулей это вполне возможно.
Sergei Troizky
Если только начал изучать ПЛК, настоятельно рекомендую Ladder, а не ST.
Ladder лучше визуализирует логику и лучше для понимания общих принципов и инструкций ПЛК.
В ST, возможно, привычнее выглядят массивные вычисления, но ПЛК- это все же Программируемый ЛОГИЧЕСКИЙ Контроллер.
Спорить или переубеждать, однако, не стану. Имеющий уши да услышит.

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

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

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

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

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

Есть же инструкция CJ для прыжка к тому шагу программы который надо, хотя лучше CJP, а то все время будет скипать часть программы.
Зачем цикл задавать? Можно конечно через D8039, но зачем замедлять? Есть же системные маркера M8011-M8014 если отсчет по времени делать.
Быстрыми выходами эт шоль операция PLSY? До 200000 герц спец выход може выдать. И ткнуть ему тоже можно сколько надо испульсов. И флаги завершения есть и прочее.
Мануал то почитайте. Есть некоторые ошибочные места или переведено немного не так как на самом деле, но много нового откроете для себя.
Waldislaw
Цитата(kaii @ 8.10.2020 - 16:12) *
Цитата(Waldislaw @ 7.10.2020 - 16:12) *
- как перемещаться в одной программе по меткам (Goto);
- задать время повторения программы (цикл контроллера);
- управлять быстрыми выходами (выдать пачку импульсов за время меньшее чем цикл контроллера).

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

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

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

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

В ST это делается путем создания функционального блока и обращения к нему по мере необходимости.
Waldislaw
Цитата(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
Цитата(Waldislaw @ 7.10.2020 - 19:12) *
- как вызвать программный блок из основной программы, например на рисунке из POU_01 вызвать inte и вернуться;


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


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

В программе вызываете блок и подключаете к нему формальные параметры:
Имя_Функц_блока ( TRUE, вх_парам1, вх_парам2, вых_парам );
Входные и выходные параметры в соответствии с их типами самого ФБ (разумеется). Они могут быть как локальными, так и глобальными.
Waldislaw
Добрый день! Вопрос.
Делаю позиционирование на 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
Сперва откуда надыбали FX3GA? Я чет мануал не могу найти, лишь рекламную брошюрку мицубиши, которая лишь на сайте "заплати, получи".
По какому мануалу нашли что нужны D8146, D8148, D8145? В том что я нашел для FX3G совсем другие ячейки.
"как пользоваться в ST таймерами" - страдать.
Sergei Troizky
https://we.tl/t-XWFj5Hw73l
Читайте раздел 7.9
Для позиционирования с разгоном/торможением используйте PLSR.
kaii
Цитата(Sergei Troizky @ 17.02.2021 - 19:52) *
https://we.tl/t-XWFj5Hw73l
Читайте раздел 7.9
Для позиционирования с разгоном/торможением используйте PLSR.

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

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

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

Я читал раздел 7.9. И написал вам пример, который не работает, хотя составлен он по примеру из раздела 7.9.
PLSR вообще из раздела 6.7.9, это просто выдача пачки импульсов без разгона и торможения.
Waldislaw110
Вообще странноватый этот 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
И ещё я пытался восстановить свой пароль на форуме, ввожу почту, капчу. Пишет выслано, проверяю - нету. Проверил все спамы, корзины, фильтры. Ничего нет. Зарегистрировался на другой ящик - снова таже история, нет письма. Сегодня я дорвался до ноута и почты жены и зарегился через неё. До этого не мог - гипс мешал.
Sergei Troizky
Цитата(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
Цитата(Waldislaw110 @ 3.03.2021 - 00:13) *
Пока искал нашел DBON. Что это такое? Ни в одном мануале и хэлпе нет такой инструкции. А редактор мне её предлагает.

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

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

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

Было и у меня такое со второго раза зарегился))
masvel12
Цитата(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-V...ery=Q%20postion

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

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

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

Я раз двадцать пытался.
Smith2007
Впервые встретился с ПЛК 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
Копайте в сторону Ladder-а.
И поверьте, это благой совет.
Нечего ST делать в этом классе ПЛК.
Smith2007
Цитата(Sergei Troizky @ 14.09.2021 - 16:27) *
Копайте в сторону Ladder-а.
И поверьте, это благой совет.
Нечего ST делать в этом классе ПЛК.


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

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

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

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


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

Про пробелы не понял...
Smith2007
Цитата(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
Создал вторую задачу на FB
И в ней отдельно отрабатываю вычисления по сигналу M4, подаваемому с панели.
Операции выполняются с 4мя регистрами общими
D132 = D144 - D128 - D176

Костыль конечно получается. Но он работает
Нажмите для просмотра прикрепленного файла
Sergei Troizky
А почему у Вас: IF M1 OR M2 THEN ..., IF M3 THEN ..., IF M8029 THEN ...,
а в начале IF M8002 = 1 THEN ...?
Почему не IF M8002 THEN ...?
Smith2007
Цитата(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
Цитата(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
Цитата(Sergei Troizky @ 14.09.2021 - 22:47) *
А что, в китайском другая прошивка?

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


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

зы. Заказал FX3U-14MT. Быть может с ним будет другая ситуация.
Кстати у меня есть еще один похожий ПЛК FX1N-14MR, несколько отличается плата и наличие дополнительного разъема. Он так же не верно исполняет в начале код с условием IF
Sergei Troizky
Цитата(kaii @ 15.09.2021 - 17:01) *
Т.е. вы ни разу не натыкались на статьи что китайские подделки урезаны в функциональности?

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

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

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

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

А это к контроллеру вообще отношения не имеет.
ST- он в офлайн проекте ST, а контроллер выполняет код уже откомпилированный в IL.
Русская версия IP.Board © 2001-2024 IPS, Inc.