Posts by Angelos Stathis

    Where can I find the router program?

    Nevermind, I found some cmd commands to execute in the VM that do the work of the router program:

    Create connection:

    netsh interface portproxy add v4tov4 listenaddress= listenport=23 connectaddress= connectport=23

    I configured the ports to be the same for simplicity once deployed to an actual controller (for KLI).

    The listen IP/port are the ones defined in the .xml config file, while the contact is the external system (OL VM has an IP of

    Delete connection:

    netsh interface portproxy delete v4tov4 listenaddress= listenport=23

    I've made some .bat files for convenience (in my case I use 2 connections, one being Telnet)

    To install .NET Framework 3.5 on OL's VM you will need to do the following (worked for me):

    You need to download the .iso file of the exactly same windows version, where inside you can find the folder /sources/sxs/

    You will need to share this folder with the VM to copy it somewhere (or use a USB), I copied it on disk D.

    Then you need to open cmd with administrator privileges and run the following command:

    "dism /online /enable-feature /featurename:NetFX3 /all /Source:d:sources\sxs /LimitAccess"

    where you can see, you source the folder mentioned.

    I did this and afterwards the EthernetKRL_Server.exe started to work.

    Hope this helps!

    1. Thanks!

    2. Yes, let me rephrase, I would like to create a function to return a char array (or even any array), something like that:

    DEFFCT CHAR[] My_function()
       CHAR RESULT[]
       ; do something 

    3+4. The idea was to create a huge table of REAL and just copy paste it into the controller in a form of a matrix. In a form of a .dat or any other text file

    5. Thanks! I've downloaded the appropriate version of the manual

    Information: KRC4 Compact KSS 8.6.7 KR 6 R900

    Additional Software: EthernetKRL 3.1.2 KUKA.PROFINET MS 5.0.3 DiagnosisSafety 3.1.5 KUKA.DeviceConnector 2.1.4

    Greetings forum,

    I have some questions about KRL:

    1) Is there a BREAK command to exit loops?

    2) Is it possible to create a function that returns a string?

    3) Is it possible to initialize a matrix at once? Something like data[] = [1 3 5; 2 4 6; 7 8 10] (3x3)

    4) Is there a max file size? I have only found about the 2000 lines limit

    Greetings Forum,

    I'd like your help.


    KRC4 Compact

    KSS 8.6.7

    KR 6 R900

    Additional Software:

    EthernetKRL 3.1.2


    DiagnosisSafety 3.1.5

    KUKA.DeviceConnector 2.1.4

    X11 not yet configured

    I am trying to ping the robot controller from my desktop. Desktop & controller are both on a switch, along with a Cognex camera (that I'm going to establish communication with), which connects to a router for internet.

    My Ethernet cable is connected to X66.

    Inside the manuals I discovered that "PROFINET automatically occupies the virtual interface “virtual5”. This must be adapted to PROFINET"

    So as instructed, I created virtual6, with the IP and Subnet mask I want for my LAN (checked as windows interface).

    Please see .zip file for included photos.

    My problem is that I cannot even ping the controller. Even the led light on the switch for link/act remains dark. Wire-shark doesn't detect any packages. I have 0 response.

    I am also not using one of three reserved subnets.




    I understand that this is an easy task, what am I missing?

    Hello, thank you all for your answers,

    So SkyeFire, what you are saying is to use SPS as one thread, that does the communication and fills the ring buffer,
    And on the other side, a program (level 1 as you say) that reads the buffer and moves the robot and acts as a second thread?

    If so, using the $config.dat I can declare a global buffer and all the global variants (boolean) I need to control the data race between the 2 threads, right?

    I have made a simple program using C_PTP commands that moves the robot by a step of 0.01 degrees, by altering the $APO_DIS_PTP[1..6] values and it works as expected.

    I have attached my very simple .rsi and .src programs that I use with RSI.
    I have noticed that it takes about ~100ms to switch between axiscorr and poscorr. I make switches every 180 cycles.
    I use sen_pint[1](named status) to switch between the modes.
    As you can see in the log files, the robot reads the sen_pint value after a cycle or two, but it takes ~37 cycles to stop the execution and switch (see receive_log)
    There are also some other irregularities I do not understand (cycle_log: cycles 0, 1, 2, 221)
    Any ideas?
    By the way I use T1 and I have disabled the error messages by setting RSIERRMSG=FALSE just to see how fast it goes

    So I am using RSI 3.1 on a krc4 and I have successfully managed to move the robot everywhere I want (I have set the limitations way greater than 5mm or 5 degrees).
    I am using T1 at 10% speed.
    When I try to send a correction greater than 0.15 mm in a cycle (12ms) the robot breaks harshly, really bad for a movement or two until an exceeding speed error message pops up.
    So I am asking, how does RSI plan its movements, are they similar to PTP motions where maximum speed and acceleration are defined?
    Or something different?
    I am planing to move the robot with rsi in the whole workspace and I want it to move as fast as possible in a controlled and mannered way.

    I have revised my code, it still works as fast, but it seems I keep sending a false datagram to the controller. Does anyone know what type of data the controller expects to receive?
    I keep sending my char sendbuf[2048]; array, but I only send the useful data, without a null terminating character ( \0 ) or a newline character (\n). I have tried adding them to the end with no success.
    my code:

    //--Send data:
    sprintf_s(sendbuf, "<Sen Type=\"ImFree\">\n<EStr>KRCnexxt - RSI Object ST_ETHERNET</EStr>\n<RKorr X=\"%.4f\" Y=\"%.4f\" Z=\"%.4f\" A=\"%.4f\" B=\"%.4f\" C=\"%.4f\" />\n<AKorr A1=\"%.4f\" A2=\"%.4f\" A3=\"%.4f\" A4=\"%.4f\" A5=\"%.4f\" A6=\"%.4f\" />\n<EKorr E1=\"%.4f\" E2=\"%.4f\" E3=\"%.4f\" E4=\"%.4f\" E5=\"%.4f\" E6=\"%.4f\" />\n<Tech T21=\"%.2f\" T22=\"%.2f\" T23=\"%.2f\" T24=\"%.2f\" T25=\"%.2f\" T26=\"%.2f\" T27=\"%.2f\" T28=\"%.2f\" T29=\"%.2f\" T210=\"%.2f\" />\n<DiO>%d</DiO>\n<IPOC>%s</IPOC>\n</Sen>",
    X, Y, Z, A, B, C,
    A1, A2, A3, A4, A5, A6,
    E1, E2, E3, E4, E5, E6,
    T21, T22, T23, T24, T25, T26, T27, T28, T29, T210,

    iSendResult = sendto(Socket, sendbuf, strlen(sendbuf), 0, (SOCKADDR *)& client, sizeof(struct sockaddr_in));

    So I have created a simple c++ server program that transmits to the robot controller (krc4) the data packet that is shown in the example server program.
    I transmit back the same ipoc timestamp that the robot sends me each time, since I noticed its the only thing that changes.
    According to my code, I transmit data every 0.5 ms, but the delay keeps going up, until it stops the robot.
    Any ideas to what I'm missing?

    I have reached 2.6 million successful transmissions with a maximum delay of 10000, in 130 seconds

    So I use $ADVANCE = 5 for example and I send to the robot one or two or three points

    how would the code be?

    If I use PTP P1 C_PTP wouldn't it stop when reaching P1?
    Even if i do:

    PTP P1 C_PTP
    PTP P2 C_PTP
    PTP P3 C_PTP ?

    I need to interrupt the movement command somehow (without the robot braking), don't I? And then use another movement command

    Btw the points I want to move to are really close, like 1 degree away or 1 mm away

    UPDATE: I managed to get everything working properly by following this thread:…rum/rsi-ethernet-example/

    My settings:

    Controller (virtual5) checked as windows interface
    Subnet Mask:

    RSI (virtual6)
    Subnet Mask:
    Address Type: Mixed IP Address
    Queue: Filter 6
    Filter 6: Filter Type: IP Protocol
    Filter 6: IP Addresss:
    Filter 6: Subnet Mask:
    Filter 6: Parameters: 17

    Remote PC KLI
    Subnet Mask:
    Default Gateway:

    Remote PC RSI
    Subnet Mask: