I have no good luck to connect remote desktop into KSS 8.3/8.2 controller by KLI interface ,but i could do it with KSS 8.3/8.2 controller via X47 port of CIB board (Robot IP: 192.168.0.1 and no need any settings in robot side) .As far as i know, since KSS8.5, KLI interface is allowed to use for remote desktop.
Posts by AndrewWang
-
-
Yes but there seems to be also an pass through energy supply so one can bring additional signals if needed
To be honest, when i was still a technician in KUKA, i was really unwilling to take any work related to Agilus hardwares which are all compact and difficult to assemble and disassemble. .
-
wow, Xpert is really a nice kuka internal tool. Back to the point , It seems the 2nd generation Agilus has 2 DI less than the 1st generation Agilus in X41 connector and 1 set less than the 1st generation Agilus in the internal pneumatic valves.
-
User defined Math function -Power:
Code
Display MoreDEFFCT REAL Power(nrBase:IN,nzExponent:IN) DECL REAL nrBase DECL REAL nrRet DECL INT nzExponent DECL INT nzI IF VARSTATE("nrBase")<>#INITIALIZED THEN MsgQuit("nrBase input not intialized!") HALT ELSE IF nrBase==0 THEN MsgQuit("nrBase input Must not be Zero!") HALT ENDIF ENDIF IF VARSTATE("nzExponent")<>#INITIALIZED THEN MsgQuit("nzExponent input not intialized!") HALT ENDIF IF nzExponent==0 THEN nrRet=1 ELSE IF nzExponent < 0 THEN nzExponent=nzExponent*(-1) nrRet=nrBase FOR nzI=1 TO (nzExponent-1) nrRet=nrRet*nrBase ENDFOR nrRet=1/nrRet ELSE nrRet=nrBase FOR nzI=1 TO (nzExponent-1) nrRet=nrRet*nrBase ENDFOR ENDIF ENDIF RETURN nrRet ENDFCT
-
If you don't find that type which is identical to your welder, then just take the general one in which you can configure it.
-
I have had the communication tests Between IPG laser machines and KUKA Robot (KSS 8.3) ,such as Profibus/ProfiNet/DeviceNet/EtherCAT, all worked. I really want to share the documentation i made, unfortunately , it's chinese.Just take a look at the project ,and enjoy your project.
-
Since KSS 8.2, It's possible to stop robot movement in submit interpreter by using new functionalities.
1. bResult = ROB_STOP(StopReaction:IN)
a. Function of the Type BOOL stopping and preventing Robot movements.
b.Stop reaction must be passed to ROB_STOP() as a parameter of the ENUM Type ROB_STOP_T.
- Ramp stop (#RAMP_DOWN) - Path maintaining (#PATH_MAINTAINING)
2.ROB_STOP_Release()
Subprogram to cancel the blocking of ROB_STOP()
For more details, you can refer to system integrator manual.Example:
Code
Display More1. Source code : DEF Robotstop_SI() IF $IN[zTrig_Input] THEN Robot_Stopped =TRUE Stop_Feedback =ROB_STOP(#PATH_MAINTAINING) ENDIF IF NOT $IN[zTrig_Input] AND Robot_Stopped THEN ROT_STOP_RELEASE() Robot_Stopped =FALSE ENDIF END 2.Data : DEFDAT Robotstop_SI PUBLIC DECL BOOL Stop_Feedback=TRUE DECL BOOL Robot_Stopped=FALSE DECL INT zTrig_Input =16 ENDDAT
-
Well, I set up a monitor in the SPS to record the highest and lowest values of $ROB_TIMER while the robot was otherwise occupied.
It would appear the $ROB_TIMER's minimum value is 0, and it's maximum value is 14274362. That works out to about 3.9 hrs.
I'm not sure why it would be set up that way, but it does mean that there's very little chance of running into any integer limit issues when adding or subtracting the $ROB_TIMER value, unless you use some really enormous time periods. In which case, it would be simpler to use $DATE.
I had a check of it with officelite, but the max value is not as what you mentioned, it should be greater than 14274362.just take s snap , but the counter is still working .
-
My error if the GSDML isn't found on the D:\ drive...
Make sure the profinet device name matches the name in your TIA project, as well as setting the profisafe ID in your project the same as it on the robot.
The device name should be set in WorkVisual in the Profinet settings. In TIA set it by selecting the device and looking at the device properties > General > Profinet Interface. I used the "converted name" from TIA in Work Visual.
The profisafe ID is default set to 7, but may need to be changed depending on other F-I/O on your network. It can be changed by going to Menu > Configuration > Safety Configuration > Communication parameters on the smartpad. In TIA, it's found by selecting the "64 Safe I/O" in the Device Overview pane, then properties > profisafe. I've attached a screenshot below of my device config.
Additionally you may need to set up a method for re-integration if the connection to your robot is interrupted for some reason. In the GSDML I used, it created a system F-I/O DB that handled the F-status bits for integration req, ack, ect... This isn't well documented on the Kuka or Siemens side, and lead to some head scratching on my end when the F-comms would just take a dump and it would only resume after a very specific sequence of restarts with the F-PLC and robot.
Nice thread!!! that's a lot of information there , for PLC safety programming, there should be a professional programmer .
-
The Key word SIGNAL is the easiest way to fulfill your demand.But you can program it by yourself.For the unsigned integer to be converted into bits, below program you can take it :
Code
Display MoreDEF PokeOutputs(Idx:IN,Len:IN,Value:IN ) ;*************************************************** ;* Customer : * ;* Roboter : * ;* Version : Vxxxxxx * ;* Roboter Nr. : xxxxxx * ;* Controller Nr: xxxxxx * ;* Autor : Andrew Wang * ;* Company : * ;* Department : * ;* Telephone : 86 156-8082-2827 * ;* Version : 1.0 * ;* Created : 12.12.2018 * ;* Modified : * ;* Project : * ;* Program Name : PokeOutputs * ;* Write max 31 bit outputs Status; * ;************************************************** DECL INT Idx DECL INT Len DECL INT Value DECL INT nzI DECL INT nzTemp CONTINUE IF VARSTATE("Value")<>#INITIALIZED THEN MsgQuit("Output Value not initialized!") HALT ELSE IF Value< 0 THEN MsgQuit("Please enter a positive integer!") HALT ENDIF IF Value> 2147483647 THEN MsgQuit("Output set value Over 2147483647!") HALT ENDIF ENDIF CONTINUE IF VARSTATE("Len")<>#INITIALIZED THEN MsgQuit("Output Length not initialized!") HALT ELSE IF (Len<1) OR (Len>31) THEN MsgQuit("Please Enter output length:1-31") ENDIF ENDIF CONTINUE IF VARSTATE("Idx")<>#INITIALIZED THEN MsgQuit("Output channel index not initialized!") HALT ELSE IF (Idx<=0) or (Idx>($SET_IO_SIZE*1024)) THEN MsgQuit("Output channel index out of range !") HALT ENDIF IF ((Idx+Len-1)> ($SET_IO_SIZE *1024)) THEN MsgQuit("Output Length Out of range!") HALT ENDIF ENDIF nzTemp=Value FOR nzI=1 TO Len CONTINUE $OUT[Idx+nzI-1]=(nzTemp-2*(nzTemp/2))==1 nzTemp=nzTemp/2 ENDFOR END
And for signed, the integer should be 32-bit :
Code
Display MoreDEF PokeOutputs(Idx:IN,Len:IN,Value:IN ) ;*************************************************** ;* Customer : * ;* Roboter : * ;* Version : Vxxxxxx * ;* Roboter Nr. : xxxxxx * ;* Controller Nr: xxxxxx * ;* Autor : Andrew Wang * ;* Company : * ;* Department : * ;* Telephone : 86 156-8082-2827 * ;* Version : 1.0 * ;* Created : 12.12.2018 * ;* Modified : * ;* Project : * ;* Program Name : PokeOutputs * ;* Write max 31 bit outputs Status; * ;************************************************** DECL INT Idx DECL INT Len DECL INT Value DECL INT nzI DECL INT nzTemp CONTINUE IF VARSTATE("Value")<>#INITIALIZED THEN MsgQuit("Output Value not initialized!") HALT ELSE IF Value< 0 THEN MsgQuit("Please enter a positive integer!") HALT ENDIF IF Value> 2147483647 THEN MsgQuit("Output set value Over 2147483647!") HALT ENDIF ENDIF CONTINUE IF VARSTATE("Len")<>#INITIALIZED THEN MsgQuit("Output Length not initialized!") HALT ELSE IF (Len<1) OR (Len>31) THEN MsgQuit("Please Enter output length:1-31") ENDIF ENDIF CONTINUE IF VARSTATE("Idx")<>#INITIALIZED THEN MsgQuit("Output channel index not initialized!") HALT ELSE IF (Idx<=0) or (Idx>($SET_IO_SIZE*1024)) THEN MsgQuit("Output channel index out of range !") HALT ENDIF IF ((Idx+Len-1)> ($SET_IO_SIZE *1024)) THEN MsgQuit("Output Length Out of range!") HALT ENDIF ENDIF nzTemp=Value FOR nzI=1 TO Len CONTINUE $OUT[Idx+nzI-1]=(nzTemp-2*(nzTemp/2))==1 nzTemp=nzTemp/2 ENDFOR END
-
This system build-in function should have been there for really a long time, i believe(I had idea about it around 2011).There are many system build-in functions/subprograms you can refer to the data file Operate.dat,but it has been hidden in the KRC4 systems.
This timer function has nothing to do with the 64 system $TIMER[], and it must be used together with WAIT FOR command,you can use it in Robot/submit interpreter.Even if the timer limit is used in SPS and over 16 ms,it could not stop sps program.Thus i believe it's based on system time, and has nothing to do with interpreter time.
Below is part of system functions and subprograms i took out from data file:
SQL
Display MoreDELETE_BACKWARD_BUFFER ( ) DIAG_START(DIAGPAR_T PAR :OUT,DIAGOPT_T OPT :OUT) DIAG_STOP() GET_DIAGSTATE() GETSYSSTATE(CHAR CMD[64] :IN,INT IPAR :OUT,REAL RPAR :OUT) IS_KEY_PRESSED(INT KEY :IN) GETCYCDEF(INT INDEX :IN) GET_DECL_PLACE(CHAR VARNAME[80] :IN) CHECKPIDONRDC() PIDTORDC(CHAR STRVAR[470] :IN) DELETE_PID_ON_RDC() CAL_TO_RDC() SET_MAM_ON_HD(E6AXIS VALUES :IN) COPY_MAM_HD_TO_RDC() CREATE_RDC_ARCHIVE() RESTORE_RDC_ARCHIVE() DELETE_RDC_CONTENT() RDC_FILE_TO_HD(CHAR FILENAME[128] :IN) CHECK_MAM_ON_RDC() GET_RDC_FS_STATE() SET_SYSTEM_DATA(CHAR OWNER_NAME[16] :IN,CHAR OWNER_AXNAME[5] :IN,CHAR VAR_NAME[64] :IN,REAL VALUE :IN) SET_SYSTEM_DATA_DELAYED(CHAR OWNER_NAME[16] :IN,CHAR OWNER_AXNAME[5] :IN,CHAR VAR_NAME[64] :IN,REAL VALUE :IN) GET_SYSTEM_DATA(CHAR OWNER_NAME[16] :IN,CHAR OWNER_AXNAME[5] :IN,CHAR VAR_NAME[64] :IN,INT STATUS :OUT) ERR_CLEAR (ERROR_T PERR :OUT ) ERR_RAISE (ERROR_T PERR :OUT ) EXTFCTP REAL ABS(REAL X :IN) EXTFCTP REAL SQRT(REAL X :IN) EXTFCTP REAL SIN(REAL X :IN) EXTFCTP REAL COS(REAL X :IN) EXTFCTP REAL TAN(REAL X :IN) EXTFCTP REAL ACOS(REAL X :IN) EXTFCTP REAL ATAN2(REAL X :IN,REAL Y :IN) EXTFCTP INT MBX_REC(INT MBX_ID :IN,STOPMESS MESS :OUT) EXTFCTP FRAME TOOL_ADJ(FRAME X :OUT) EXTFCTP FRAME EK(FRAME TKRWE :IN,ESYS EXKIN :IN,FRAME TBAFL :IN) EXTFCTP FRAME LK(FRAME ROOT :IN,CHAR IP_ADDR[24] :IN,FRAME OFFSET :IN,ESYS EXKIN :IN) EXTFCTP E6AXIS INVERSE(E6POS TOOLPOS :IN,E6AXIS START_AXIS :IN,INT STATUS :OUT) EXTFCTP E6POS FORWARD(E6AXIS AXVAL :IN,INT STATUS :OUT) EXTFCTP E6POS INV_POS(E6POS POS_VALUES :IN) EXTFCTP INT IOCTL(CHAR DRVNAME[256] :IN,INT REQUEST :IN,INT ARGUMENT :IN) EXTFCTP INT CIOCTL(INT HANDLE :IN,INT REQUEST :IN,INT ARGUMENT :IN,CHAR PARAM[128] :IN,INT RETVAL :OUT) EXTFCTP INT SYNC() EXTFCTP VAR_STATE VARSTATE(CHAR VAR_STR[80] :IN) EXTFCTP BOOL WSPACEGIVE(INT SPACEID :IN) EXTFCTP BOOL WSPACETAKE(INT SPACEID :IN,INT ADVANCE :IN) EXTP SYNCCMD (SYNCTYPE SYNC_T :IN,CHAR ID_NAME[64] :IN,INT COOP_LIST :IN ) EXTFCTP RET_C_PSYNC_E CANCELPROGSYNC(CANCEL_PSYNC_E CMD :IN,CHAR ID_NAME[64] :IN) EXTFCTP BOOL REMOTECMD(CHAR IP_ADDR[24] :IN,CHAR CMD[128] :IN) EXTFCTP CHAR REMOTEREAD(CHAR IP_ADDR[24] :IN,CHAR VARIABLE[128] :IN,INT ERROR :OUT) EXTFCTP INT STRLEN(CHAR STRVAR[2047] :IN) EXTFCTP INT STRDECLLEN(CHAR STRVAR[2047] :OUT) EXTFCTP BOOL STRCLEAR(CHAR STRVAR[2047] :OUT) EXTFCTP INT STRADD(CHAR STRDEST[2047] :OUT,CHAR STRTOADD[2047] :IN) EXTFCTP INT STRFIND(INT STARTAT :IN,CHAR STRVAR[2047] :IN,CHAR STRFIND[2047] :IN,CASE_SENSE_T CASE_MODE :IN) EXTFCTP BOOL STRCOMP(CHAR STRCOMP[2047] :IN,CHAR STRCOMP2[2047] :IN,CASE_SENSE_T CASE_MODE :IN) EXTFCTP BOOL STRCOPY(CHAR STRDEST[2047] :OUT,CHAR STRSOURCE[2047] :IN) EXTFCTP BOOL ISMESSAGESET(INT MESSAGENO :IN) EXTFCTP BOOL TIMER_LIMIT(REAL SECONDS :IN) EXTFCTP INT SET_KRLMSG(EKRLMSGTYPE TYPE :IN,KRLMSG_T MSG :OUT,KRLMSGPAR_T PAR[3] :OUT,KRLMSGOPT_T OPT :OUT) EXTFCTP BOOL EXISTS_KRLMSG(INT NHANDLE :IN) EXTFCTP BOOL CLEAR_KRLMSG(INT NHANDLE :IN) EXTFCTP INT SET_KRLDLG(KRLMSG_T MSG :OUT,KRLMSGPAR_T PAR[3] :OUT,KRLMSGDLGSK_T SK[7] :OUT,KRLMSGOPT_T OPT :OUT) EXTFCTP BOOL SET_KRLDLGANSWER(INT NHANDLE :IN,INT ANSWERSK :IN) EXTFCTP BOOL EXISTS_KRLDLG(INT NHANDLE :IN,INT ANSWER :OUT) EXTFCTP INT GET_MSGBUFFER(MSGBUF_T MSGBUF[100] :OUT) EXTFCTP BOOL STRTOREAL(CHAR STRVAR[256] :IN,REAL RETVAL :OUT) EXTFCTP BOOL STRTOBOOL(CHAR STRVAR[256] :IN,BOOL RETVAL :OUT) EXTFCTP BOOL STRTOINT(CHAR STRVAR[256] :IN,INT RETVAL :OUT) EXTFCTP BOOL STRTOSTRING(CHAR STRVAR[256] :IN,CHAR RETVAL[256] :OUT) EXTFCTP BOOL STRTOFRAME(CHAR STRVAR[256] :IN,FRAME RETVAL :OUT) EXTFCTP BOOL STRTOPOS(CHAR STRVAR[256] :IN,POS RETVAL :OUT) EXTFCTP BOOL STRTOE3POS(CHAR STRVAR[256] :IN,E3POS RETVAL :OUT) EXTFCTP BOOL STRTOE6POS(CHAR STRVAR[256] :IN,E6POS RETVAL :OUT) EXTFCTP BOOL STRTOAXIS(CHAR STRVAR[256] :IN,AXIS RETVAL :OUT) EXTFCTP BOOL STRTOE3AXIS(CHAR STRVAR[256] :IN,E3AXIS RETVAL :OUT) EXTFCTP BOOL STRTOE6AXIS(CHAR STRVAR[256] :IN,E6AXIS RETVAL :OUT) EXTFCTP VAR_TYPE VARTYPE(CHAR VAR_STR[80] :IN) EXTFCTP REAL FRAND(REAL MIN_VAL :IN,REAL MAX_VAL :IN) EXTFCTP INT GETVARSIZE(SYS_VARS MESSAGENO :IN) EXTFCTP INT MAXIMIZE_USEDXROBVERS() EXTFCTP INT SET_USEDXROBVERS(INT MAJORVERS :IN,INT MINORVERS :IN) EXTFCTP INT SET_OPT_FILTER(E6POS TARGETPOS :IN)
-
Actually ,there is a system build-in function for timer limit: EXTFCTP BOOL TIMER_LIMIT (REAL SECONDS:IN)
It returns true , when the timer is out. FOR EXAMPLE:
WAIT FOR $IN[1] AND TIMER_LIMIT(10)
-
For EntertainTech option, firstly you have to install it on your robot controller, and then you can put your generated emily files into robot controller,for the next step , it's needed to create a program to open the motion interface for Emily files based on the option program library.No worry, if you have that option, definitely, you will know how to handle it with the reference of the manual. Thanks
Thanks. Can you explain, shortly, the process of setting up entertainTECH on the robot and how to play the .emily file?
-
As far as i know, EntertainTech and CNC are both using EMI (External Motion interface) for real time motion,and it's completely different from RSI .But regarding of Ready2_Animate, i have no idea if it's similar to EntertainTech.If you want to have a try , you can provide the generated emily file and i can help you have a test with the entertainTECH in my OfficePC.
-
Hello Jonas,
Really sorry for my late reply.With the quick review of your project, it seems nothing iw wrong with configuration ,except the EK1110. You can have a try to connect the network cable between Beckhoff PLC and EL6695 in port , and reconfigure the project in TwinCAT side .Actually i have been working on a project between Beckhoff PLC and KUKA robot via EL6692,it works with kuka controller as EtherCAT secondary. If you want it, please leave your email address and i will share it with you .
Regards
Andrew -
Only with the view of pictures is there nothing wrong with configuration in KRC4 side.The topology you provide was not correct in my opinion,as of EK1110, it links out with EtherCAT slave,however, for EL6695-1001 port-in, its links with EtherCAT master .In the enclosure, you can check the two ways of links between KRC4 and beckhoff PLC.Only when KRC works as the primary , the field bus FSOE can be used. If it's OK, it's better to provide the TwinCAT project for the diagnonis .
-
First of all , you need to have Hardware-EtherCAT Master-Master Bridge :
1.Without FSOE: EL6692 (you can order from Beckhoff)
2.With FSOE :EL6695-1001( Can Only be ordered from KUKA )In the attachment, you can find the configuration in the KRC4 side.For the other master device , you have to read its manual or consult for its support .
Hope this could be helpful to you .
Regards
Andrew -
Hi Wang,
This is my first time that I hear about the FSD, Should I have to pay extra money for this FSD package? I already have RSI/EKX packages.
And your ID seems like a Chinese name, Are you in China or TW/HK?
Hope to get your reply.
Anson.
Hi Anson,
Yes,I'm a chinese from Shanghai .If you don't wanna pay extra money, RSI will be the better option .Regards
Andrew -
If robot only sends coordinates to external in RT, FSD(Fast send driver ) will be the best Option.See the attached figure for more details.
-
Thank you Panic Mode and SkyeFire!
Sorry I did not construct my post clearly. The Robot is master to it. Though the robot is also slave to the PLC. I only used that module for gripper activities on the robot.
I finally found a way out. For those who may find it useful later, this is what I did. I wrote a separate .sub program and called it in the sps.sub.Code
Display MoreDEF StopMessage() ;; =================================================== ;; Stopmessage ;; ;; Forward $Stopmess - message number to Robot PLC/HMI ;; =================================================== IF $STOPMESS THEN IF (mbx_rec($stopmb_id,mld) == 0) THEN zStopmessPointer = mld.messno IF zStopmessPointer <= 4096 THEN bStopmessState[zStopmessPointer] = (mld.state == 1) ENDIF zStopmessPointer = 0 ENDIF bResetStopmess=TRUE ELSE IF bResetStopmess THEN ; reset messages bResetStopmess = FALSE FOR zStopmessPointer = 1 TO 4096 bStopmessState[zStopmessPointer] = FALSE ENDFOR ENDIF ENDIF END
I fetch the KSS message/error number out of the array that was declared in a separate .dat file and this is used to send signals to the PLC
CodeDEFDAT StopMessage PUBLIC BOOL bResetStopmess INT zStopmessPointer DECL STOPMESS MLD GLOBAL BOOL bStopmessState[4096] ENDDAT
Thank you!
Congratulations! But i have to say this sub program is nearly the same as the submit program I used couple of years ago :
DEF StopMessage( )
;; ===================================================
;; Stopmessage
;;
;; Forward $Stopmess - message number to Robot PLC/HMI
;; ===================================================IF $STOPMESS THEN
IF (mbx_rec($stopmb_id,mld) == 0) THEN
zStopmessPointer = mld.messno
IF zStopmessPointer <= 4096 THEN
bStopmessState[zStopmessPointer] = (mld.state == 1)
ENDIF
zStopmessPointer = 0
goStopmessErrorNr = 0
REPEAT
zStopmessPointer = zStopmessPointer + 1
IF bStopmessState[zStopmessPointer] THEN
goStopmessErrorNr = zStopmessPointer
ENDIF
UNTIL ((zStopmessPointer == 4096) OR (goStopmessErrorNr <> 0))
ENDIF
bResetStopmess=TRUE
ELSE
IF bResetStopmess THEN
; reset messages
bResetStopmess = FALSE
goStopmessErrorNr = 0
FOR zStopmessPointer = 1 TO 4096
bStopmessState[zStopmessPointer] = FALSE
ENDFOR
ENDIF
ENDIFEND
This reminds me a lot ,thanks