Jump to content

Программирование Макро


Viktor2004

Recommended Posts

Viktor2004

Здравствуйте. В этой теме я буду задавать некоторые глупые вопросы по макропрограммированию, так как сталкиваюсь с ним редко. Буду благодарен за ответы

 

В макропеременной #3011 хранится текущая дата. Как написать программу что бы разделяла эту дату на 3 части и записать каждую в отдельную переменную, например

#500 - год

#501 - месяц

#502 - день

???

IMG_20210207_200031_4.jpg

Link to post
Share on other sites


UnPinned posts
mr_Voden

@Viktor2004 Использовал этот код немного для других задач, но должно работать.

#3011=20270431
#500=FIX[#3011/10000.] (YEAR)
#501=FIX[[#3011-#500*10000.]/100] (MOUNTH)
#502=FIX[#3011-#501*100.-#500*10000.] (DAY)

  • Чемпион 1
Link to post
Share on other sites
Viktor2004
7 минут назад, mr_Voden сказал:

но должно работать.

Спасибо. Работает

 

IMG_20210207_203510_9.jpg

Edited by Viktor2004
Link to post
Share on other sites
Viktor2004

Уважаемые коллеги, еще одна задачка

В макропеременных 950-959 находятся ASCII значения цифр

Нужно в переменную 960 записать то число которое там написано

Например. В результате обработки тех значений что на фото должно в #960 быть записано число

3571672902

 

HDCPY001.JPG

Edited by Viktor2004
Link to post
Share on other sites
30 минут назад, Viktor2004 сказал:

Уважаемые коллеги, еще одна задачка

В макропеременных 950-959 находятся ASCII значения цифр

Нужно в переменную 960 записать то число которое там написано

Например. В результате обработки тех значений что на фото должно в #960 быть записано число

3571672902

#1=959(VARIABLE NUMBER)
#2=1(MULTIPLIER)
#960=0(RESULT)

WHILE[#1GE950]DO1
#960=#960+[#[#1]-48]*#2
#1=#1-1
#2=#2*10
END1
 

  • Нравится 2
Link to post
Share on other sites
mr_Voden

@Viktor2004Двигался в другом направлении, относительно решения @A_1

#1=0 (START)
#960=0 (NUM)
#4=1000000000
WHILE[#1LT10]DO1
#2=#[950+#1]-48
#960=#960+#2*#4
#4=#4/10.
#1=#1+1
END1

 

  • Нравится 2
Link to post
Share on other sites
Viktor2004

Итак, товарищи, я продолжаю тупить

Преобразовываю программу под себя. Удаляю из нее все лишнее, добавляю свое и пытаюсь понять принцип ее работы.

Тут надо пояснить две команды

O8002
       #500 = #8501
       #503 = 0
       #950 = 176
       #951 = 176
       #952 = 176
       #953 = 176
       #954 = 176
       #955 = 176
       #956 = 176
       #957 = 176

N21    G240  P3  C0  
       G243  X2  Y0  A1  B0   (MACHINE PASSWORD INPUT SCREEN) 
       G240  P6  C0  
       G243  X7  Y[4 + 1]   (PASSWORD) 

N30    G240  P7  C0  
 
       G243  X5  Y26  A1  B0   (INPUT) 
	   #506 = 8
N100   #500 = #8501
       #501 = #8549
       IF[ #501 EQ #502 ]THEN  #501 = 0
       #502 = #8549
       IF[ #501 NE 152 && #500 NE 21 ]THEN  /* нажато либо 152 INPUT либо 21 SOFT KEY 1
              IF[ #501 EQ 134 || #501 EQ 137 ]THEN      /* нажато либо 134 CAN либо  137 стрелка влево
                     IF[ #503 GE 1 ]THEN  #503 = #503 - 1
                     #[950 + #503] = 176
       
              ENDIF
              IF[ #501 NE 0 && #503 LE [#506-1] && #501 GE 48 && #501 LE 90 ]THEN  /* нажата цифра пароля
                     #[950 + #503] = #501
                     #503 = #503 + 1
              ENDIF
N300          G240  P7  C0  
              #10 = 0
              WHILE[ #10 LT #506 ]DO1
                     G243  X[#10 + 18]  Y[4 + 1]  A1  B0  C#[950 + #10]  
                     #10 = #10 + 1
              END1

             GOTO 999
			   
       ENDIF
N400		    #504=950 + #506 - 1 (VARIABLE NUMBER)
				#505=1(MULTIPLIER)
				#960=0(RESULT)
				WHILE[#504 GE 950]DO1
					#960=#960+[#[#504]-48]*#505
					#504=#504-1
					#505=#505*10
					END1
				
N800   IF[ #503 NE #506 ]GOTO 891
       
       GOTO 889
N880   #950 = 176
       #951 = 176
       #952 = 176
       #953 = 176
       #954 = 176
       #955 = 176
       #956 = 176
       #957 = 176

       #503 = 0
       GOTO 999
N889   G240  P7  C0  
       G243  X2  Y23  A1  B0   ('PASSWORD INPUT WAS ACCEPTED!!!                 ') 
       GOTO 880
N890   G240  P7  C0  
       G243  X2  Y23  A1  B0   (                                               ) 
       GOTO 999
N891   G240  P1  C0  
       G243  X2  Y23  A1  B0   ('PASSWORD ERROR!!!                              ') 
       G240  P7  C0  
       GOTO 880
N990   M99  
N999   
N9999  M99  P100

G240 это установка цвета и фона выводимого символа

G243 это вывод текста по координатам пикселей

Программа зациклена. В конце стоит M99 P100 что означает бесконечный цикл со строки N100

Мне непонятно почему в блоке N300 команда GOTO 999. Пробовал ее удалять, без нее не работает. Не дает вводить пароль и не реагирует ни на какую кнопку.  А с ней работает. Почему бесконечный цикл без этой команды прерывается?

 

 

HDCPY000.JPG

Link to post
Share on other sites
Viktor2004

Все я разобрался. Криво написана программа. Следующую строчку надо через WHILE переписать

IF[ #501 NE 152 && #500 NE 21 ]THEN  /* нажато либо 152 INPUT либо 21 SOFT KEY 1
Link to post
Share on other sites
Viktor2004

Господа, подскажите, в чем разница между следующими двумя командами

G65 P8004

M98 P8004

Link to post
Share on other sites
21 минуту назад, Viktor2004 сказал:

Господа, подскажите, в чем разница между следующими двумя командами

G65 P8004

M98 P8004

При вызове с помощью G65 подпрограмме можно передать параметры, а через M98 - нет. В этом примере разницы между командами нет.

Link to post
Share on other sites
Viktor2004
1 минуту назад, A_1 сказал:

При вызове с помощью G65 подпрограмме можно передать параметры, а через M98 - нет. В этом примере разницы между командами нет.

спасибо. Значит ли это что G65 без параметров и M98 это одно и то же?

Link to post
Share on other sites

Если нет других буквенных адресов, то, да, эти команды, идентичны.

Link to post
Share on other sites
Viktor2004

А если я наберу так

#1 = 1

#2 = 2

M98 P9008

 

Эти значения 1 и 2 у меня в подпрограмме обнулятся или будут актуальны?

Link to post
Share on other sites

Эти переменные получат соответствующие значения. Они будут доступны и в вызывающей программе и в подпрограмме (да, будут актуальны). При G65 же создаётся новый набор локальных переменных #1-#33, и #1 вызывающей подпрограммы и #1 подпрограммы - это разные переменные. Сделано это для того чтобы при программировании макропрограммы можно было иметь независимый набор переменных, изменение которых не приводило бы к изменениям переменных вызывающей программы.

При M98 новый набор локальных переменных не создаётся. 

Edited by A_1
Link to post
Share on other sites
Viktor2004
54 минуты назад, A_1 сказал:

При G65 же создаётся новый набор локальных переменных

При M98 новый набор локальных переменных не создаётся. 

Спасибо. Значит вот оно главное различие

Link to post
Share on other sites
  • 3 weeks later...
Viktor2004
Posted (edited)

Подскажите пожалуйста

#[8500]

и

#8500

это одно и то же или нет?

Edited by Viktor2004
Link to post
Share on other sites
Viktor2004

Уважаемые коллеги.

Написал тут код который не имеет смысла. Хочу проверить как программа оптимизации не портит ли его.

Первый код это до оптимизации, второй после оптимизации.

Скажите, команда IF THEN ENDIF  будут давать тот же результат? Ну, условия будут по тем же законам обрабатываться или все же эти два кода не идентичны?

 

O8000
N0300IF [D2493.3 EQ1 && #8 EQ 8]GOTO 345	
     IF [#1 LT 21] GOTO 500		;
     IF [#2 GT 25] GOTO 500		;
     IF [#3 EQ 6] GOTO 345			;
     IF [#4 EQ 7] GOTO 345			;
     #11 = 5
N0310
     GOTO 500					;
N0320IF [#6 NE 4] GOTO 345			;
     IF [D2493.5 EQ 1] GOTO 340			
     IF [D2493.3 EQ 1] GOTO 340			
     GOTO 500					;
N0330		;
     GOTO 500					;
N0340 #15 = #14
N0345 #15 = #14	
N0365IF [#7 NE 24] GOTO 370		;
     #17=#10					;
     IF [#17 LT 0] GOTO 397			;
     IF [#17 GT 99] GOTO 397			;
     G310 D2442 L2 Q#17			;
     GOTO 500
N0370 M99
N0397 M99
N0500 M99	

а это после оптимизации

O8000  
       N300  IF[ D2493.3 EQ 1 && #8 EQ 8 ]GOTO 345
       IF[ #1 GE 21 && #2 LE 25 ]THEN
              IF[ #3 NE 6 && #4 NE 7 ]THEN
                     #11 = 5
N310  
                     GOTO 500
N320                 IF[ #6 NE 4 ]GOTO 345
                     IF[ D2493.5 NE 1 && D2493.3 NE 1 ]THEN
                            GOTO 500
N330  
                            GOTO 500
                     ENDIF
N340                 #15 = #14
              ENDIF
N345          #15 = #14
N365          IF[ #7 NE 24 ]GOTO 370
              #17 = #10
              IF[ #17 GE 0 && #17 LE 99 ]THEN
                     G310  D2442  L2  Q#17  
                     GOTO 500
N370                 M99  
              ENDIF
N397          M99  
       ENDIF
N500   M99 

 

Link to post
Share on other sites
11 часов назад, Viktor2004 сказал:

Скажите, команда IF THEN ENDIF  будут давать тот же результат?

В руководстве по эксплуатации FANUC не нашёл слово ENDIF

Link to post
Share on other sites
Viktor2004

Скажите только одно. То что оптимизатор поменял вместо

     IF [#1 LT 21] GOTO 500		;
     IF [#2 GT 25] GOTO 500		

поставил вот это

 IF[ #1 GE 21 && #2 LE 25 ]THEN

это нормально? Логика не поменялась?

Link to post
Share on other sites
boomeeeer
42 минуты назад, Viktor2004 сказал:

Скажите только одно. То что оптимизатор поменял вместо


     IF [#1 LT 21] GOTO 500		;
     IF [#2 GT 25] GOTO 500		

поставил вот это


 IF[ #1 GE 21 && #2 LE 25 ]THEN

это нормально? Логика не поменялась?

На первый взгляд вроде как поменялась. Не работал с макро, но предположу, что LT это LOWER THAN (меньше чем), GT - GREATER THAN (больше чем), т.е. эти два условия не предполагают равенство, значит переменная #1 должна быть строго меньше, например, 2, 5, 7, 20, чтобы выполнился переход на метку 500. Если #1 будет равна 21, то перехода не будет. А вот GE - GREATER or EQUAL (больше или равно) и LE - LOWER OR EQUAL (меньше или равно) уже подразумевают, что переход будет выполнен и при равенстве.

В вашем примере #1 LT 21, а в преобразованном почему-то уже #1 GE 21 и вообще не понятно, ещё и по логике "И" соединили, т.е. если первое сравнение, например, пройдёт, а второе нет, то перехода не будет. Хотя может я и ошибаюсь.

Link to post
Share on other sites
Viktor2004
1 час назад, boomeeeer сказал:

Хотя может я и ошибаюсь.

Оптимизатор перевернул две ветви логики поменяв их местами, но по идее результат должен остаться тем же. Я с этими функциями не работаю, так что мне сложно отследить все это

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.



  • Сообщения

    • ДОБРЯК
      Если есть изгибная жесткость и у задачи есть физический смысл, то 64 бит достаточно. Даже паутинку вы решите в своей программе. И если использовать переменные 128 бит или 256 бит то результат не изменится.  Поэтому в процессоре и спаяли переменные 64 бита. Это процессоры на которых мы работаем.
    • maxems
      Всегда рад! Но как показывает ваша писанина - еще не совсем. Выросли.   Итак. Специально для вас (не раскрою все секреты, но тем не менее):   - это 100% фануковский метод вызова подпрограммы. Где P40 - это номер подпрограммы. Его без разницы, как задавать -как О40 или О0040. Система сама рассчитает логику и присвоит подпрограмме номер О0040 при копировании. А пресловутая L - это просто количество повторов данной подпрограммы. L1 - соответственно повторить программу 1 раз. Этот символ (L) при использовании подпрограммы один раз - можно опускать, т е. не писать его.   А теперь  - загрузите основную программу (с названием файла, например О1234) и подпрограмму (с названием файла, например О0040) в ОДНУ папку, в ОДНО место.  Далее. Если файл вашей программы/подпрограммы называется О1234/О0040, то соответственно в самом файле, когда тыкаете его два раза, чтоб открыть тоже должен начинаться с О1234/О0040.  И да. В начале и в конце программы должны быть знаки %.   Другой причины я просто не вижу, почему у вас система не может найти подпрограмму. Если вы не совершаете детских ошибок, которые я сейчас описал. И потом. Раз вы нашли способ вызова подпрограммы через H, чем он не устраивает? Ну перезаливайте программу целиком в случае редактирования какой-либо подпрограммы. Всего делов.   Обычно зажимается Shift и стрелочкой вниз выделяется блок для копирования. Далее должна быть клавиша COPY и PAST куда надо. Это уж сами ищите. Ну или  перезаливайте программу целиком в случае редактирования. Это не глобальная проблема
    • Bot
      Компания АСКОН выпустила обновление своего решения для управления жизненным циклом изделия версии 2018.2, которое ускоряет работу в медленных территориально распределенных сетях в 5-26 раз. Радикальный рост производительности достигнут в системе управления нормативно-справочной информацией ПОЛИНОМ:MDM и системе проектирования технологических процессов ВЕРТИКАЛЬ. Запрос на оптимизацию появился на фоне пандемии — с ростом числа сотрудников, работающих удаленно, и переходом многих промышленных предприятий на гибридный режим работы. Заказчики АСКОН столкнулись с «медленным» интернетом в территориально распределенных подразделениях. Подробнее… View the full article
    • gudstartup
      А для этого в Fanuc есть функция M198 а вот что у вас - читайте тайваньские свитки
    • Maik812
      Я не нашел где ее скачать кстати и пощупать.. Только для своих клиентов?
    • Maik812
      Как вариант писать либо в фаил SW если удобно либо в поток ntfs (mPDM), чтоб не мучиться с записями в формат файла, да и не только таких, любых и для любых файлов. не только с файлами солида приходится работать. А можно и копии файлов писать и любые другие данные :)   mpdm2_0.zip На фото автоматическое заполнение свойств через плагин к солид ворксу, там любые значения можно писать и ручками и шаболонами. Например имя файла вносить или дату, если SolidWorks выше 2014 зачитывать значения из файла SW автоматом не может (SW плагина нету) . А внести данные какие хочешь может и в любой тип файлов без разницы и обратно в фаил тоже при наличие плагин соответствуещего.  Например можно SW2014 и компас 3д и даже между собой :)     Пиши в свойства модели , их можно видеть и сортировать и тд..       Без определенного стандарта не как !   Лучше уж в фаил SW писать от туда  в Exel можно вставить   Просто когда делаю чертеж я в имя и конфигурацию вставляю и все.. не каких проблем нет с конфигурацией в имени. Ну или в поток можно че хошь пиши, но удобней в имя файла а в нем уже чертеж этой конфигурации.
    • General Dead
      да, я это уже понял. ЮСБ есть на пцу20, на пульте его нет, заливаю УП по старинке через V24. Есть шопмил и лицензия на сетевой менеджер, но сетевой диск не прописан и вообще бывший владелец (немец) не шевелился по этому поводу, у них все уп в шопмиле были.
    • gudstartup
      Поищите в сторону хорошего механика! Пусть проверит ваш люфт в червячной или возможно роликовой передаче и отрегулирует или произведет дефектацию изношенных узлов.
    • Maik812
      Отличная штука, очень удобно! И еще бы добавить контроль чтоб не напортачили ошибок при заполнении размеров. Побольше бы таких программ! Тебе  бы гадость сказать , ну не как не удержатся :)
    • gudstartup
      А O1234 как раз и унаследовано вашим тайванским чудом от Fanuc старых серий там все подпрограммы и программы начинались с этого индекса как и на старых  Sinumerik c MPF SPF  Например вспомните строчку для вывода всех программ Это говорит о том что система в части HMI совместима но со старыми системами Fanuc отсюда и такие скромные возможности редактора программ да и папки для хранения программ наверняка нельзя создавать все в корневом каталоге хранится непорядок!
×
×
  • Create New...