Posts by Nation

    There are several ways to do what you are asking.


    I would recommend using an offset based on a position register.


    You could hard code the offset in the program, or point it at a register.


    For example (hard code version):


    I too would really like to know how this is done, assuming it is even possible. I even had a thread here, but no one was able to give me an answer.

    What you are seeing in the PR is the first 6 components of a rotation matrix. If you hit the page key (F2 I think) when viewing it you will see the remaining 6 components.


    Turn $PR_CARTREP to True in the system variables. This will make the PR in a PR[XX]=UFRAME[X] command show up in normal Cartesian representation and not in matrix representation.


    Of course this very useful system variable isn't documented...

    If you want to use the robot as a pass through, you could use the interconnect screen under IO to map the robot inputs and outputs to digital inputs and outputs. I've seen that done before.

    I really like this idea. Especially since it seems that about 1/4 of all the system variables are undocumented. I've discovered a couple of nice ones just through experimentation. Other ones I've found out from some one "in the know". Do a control-F for them in the system variables document? 0 results.


    I would like to see a list of variables that are not in the current documentation, with a blurb of the theorized or observed affect of the variable is. How could Fanuc claim copyright when the variable in question is not in their documentation?


    You could categorize them so searching through them is easier. These variables directly affect the mechanical unit. These affect the motion planner. These affect how ASCII upload works. It would be far better than how Fanuc organizes their system variable document (plain A-Z).


    I've never worked with RJ, but does not it have dual-channel safety inputs to stop the robot?
    Something similar to "fence" or "servo off" on r-30iA/B.
    Safety functions should not be implemented by software, especially for human safety.
    The same applies to the press.


    I agree with Sergei on this. Implementing this in software is asking for trouble.


    I also have never worked with an RJ, but I think once you get into this old of a controller, you only have single channel safety inputs. Even still, that is better than doing it in software.

    You are stepping on the style select inputs used by the UOPs. When input 16 turns on (UOP style select 8), you are effectively telling the robot to run a style (style 128 in this case) that doesn't exist.


    In short, don't use inputs 1-18. They are mapped to the UOPs on your robot. Shame on the previous robot programmer for not labeling them. Lazy.


    That, or unassign input 16 from the UOP inputs. This is an ugly solution in my opinion.


    The same is probably true for outputs 1-20. Likely assigned to the UOP outputs.

    If you just want to use a solid light, you can use the interconnect screen under IO to connect various safety signals up to outputs. Simple and clean.


    Menu ->IO -> Interconnect -> [Select] (F3) -> "ES -> DO"



    I dont have the condition monitor list in front of me, but this would have to be done as a background program task , not in a main motion group program. I do monitoring programs like this in KAREL, not TPE. Maybe someone can chime in here and say.. does TPE programming have the ability to keep a program running, even on an abort all command? In Karel, you modify the compiler directives and can force the program to keep running indefinately , even on a Estop. Only a power cycle would stop the program.


    Others are fans of the BG Logic (background logic) and I would think maybe this could be accomplished in it too.


    Yes there is a way to do this. In the header of a .ls program, change it to the following:

    Code
    TCD:  STACK_SIZE	= 0,
          TASK_PRIORITY	= 50,
          TIME_SLICE	= 0,
          BUSY_LAMP_OFF	= 1,
          ABORT_REQUEST	= 3,
          PAUSE_REQUEST	= 7;


    This will make a tp program impossible to abort, pause, and will not light up the cycle light. It will not honor this if there is a group assigned to the program though.

    If you have an IRC5, try using HotEdit. If you want to adjust the points more than 5mm at a time though, you will have to modify a system parameter.


    That parameter is: HOTEDIT_MODPOS under the topic Controller.


    I am not sure if it is available on the S4C+.

    I ended up calling Fanuc and asking them what these do. They are the macros used to communicate to a program on a computer somewhere running the pc dev kit. Useless for what I need.


    I just wish the included macros had a bit more text inside of them that stated what they do.

    This screams to me "mechanical screw-up, make controls fix it".


    It sounds like you need to master your jigs (make them all the same) and/or the pallets carrying the jigs. Also, as Atticabob stated, how repeatable is the method you use to locate the jigs? In my experience the best method is to set the pallet carrying the jig down on a 2 way and 4 way locator.



    Hi Greg,


    I would set up user frames for each jig... If the number of jigs exceeds 10 I would simply put the frame data into PR's then pull it into the frame as needed... You could use PNS to call a specific program that holds jig number / frame number/ product number... Does the system get a BCD type input to know what fixture is in it?
    With things varying slightly... How well does the conveyor repeat position?


    On the newer controllers (R30iA and up, not sure about older), you can increase the number of user frames by manipulating the $SCR.$maxnumufram system variable. I've taken it as high as 64 frames before.

    Your program gets the old data because you are not waiting for the vision process to complete, thus running old offsets. Its like firing a gun without aiming it. Likely into your own foot.


    You need to interlock the two programs together. This can be done with a flag bit or a register.


    I've modified your programs to include an interlock. Take out all those timers, every time I see this in the field it means that there is spaghetti code ahead.


    Also, your program now has no way of failing gracefully if the vision can't find anything. I'll leave adding that as an exercise to the user.


    1st (main) program.


    Your second program.

    I'm curious as to how this DCS input/output system is considered "dual channel" when all I need is 1 opsfty input to enable or disable a zone, and also can link 1 zone to 1 output? This is not dual channel. Unless I am missing something.


    Sup three year old thread.


    See the image below.


    A1 and B1 are the inputs for a single safety input (OPSFTY1 in this case). Its dual channel since two inputs need to change state within 200ms of each other in order to actuate the input without generating a chain fault. It functions the same way the fence circuit does, or the external estop circuit.


    You can have a safe output on pins A5 and B5. When ESPDO1 is turned on, both A5 and B5 will source 24V. It is up to the user to supply hardware that checks for dual channel functionality (like a safety relay).

    Well I was unable to determine the syntax.


    I ended up doing in Karel, as much as I didn't want to.


    Here's the code (stripped down a bit):

    Pulling from a system parameter isn't even an option if I don't use mixed logic.


    If I point the PR at a number, or a bool, it works fine.


    example:

    Code
    !No invalid parameter name message. ;
    PR[98,1]=($LNSCH[1].$TRK_GRP_NUM) ;


    However, I can't figure out how to access a sub component of a position. It always says invalid parameter name.


    Stuff I have tried so far (all invalid parameter names.):


    Code
    PR[98,1]=($LNSCH[1].$TRK_FRAME.$X) ;
    PR[98,1]=($LNSCH[1].$TRK_FRAME[1].X) ;
    PR[98,1]=($LNSCH[1].$TRK_FRAME[1].$X) ;