Best Of
Re: System failure State on IRC5 IRB 2600
how to check the backup power supply ?lemster68 said:You need to check the backup power supply. It has not enough energy to successfully write the image of the controller to memory when it is shut down. Also, instead of just powering down, choose advanced, shutdown. The pendant will tell you when it is safe to turn off the controller.
Re: How to connect to the virtual controller?
Check if you have the World Wide Web Publishing Service running.
It will show as SYSTEM in resource monitor test above.
If it is running (and don't need it), disable it or set it to manual in the services MMC
You should then be able to connect.
It will show as SYSTEM in resource monitor test above.
If it is running (and don't need it), disable it or set it to manual in the services MMC

1
Feature requests - AppStudio
After using AppStudio for a short while, there are several features I would like to see implemented which I believe would greatly enhance its usability.
- Ability to use TComponents.Button to control DO directly in a momentary fashion.
Either by pulsing in onClick behaviour or by toggling in onPointDown and onPointRelease
I've been able to achieve this usingAPI.RWS.SIGNAL.setSignalValue("mySignal", 1,{}); - Ability to pass parameters to procedures when using API.RAPID.startExecution
- Ability to link components to the value of an Analog input/ouput and a Group input/output. At present only digital signals are accepted so the only way to display an AI for example is the link that AI to a num variable and connect the component to that instead.
- Ability to use at least not equal to in the component state (preferably also < and >) so that for example a component can be enabled only when a specific criteria exists.
In my case, I have a GO and I only want the component activated if the value = 2
Present functionality seemingly requires I have a state condition for all other possibilities.
Some of this might already be possible using user created functions, but the documentation seems pretty sparse in regards to interacting directly with teh controller and/or RAPID

1
Re: Deployment failed message
I solved this issue by deleting the virtual controller and after that deleting the project. I created a new project and virtual controller and it's working fine now. I still don't know what the problem was with the old virtual controller

1
Re: Looking for a way to simplify the main module for my robot
HI ...
The vector solution is very good ... my suggestion for Load is that the load instruction is already saved in the program, so when the program loads it already loads the load.
The vector solution is very good ... my suggestion for Load is that the load instruction is already saved in the program, so when the program loads it already loads the load.
If this is not possible, I suggest creating a RECORD vector, so you can pass an object that, in addition to the name of the program to be loaded, also contains the LOAD information.
Good job.

1
Re: Looking for a way to simplify the main module for my robot
Here is a snippet of how we handled loading and unloading different program modules:
! get part program from operator itemSelected:=UIListView(\Result:=buttonAnswer,\Header:="Part Selected",partProgram,\Buttons:=btnOKCancel,\Icon:=iconInfo,\DefaultIndex:=1); IF buttonAnswer=resOK THEN IF itemSelected=1 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0044.MOD"; currentfile:="FSNA0044.MOD"; %"FSNA0044:main"%; ELSEIF itemSelected=2 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0048.MOD"; currentfile:="FSNA0048.MOD"; %"FSNA0048:main"%; ELSEIF itemSelected=3 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0051.MOD"; currentfile:="FSNA0051.MOD"; %"FSNA0051:main"%; ELSEIF itemSelected=4 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0114.MOD"; currentfile:="FSNA0114.MOD"; %"FSNA0114:main"%; ELSEIF itemSelected=5 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0061.MOD"; currentfile:="FSNA0061.MOD"; %"FSNA0061:main"%; ELSEIF itemSelected=6 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0106.MOD"; currentfile:="FSNA0106.MOD"; %"FSNA0106:main"%; ELSEIF itemSelected=7 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0086.MOD"; currentfile:="FSNA0086.MOD"; %"FSNA0086:main"%; ELSEIF itemSelected=8 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0012.MOD"; currentfile:="FSNA0012.MOD"; %"FSNA0012:main"%; ELSEIF itemSelected=9 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="FSNA0117.MOD"; currentfile:="FSNA0117.MOD"; %"FSNA0117:main"%; ELSEIF itemSelected=10 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="AT0015.MOD"; currentfile:="AT0015.MOD"; %"AT0015:main"%; ELSEIF itemSelected=11 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="AT0016.MOD"; currentfile:="AT0016.MOD"; %"AT0016:main"%; ELSEIF itemSelected=12 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="AT0018.MOD"; currentfile:="AT0018.MOD"; %"AT0018:main"%; ELSEIF itemSelected=13 THEN UnLoad diskhome\File:=currentfile; Load diskhome\File:="AT0045.MOD"; currentfile:="AT0045.MOD"; %"AT0045:main"%; ELSEIF itemSelected=14 THEN GOTO StopCycle; ELSE GOTO StopCycle; ENDIF ELSE ! if user selects cancel then stop cycle GOTO StopCycle; ENDIF</code>CONST listitem partProgram{14}:=[[stEmpty,"FSNA0044 - PCS 1.5 baskets"],[stEmpty,"FSNA0048 - 33K baskets"], [stEmpty,"FSNA0051 - GE 7FA Liner"],[stEmpty,"FSNA0114 - GE 7FA Flex Liner"],[stEmpty,"FSNA0061 - GE 9FA Liner"], [stEmpty,"FSNA0106 - PCS 2.1 baskets"],[stEmpty,"FSNA0086 - VLM 1.1 baskets"],[stEmpty,"FSNA0012 - 25K baskets"], [stEmpty,"FSNA0117 - PCS 1.5 H282 baskets"],[stEmpty,"AT0015 - 33K basket assy respray"], ["","AT0016 - 2.1 basket assy respray"],["","AT0018 - Siemens prototype"],["","AT0045 - liner samples"],[stEmpty,"Stop"]]; PERS string currentfile;</pre><div><br><pre class="CodeBlock"><code>
Re: Looking for a way to simplify the main module for my robot
Create an array with the program name at each index that corresponds to the program number.
You can make the array longer with more programs.
This is just an example, there are many ways of doing this.
You can make the array longer with more programs.
MODULE NewModule PERS string ProgramList{4}:=[ "2YD_SLANT_FR_SHT", "2YD_SLANT_FR_SHT_2", "2YD_SLANT_FR_SHT_3", "2YD_SLANT_FR_SHT_4" ]; FUNC string fGetModuleName() RETURN "m_"+ProgramList{Part_Number}; ENDFUNC FUNC string fGetModuleNameWithExtension() RETURN "m_"+ProgramList{Part_Number}+".mod"; ENDFUNC FUNC string fGetRoutineName() RETURN "r_"+ProgramList{Part_Number}; ENDFUNC PROC main() !Add your code here StartLoad \Dynamic, "pc:" \File:=fGetModuleNameWithExtension(),load3; WaitLoad load3; %fGetRoutineName()%; Save fGetModuleName() \Filepath:="pc:"+fGetModuleNameWithExtension(); UnLoad "pc:/"+fGetModuleNameWithExtension(); GOTO Program_Start; ENDPROC ENDMODULE
This is just an example, there are many ways of doing this.
Re: Enabling and Using RWS on a Real Controller
Thanks for the feedback! I agree that ABB could make the "option" feature a bit clearer.
In general, the following applies:
- If you want to use the public/wan port for anything (IO,PCSDK,RWS,ROBOTSTUDIO,SOCKET..), you’ll need the PC Interface/RobotStudio Connect option.
- The IO Network is strictly for IO devices. You can’t use RobotStudio, PCSDK, RWS, or any other API on this network due to IT security reasons.
- The service/mgmt port can be used for most purposes, but its IP address is fixed at 192.168.125.1. This means you can’t connect multiple robots to the same network using this port.
Re: Need expert on ConfJ \Off
I believe, I now understood the way ConfJ \Off works.
With ConfJ \Off, the confdata of the destination robtarget is completely ignored, and the robot automatically selects the configuration that is "closest to the initial one". Unfortunately, "closest" doesn't mean fastest to reach. Indeed, the robot minimizes the rotation of joint 1, at the expense of all other joint rotation.
Here's an example of how dangerous the use of ConfJ \Off could be.
Initial position (represented with a jointtarget)
With ConfJ \Off, the confdata of the destination robtarget is completely ignored, and the robot automatically selects the configuration that is "closest to the initial one". Unfortunately, "closest" doesn't mean fastest to reach. Indeed, the robot minimizes the rotation of joint 1, at the expense of all other joint rotation.
Here's an example of how dangerous the use of ConfJ \Off could be.
Initial position (represented with a jointtarget)
jt_Debut := [[30,-20,40,-30,50,-30],[...]];
Desired pose (represented with a robtarget with a random confdata):
rt := [[386.512,-461.648,704.926],[0.0400892,0.952302,-0.121178,0.27718],[any confdata],[...]];
If I execute
ConfJ \Off;
MoveJ rt, vmax, fine, tool_something;
the robot goes to the position corresponding to the following jointtarget:
[[119.58,-6.75538,-196.451,31.2896,-46.9952,26.4324],[...]];
Thus, it moved joint 1 only 89.58°, but at the expense of moving joint 3 more than 236° !!!
Instead, it could have gone to the position corresponding to the following jointtaget:
rt := [[386.512,-461.648,704.926],[0.0400892,0.952302,-0.121178,0.27718],[any confdata],[...]];
If I execute
ConfJ \Off;
MoveJ rt, vmax, fine, tool_something;
the robot goes to the position corresponding to the following jointtarget:
[[119.58,-6.75538,-196.451,31.2896,-46.9952,26.4324],[...]];
Thus, it moved joint 1 only 89.58°, but at the expense of moving joint 3 more than 236° !!!
Instead, it could have gone to the position corresponding to the following jointtaget:
[[-60.3958,-19.2847,38.9758,29.701,50.0471,-151.154],[...]];
which is super close to the initial position, but joint 1 would have rotated 90.39°... Thus, to save less than 1° of rotation on joint 1, the robot rotates joint 3 more than 236°...
which is super close to the initial position, but joint 1 would have rotated 90.39°... Thus, to save less than 1° of rotation on joint 1, the robot rotates joint 3 more than 236°...
Re: Need expert on ConfJ \Off
Hi,
The problem is that your CalcJointT would most probably generate an error, because it needs that the confdata of the robtarget Offs(PointP,10,20,30) be correct. In your case, it might work because the offset is not that big, but if you have for example CalcJointT(RelTool(PointP,10,20,30 \Rz:= 180), it would most certainly generate an error.
Also, by the way, if you already have the jointtaget, there is no use in converting it to a robtarget. You can just use MoveAbsJ.
The way I circumvent the CalJointT restrictions is using error handling. But this is way too complicated and time consuming. I basically get all possible jointtargets corresponding to a desired end-effector pose. Then I need to find the one that is closest to my current position. Here's the code:
The problem is that your CalcJointT would most probably generate an error, because it needs that the confdata of the robtarget Offs(PointP,10,20,30) be correct. In your case, it might work because the offset is not that big, but if you have for example CalcJointT(RelTool(PointP,10,20,30 \Rz:= 180), it would most certainly generate an error.
Also, by the way, if you already have the jointtaget, there is no use in converting it to a robtarget. You can just use MoveAbsJ.
The way I circumvent the CalJointT restrictions is using error handling. But this is way too complicated and time consuming. I basically get all possible jointtargets corresponding to a desired end-effector pose. Then I need to find the one that is closest to my current position. Here's the code:
MODULE MainModule
VAR iodev jtfile;
VAR robtarget r;
VAR jointtarget tryconf;
VAR bool notfound := TRUE;
VAR bool goodconf := TRUE;
goodconf := TRUE;
VAR num cf1 := -2;
VAR num cf4 := -2;
VAR num cf6 := -2;
VAR num idx;
VAR jointtarget j{8};
PROC Main()
Open "U:"\File:="jointtargets.txt",jtfile\Write;
idx := 1;
! robtarget for which I need all possible confdata
r := CalcRobT([[100,40,-89,150,-40,-70], [9E9,9E9,9E9,9E9,9E9,9E9] ], tool0);
Write jtfile, "Position (x,y,z) : " + NumToStr(r.trans.x,3) + " mm, " \NoNewLine;
Write jtfile, NumToStr(r.trans.y,3) + " mm, " + NumToStr(r.trans.z,3) + " mm";
Write jtfile, "Orientation (az, ay, ax) : " + NumToStr(EulerZYX(\Z, r.rot),3) +" deg, " \NoNewLine;
Write jtfile, NumToStr(EulerZYX(\Y, r.rot),3) + " deg, " + NumToStr(EulerZYX(\X, r.rot),3) + " deg";
Write jtfile,"";
notfound := TRUE;
goodconf := TRUE;
FOR cfx FROM 0 TO 7 DO !looking for all solutions of the inverse kinematics
notfound := TRUE;
WHILE notfound AND cf1 <= 1 DO
WHILE notfound AND cf4 <= 1 DO
WHILE notfound AND cf6 <= 1 DO
tryconf := CalcJointT([r.trans,r.rot,[cf1,cf4,cf6,cfx],[9E9,9E9,9E9,9E9,9E9,9E9]],tool0);
IF goodconf AND tryconf.robax.rax_1 <= 180
AND tryconf.robax.rax_4 >= -180 AND tryconf.robax.rax_4 < 180
AND tryconf.robax.rax_6 >= -180 AND tryconf.robax.rax_6 < 180 THEN
j{idx} := tryconf;
Write jtfile,"j{" + NumToStr(idx,0) + "} := [[" \NoNewLine;
Write jtfile,NumToStr(tryconf.robax.rax_1,3) + "," \NoNewLine;
Write jtfile,NumToStr(tryconf.robax.rax_2,3) + "," \NoNewLine;
Write jtfile,NumToStr(tryconf.robax.rax_3,3) + "," \NoNewLine;
Write jtfile,NumToStr(tryconf.robax.rax_4,3) + "," \NoNewLine;
Write jtfile,NumToStr(tryconf.robax.rax_5,3) + "," \NoNewLine;
Write jtfile,NumToStr(tryconf.robax.rax_6,3) + "]," \NoNewLine;
Write jtfile,"[9E9,9E9,9E9,9E9,9E9,9E9]];";
idx := idx + 1;
notfound := FALSE; !des qu’on trouve une solution, on passe au prochain cfx
ENDIF
goodconf := TRUE;
cf6 := cf6 + 1;
ENDWHILE
cf6 := -2;
cf4 := cf4 + 1;
ENDWHILE
cf4 := -2;
cf1 := cf1 + 1;
ENDWHILE
cf1 := -2;
ENDFOR
Close jtfile;
ERROR
!When the confdata in CalcJointT is not good, RAPID generates the error number 1074 (ERR_ROBLIMIT)
IF ERRNO = ERR_ROBLIMIT THEN
goodconf := FALSE;
TryNext;
ENDIF
ENDPROC
ENDMODULE