Hi guys, you are great!
The suggestion with the thread sounds good! Thanks for the idea - I will try it and give feedback soon.
Best regards
Hi guys, you are great!
The suggestion with the thread sounds good! Thanks for the idea - I will try it and give feedback soon.
Best regards
Sure...
I want to set/reset an output on the way from waypoint P1 to P2 50.0 mm before reaching P2 without stopping:
Hello everyone,
My next task is to programme an UR - a dosing application.
I have read through a lot so far and understand to some extent how the programming works.
Now I have the question of how to switch the output for my dosing valve on or off on the web without triggering an exact stop?
Ideally, this should be dependent on, for example, a distance to a start or end point.
Unfortunately, I haven't found much on this yet. Does anyone have any experience that they can share with me?
From other manufacturers I know own commands for such things and hope that the UR can also do this...
Best regards
I have checked the tool data. Everything fits so far...
The example works and does exactly what I want:
SFTON Pxx1 UF#(2)
MOVL Pxx2 //must be different from Pxx1
SFTOF
My question is if I can calculate positions the same way the SFTON command does, so I can create the positions in advance?
I tried to work with the command MULMAT, but the TCP does not keep its position in UF#(2) during the rotation around RX,RY,RZ. Or is this somehow possible after all?
Best regards and thanks for the support!
I will check that again. The tool is a gripper and I have calibrated it. In fact there is only an offset in XYZ without any rotation of the TCP in RX,RY,RZ. Strange - but we will solve the problem.
Thanks a lot!!!
Hello Motouser,
Thanks for the quick reply. I understand what you mean. However, I was expecting when I run the following code that I rotate around RX in the user coordinate system:
'ADJUST RZ-VALUE
GETE LD000 LP000 (6)
ADD LD000 D015
SETE LP000 (6) LD000
But I rotate around RZ with the code I posted before:
'ADJUST RX-VALUE
GETE LD000 LP000 (4)
ADD LD000 D013
SETE LP000 (4) LD000
This is what I don't understand or wonder about...
Hello all,
despite some contributions to the calculation of positions I have somehow problems with the implementation of a calculation program - I am just a MOTOMAN beginner.
Moving positions in user coordinates is no problem and works wonderfully:
'GET REF-POSITION
CNVRT LPX000 PX020 UF#(2) TL#(1)
'
'ADJUST X-VALUE
GETE LD000 LP000 (1)
ADD LD000 D010
SETE LP000 (1) LD000
But now I want to offset the position adjusted in UF#(2) by the X value around the TL#(1) in RX, but unfortunately my robot rotates around RZ!?
'ADJUST RX-VALUE
GETE LD000 LP000 (4)
ADD LD000 D013
SETE LP000 (4) LD000
The points should be calculated in advance in the calculation program and and later approached in another program.
What am I doing wrong or with which command sequence would I get the desired result with MOTOMAN?
Best regards
Hello together,
in the near future I have to programm an UR3e that will be controlled by a Beckhoff PLC via ProfiNet.
I read the ProfiNet-Documentation and implemented the communication between the Robot and PLC.
Actually everything is running - means it is possible to read/write all the Process Data on the PLC.
On the Robot I wrote a small default program for testing and configured the Signals for Remote Control as follow:
GP_bool_in[0] => Start
GP_bool_in[1] => Stop
GP_bool_in[2] => Pause
GP_bool_in[3] => Freedrive
GP_bool_in[4] => Auto start the default program in the Run Tab
GP_bool_in[5] => Auto brake releas the Robot
GP_bool_out[0] => Low when Program is not running
GP_bool_out[1] => High when Program is not running
GP_bool_out[2] => High when Program is running
From the Process Data the PLC can read the State of the Robot:
0 = Disconnected
1 = Confirm_safety
2 = Booting
3 = Power_off
4 = Power_on
5 = Idle
6 = Backdrive
7 = Running
And some other Flags:
AOM = Analog output mask
AOT = Analog output types
ES = Is emergency stopped
FT = Is fault
NO = Is normal mode
PB = Is power button pressed
PR = Is program running
PS = Is protective stopped
PW = Is power on
RC = Is recovery mode
RD = Is reduced mode
RES = Is robot emergency stopped
SES = Is system emergency stopped
SS = Is safeguard stopped
SSM = Speed slider fraction mask
ST = Is stopped due to safety
TAIT = Tool analog input types
TB = Is teach button pressed
TDI = Tool digital inputs
TDO = Tool digital outputs
TDOM = Tool digital output mask
VL=Is violation
Now, my Question. How looks the Handshaking of the Input/Output-Signals to start the Robot remotely in a very reliable way and without using of the Dashboard-Server?
I have problems to start the robot after turning on the controller. The default programm doesn't start everytime - but sometimes. I think there is a timing issue...
In the past I programmed a lot of Applications with ABB, Kawasaki or KUKA an I had diagrams like that:
Is there something similar for the UR?
Thanks in advanced and best regards...
You can use the BITS command for integer variables too:
From PLC to Kawasaki Robot:
IF (BITS(1033,16)>32767) THEN
; negative value
my_integer = BITS(1033,16) - 65536
ELSE
my_integer = BITS(1033,16)
END
From Kawasaki Robot to PLC:
IF (my_integer <0 ) THEN
; negative value
BITS 33,16 = my_integer + 65536
ELSE
BITS 33,16 = my_integer
END
Best regards...
Cycle time of SPS.SUB is 12 ms!
Kawasaki´s autostart is three times faster (4ms) and you can start five independent autostart tasks...
In your case I think it´s nessecary to monitor your autostart.pc programm in a second task like this:
.PROGRAM autostart.pc()
DO
;*** your code ***
UNTIL FALSE
.END
.PROGRAM autostart2.pc()
DO
IF TASK(1001)<>1 THEN
PCEXECUTE: autostart.pc
END
UNTIL FALSE
.END
Me again...
Think, that an interrupt on Kawasaki robots is different to KUKA (no equal command like RESUME). But if you like to stop and start motion every time you want (like MOVE_ENABLE) you can do that in different ways.
1. Example for an autostart.pc programm:
.PROGRAM autostart.pc()
DO
;*** rising edge of input 1001 ***
IF SIG(1001) AND SIG(-2001) THEN
SIGNAL(2002)
ELSE
SIGNAL(-2002)
END
IF SIG(1001) THEN
SIGNAL(2001)
ELSE
SIGNAL(-2001)
END
;*** falling edge of input 1001 ***
IF SIG(-1001) AND SIG(-2003) THEN
SIGNAL(2004)
ELSE
SIGNAL(-2004)
END
IF SIG(-1001) THEN
SIGNAL(2003)
ELSE
SIGNAL(-2003)
END
;****************************
;*** I think more conditions are nessesary (look at system switches in as manual).
IF SIG(2002) THEN
;*** Stop motion ***
MC HOLD
END
;****************************
;*** I think more conditions are nessesary (look at system switches in as manual).
IF SIG(2004) THEN
;*** Continue motion ***
MC CONTINUE
END
UNTIL FALSE
.END
2. Using the dedicated input signal "EXT_IT":
When this signal circuit is open robot stops motion in repeat mode.
3. Using the EXTERNAL HOLD signal on 1TR board (E-Controller), 1KP board (D-Controller) connector X9 Pin 7-8 or TB2 board
(C-Controller) pin 19-20.
Best regards...
Hello, try this:
.PROGRAM main()
;**********************************
;*** example for an interrupt **********
;**********************************
DO
WAIT SIG(-1001)
ONI 1001 CALL my_interrupt
JMOVE #p[1]
JMOVE #p[2]
JMOVE #p[3]
UNTIL FALSE
.END
.PROGRAM my_interrupt()
;**********************************
;*** interrupt routine ****************
;**********************************
IGNORE 1001
BRAKE
POINT #p[4] = #DEST
WAIT SIG(-1001)
JMOVE #p[4]
RETURN
.END
Best regards...
Hi,
do you know the $DECODE- command? With this command, it´s very simple to extract information out of a string. But you must use a seperator.
Example:
; semicolon is the seperator between the values.
$received.string = "01;02;41;42;"
$temp.string = $received.string ; neccessary to copy, because the $DECODE- command works on the string.
i = 0
WHILE($temp.string<>"")DO
$value = $DECODE($temp.string,";",0) ;extract characters up to the seperator.
value [i] = VAL($value) ;convert to real
$seperator = $DECODE($temp.string,";",1) ;extract the seperator.
i = i+1
END
IF(i>0)THEN
FOR j=0 TO i STEP 1
TYPE "VALUE", value[j]
END
END
Regards!