Перейти к публикации

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


Viktor2004

Рекомендованные сообщения

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

 

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

#500 - год

#501 - месяц

#502 - день

???

IMG_20210207_200031_4.jpg

Ссылка на сообщение
Поделиться на других сайтах


UnPinned posts

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

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

Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, mr_Voden сказал:

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

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

 

IMG_20210207_203510_9.jpg

Изменено пользователем Viktor2004
Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

3571672902

 

HDCPY001.JPG

Изменено пользователем Viktor2004
Ссылка на сообщение
Поделиться на других сайтах
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
 

Ссылка на сообщение
Поделиться на других сайтах

@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

 

Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

IF[ #501 NE 152 && #500 NE 21 ]THEN  /* нажато либо 152 INPUT либо 21 SOFT KEY 1
Ссылка на сообщение
Поделиться на других сайтах

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

G65 P8004

M98 P8004

Ссылка на сообщение
Поделиться на других сайтах
21 минуту назад, Viktor2004 сказал:

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

G65 P8004

M98 P8004

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

Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, A_1 сказал:

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

#1 = 1

#2 = 2

M98 P9008

 

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

Изменено пользователем A_1
Ссылка на сообщение
Поделиться на других сайтах
54 минуты назад, A_1 сказал:

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

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

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

Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

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

#[8500]

и

#8500

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

Изменено пользователем 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 

 

Ссылка на сообщение
Поделиться на других сайтах
11 часов назад, Viktor2004 сказал:

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

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

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...