PDA

Просмотр полной версии : программирование цифровых входов/выходов


Сергей-Олевс
18.04.2020, 14:19
Здравствуйте. Подскажите пожалуйста кто может правильно написать код.
1) Необходимо написать строку кода по приходу в которую робот останавливается и стоит ждёт если к примеру на 1 входе ничего нет (false), а когда появляется (True) начинает выполнение программы с самого начала.
2) Когда к примеру на 2 вход приходит сигнал останавливался к примеру на 60 сёк, а далее продолжал программу.

andy_18
18.04.2020, 17:22
По варианту "1" не понятно, что означает "начинает выполнение программы с самого начала", начало текущей (выбранной) программы или нужен возврат в программу cell ?

По поводу варианта "2" одной строчкой не получится, тут надо
а) активировать прерывание в программе Cell
б) создать подпрограмму задержки необходимого времени


а) кусок кода в программе Cell который нужно дописать до выбора рабочей программы.

INTERRUPT DECL 81 WHEN $in[2] DO wait_time()
INTERRUPT ON 81

б) Вновь созданная программа "wait_time" содержит всего одну команду

Wait sec 60

Сергей-Олевс
19.04.2020, 07:04
спасибо за решение второго вопроса.
а по первому - нужен непосредственно возврат на начало той программы в которой находится обращение к входу.

Сергей-Олевс
19.04.2020, 08:07
Вот собственно программа. После ее выполнения робот останавливается и стоит. Цель : оператор подходит и жмет на отдельно выведенную кнопку подключенную к входу и робот начинает выполнять программу снова. В этой программе как видите есть переходы на другие программы, а в них еще десяток подпрограмм, но в итоге он вернется обратно в эту программу и должен после нажатия на кнопку начать все с начала выполнять программу palete.
DEF palete( )
DECL POS PICKPOS [3,3]
DECL POS PREPOS [3,3]
DECL INT ROW,COL
DECL REAL DX,DY,DZ
DX=-80.0
DY=80.0
DZ=-136.0
FOR ROW= 1 TO 3
FOR COL= 1 TO 3
PICKPOS[ROW,COL] =XSTARTPOS
PICKPOS[ROW,COL].X=PICKPOS[ROW,COL].X+ (ROW-1)*DX
PICKPOS[ROW,COL].Y=PICKPOS[ROW,COL].Y+ (COL-1)*DY
ENDFOR
ENDFOR


FOR ROW= 1 TO 3
FOR COL= 1 TO 3
PREPOS[ROW,COL]=PICKPOS[ROW,COL]
PREPOS[ROW,COL].Z=PREPOS[ROW,COL].Z-DZ
ENDFOR
ENDFOR

;PALLETE
FOR ROW = 1 TO 3
FOR COL = 1 TO 3
PAL1_0()
$BASE=BASE_DATA[1]
$TOOL=TOOL_DATA[2]
SPTP PREPOS [ROW,COL]
SLIN PICKPOS[ROW,COL]
WAIT SEC 5
SLIN PREPOS [ROW,COL]
PAL_1_1()
kol6_chern()
kol6_chisto()
;DEPALLETE
;FOR ROW = 1 TO 3
;FOR COL = 1 TO 3
pal_1()
$BASE=BASE_DATA[1]
$TOOL=TOOL_DATA[2]
SPTP PREPOS[ROW,COL]
SLIN PICKPOS[ROW,COL]
WAIT SEC 6
SLIN PREPOS[ROW,COL]
PAL_1_1()
ENDFOR
ENDFOR
END

kuka_man
19.04.2020, 16:19
вот собственно программа.

+1
качественный бекстейдж!

andy_18
19.04.2020, 17:42
у вас в программе много разных позиций робота и из любой из них он может вернуться в исходную точку ничего не поломав ? или контроль входа нужен только в конце программы ?

Сергей-Олевс
19.04.2020, 18:20
да, только в конце программы когда он уже находится в нужной точке.

andy_18
19.04.2020, 18:33
это начало вашей программы, но добавлена метка begin

DEF palete( )
begin:
DECL POS PICKPOS [3,3]
DECL POS PREPOS [3,3]
DECL INT ROW,COL
DECL REAL DX,DY,DZ
DX=-80.0



далее конец программы, но добавлены команды wait for $in [1] и goto begin


SLIN PREPOS[ROW,COL]
PAL_1_1()
ENDFOR
ENDFOR

wait for $in [1]
goto begin

END

Сергей-Олевс
19.04.2020, 18:42
пробовал примерно так же только не через wait а when- спасибо- завтра протестирую отпишусь

andy_18
19.04.2020, 18:44
а если кнопка оператора залипнет ? робот сразу начнет работать с начала программы. Правильнее будет так:

SLIN PREPOS[ROW,COL]
PAL_1_1()
ENDFOR
ENDFOR

wait for not $in [1]
wait for $in [1]
goto begin

Сергей-Олевс
19.04.2020, 18:57
маловероятно, но даже если когда нибудь такое произойдет- максимум что случится- это робот сделает двойную работу на одних и тех же деталях.не страшно

Сергей-Олевс
20.04.2020, 09:33
Пока что на все что вы написали ругается десятком ошибок. По поводу INTERRUPT DECL 81 WHEN $in[2] DO wait_time()
INTERRUPT ON 81
Не правильнее ли будет так?

GLOBAL INTERRUPT DECL 81 WHEN $in[2]==TRUE DO wait_time()
INTERRUPT ON 81
При таком раскладе он не ругается-программа запускается но не останавливается когда приходит сигнал на вход. Просто работает как так и надо)

andy_18
20.04.2020, 11:01
у меня в программе прерывания не определялись как глобальные, все работало. могу скинуть архив с робота где эти прерывания использовались если надо.

Вы команды
GLOBAL INTERRUPT DECL 81 WHEN $in[2]==TRUE DO wait_time()
INTERRUPT ON 81

ставите перед вызовом рабочей программы ?

Сергей-Олевс
20.04.2020, 11:38
Пробовал и до ini и после не работает. При том что опыт использования прерываний у меня был правда на другом роботе. Там все непосредственно в самой программе было и работало. Даже сама программа осталась там все так де прописано как и сейчас пишу.странно это-может ли это бы связано с тем что в вызываем ой программе нет движения а только время? Попробую движуху добавить в вызываемую программу

andy_18
20.04.2020, 13:18
нет. от движения не зависит.

Сергей-Олевс
20.04.2020, 17:35
По первому вопросу тоже не работает ничего. Поставив begin: сразу после Def слетают все мои переменные задекларированные, поставив после ini норм, но выскакивает другая ошибка в строке go to begin "ожидается" (" фото прилагаю. Ссылка на фото https://yadi.sk/i/SrbAIpr-QcGP-g

andy_18
20.04.2020, 17:53
"go to" - не правильно , нужно goto !!!

Сергей-Олевс
20.04.2020, 18:18
ага да пробел. уже завтра отпишусь по результату

Сергей-Олевс
21.04.2020, 09:38
С меткой begin все получилось. С прерыванием пока что нет, возможно тоже синтаксическая ошибка где то-буду разбираться. По результатам отпишусь)