Database/Template Automation

Database/Template Automation

CKCNC
Enthusiast Enthusiast
1,507 Views
14 Replies
Message 1 of 15

Database/Template Automation

CKCNC
Enthusiast
Enthusiast

Hello,

 

I am trying to build a string based on tool.name inside a FOREACH LOOP that  references a generic cutting data string.

 

However; I get an error in the example/ macro below when trying to populate the $SPEED and $FPR fields inside the loop. 

 

------------------

I can populate with a standard string. 

--------------------

REAL $SPEED = "0"

STRING $P20_SPEED = "200"

$SPEED = $P20_SPEED 

PRINT $SPEED 

--------------------------

 RESULT:

-------------------------

PowerMill> 200

 

 

-------------------

-------------------

 I can not get the following to work.

---------------------

REAL $SPEED = "0"

PRINT $SPEED

 

STRING $DC1500303_P20_SPEED= "200"

PRINT $DC1500303_P20_SPEED

 

STRING $toolname = substring("$tool.name",0,11)

PRINT $toolname

 

STRING $toolnamecomp = replace("$toolname","-","")

PRINT $toolnamecomp

 

STRING $P20_SPEED = "$"+ $toolnamecomp + "_P20_SPEED"

PRINT $P20_SPEED

$SPEED = $P20_SPEED 

 

PRINT $SPEED 

--------------------

RESULT IN POWERMILL

-------------------

0.0

200

DC150-03-03

DC1500303

$DC1500303_P20_SPEED

ERROR:

Expression " could not be evaluated within the context of parameter of 'SPEED'

$SPEED = $P20_SPEED

 

 

--------------------

Below is the macro I am trying to troubleshoot

---------------------
//PROMPT USER FOR MATERIAL CHOICE
STRING ARRAY material[] = {"SS-420", "H-13", "P-20"}
INT C = INPUT CHOICE $material "What material are you machining?"


REAL $SPEED = "0"
REAL $FPR = "0"


// BELOW ARE STRINGS WITH CUTTING DATA RELEVENT TO A 3mm DIAMETER DRILL 

STRING $dc1500303_SS420_SPEED = "195"
STRING $dc1500303_SS420_FPR = "($tool.diameter*.015)+.0018"
STRING $dc1500303_H13_SPEED = "210"
STRING $dc1500303_H13_FPR = "($tool.diameter*.009)+.0018"
STRING $dc1500303_P20_SPEED = "250"
STRING $dc1500303_P20_FPR = "($tool.diameter*.02)+.0022"

 

STRING $dc1500503_SS420_SPEED = "193"
STRING $dc1500503_SS420_FPR = "($tool.diameter*.014)+.0016"
STRING $dc1500503_H13_SPEED = "200"
STRING $dc1500503_H13_FPR = "($tool.diameter*.0085)+.0017"
STRING $dc1500503_P20_SPEED = "242"
STRING $dc1500503_P20_FPR = "($tool.diameter*.015)+.0019"

 

STRING $dc1500803_SS420_SPEED = "195"
STRING $dc1500803_SS420_FPR = "($tool.diameter*.013)+.0015"
STRING $dc1500803_H13_SPEED = "205"
STRING $dc1500803_H13_FPR = "($tool.diameter*.009)+.0017"
STRING $dc1500803_P20_SPEED = "240"
STRING $dc1500803_P20_FPR = "($tool.diameter*.015)+.0019"

 

STRING $dc1501203_SS420_SPEED = "180"
STRING $dc1501203_SS420_FPR = "($tool.diameter*.012)+.0014"
STRING $dc1501203_H13_SPEED = "195"
STRING $dc1501203_H13_FPR = "($tool.diameter*.007)+.0017"
STRING $dc1501203_P20_SPEED = "235"
STRING $dc1501203_P20_FPR = "($tool.diameter*.01)+.0018"

 

// LOOP THROUGH FOLDER AND POPULATE CUTTING DATA BASED ON USER SELECTION

FOREACH tl IN FOLDER('Tool\Drills\Solid Carbide (00.0000-00.2362in / 00.000-06.000mm)') {
ACTIVATE TOOL $tl

 

//TOOL NAMES HAVE A "-" IN THEM WHICH PM DOESN'T SEEM TO LIKE SO STRINGS BELOW STRIP THIS
// OUT OF THE TOOL NAME

STRING $toolname = substring("$tool.name",0,11)
STRING $toolnamecomp = replace("$toolname","-","")

 

IF $C==0 {
//Set the cutting data for SS-420
$SPEED ="$" + "$toolnamecomp" +"_SS420_SPEED"
$FPR = "$" + "$toolnamecomp" + "_SS420_FPR"
//THIS NAVIGATES TO APPROPRIATE FIELDS TO BE POPULATED
EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL $tl QUIT FORM CUTDATAEDITOR
EDIT TOOL $tl SURFACESPEED $SPEED
EDIT TOOL $tl FEEDPERTOOTH $FPR

 

} ELSEIF $C==1 {
//Set the cutting data for H-13
$SPEED ="$" + "$toolnamecomp" +"_H13_SPEED"
$FPR = "$" + "$toolnamecomp" + "_H13_FPR"


//THIS NAVIGATES TO APPROPRIATE FIELDS TO BE POPULATED
EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL $tl QUIT FORM CUTDATAEDITOR
EDIT TOOL $tl SURFACESPEED $SPEED
EDIT TOOL $tl FEEDPERTOOTH $FPR

 

} ELSEIF $C==2 {
//Set the cutting data for P-20
$SPEED ="$" + "$toolnamecomp" +"_P20_SPEED"
$FPR = "$" + "$toolnamecomp" + "_P20_FPR"
//THIS NAVIGATES TO APPROPRIATE FIELDS TO BE POPULATED
EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL $tl QUIT FORM CUTDATAEDITOR
EDIT TOOL $tl SURFACESPEED $SPEED
EDIT TOOL $tl FEEDPERTOOTH $FPR
}


DEACTIVATE TOOL
RESET LOCALVARS
GRAPHICS UNLOCK
DIALOGS MESSAGE ON

 

 

0 Likes
Accepted solutions (1)
1,508 Views
14 Replies
Replies (14)
Message 2 of 15

TK.421
Advisor
Advisor

@CKCNC wrote:

-------------------

-------------------

 I can not get the following to work.

---------------------

REAL $SPEED = "0"

PRINT $SPEED

 

STRING $DC1500303_P20_SPEED= "200"

PRINT $DC1500303_P20_SPEED

 

STRING $toolname = substring("$tool.name",0,11)

PRINT $toolname

 

STRING $toolnamecomp = replace("$toolname","-","")

PRINT $toolnamecomp

 

STRING $P20_SPEED = "$"+ $toolnamecomp + "_P20_SPEED"

PRINT $P20_SPEED

$SPEED = $P20_SPEED 

 

PRINT $SPEED 

--------------------

RESULT IN POWERMILL

-------------------

0.0

200

DC150-03-03

DC1500303

$DC1500303_P20_SPEED

ERROR:

Expression " could not be evaluated within the context of parameter of 'SPEED'

$SPEED = $P20_SPEED


at a glance, $speed needs to be a string, not a real. 

 


the numbers never lie
0 Likes
Message 3 of 15

Anonymous
Not applicable

You can get it to work by converting the string to real while you are setting the value.

 

Try this:

 

 

REAL $SPEED = 0

STRING $P20_SPEED = "200"

$SPEED = REAL($P20_SPEED) 

 

0 Likes
Message 4 of 15

CKCNC
Enthusiast
Enthusiast

Thanks for your answers and you are both correct in your solutions however the problem I am trying to solve is making this work in the  FOREACH LOOP.  Wherein I "build" a string within the FOREACH that references a previously defined string. (Please see originally posted macro).

 

Thanks again for your help!

 

Here are some more examples:

 

 

//--------------------------------------------------------------
//Manual data entry through UI (THIS WORKS)

ACTIVATE TOOL "DC150-03-03.400A1-WJ30RE"

EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL "DC150-03-03.400A1-WJ30RE" QUIT FORM CUTDATAEDITOR
EDIT TOOL "DC150-03-03.400A1-WJ30RE" SURFACESPEED "500"

 

 

 

 

//--------------------------------------------------------------
// data entry via REAL() (THIS WORKS)


ACTIVATE TOOL "DC150-03-03.400A1-WJ30RE"

REAL $SPEED = "200"

EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL "DC150-03-03.400A1-WJ30RE" QUIT FORM CUTDATAEDITOR
EDIT TOOL "DC150-03-03.400A1-WJ30RE" SURFACESPEED $SPEED

 

 


//--------------------------------------------------------------
// data entry via REAL()that refrences another string (THIS WORKS)


ACTIVATE TOOL "DC150-03-03.400A1-WJ30RE"

REAL $SPEED = 0
PRINT $SPEED

STRING $P20_SPEED= "200"
$SPEED = REAL($P20_SPEED)


EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL "DC150-03-03.400A1-WJ30RE" QUIT FORM CUTDATAEDITOR
EDIT TOOL "DC150-03-03.400A1-WJ30RE" SURFACESPEED $SPEED

 

 

 

//--------------------------------------------------------------
// data entry via REAL() that builds a list of charactors which
// references previously created string (THIS DOES NOT WORK)

 

ACTIVATE TOOL "DC150-03-03.400A1-WJ30RE"

REAL $SPEED = 0

STRING $DC1500303_P20_SPEED= "200"
STRING $toolname = substring("$tool.name",0,11)
STRING $toolnamecomp = replace("$toolname","-","")
STRING $P20_SPEED = "$"+ $toolnamecomp + "_P20_SPEED"
$SPEED = REAL($P20_SPEED)


EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL "DC150-03-03.400A1-WJ30RE" QUIT FORM CUTDATAEDITOR
EDIT TOOL "DC150-03-03.400A1-WJ30RE" SURFACESPEED $SPEED

0 Likes
Message 5 of 15

Anonymous
Not applicable

Just guessing here as I have not tested this but try something like this:

 

 

STRING $VarName = $toolnamecomp + "_P20_SPEED"

STRING $P20_SPEED = ${$VarName}

$SPEED = REAL($P20_SPEED)

 

0 Likes
Message 6 of 15

TK.421
Advisor
Advisor

what is this for:

 

EDIT TOOL FEEDSPEED SELECT 0 4

 

sorry, i dont have powermill open now; trying to do all this from my head

 


the numbers never lie
0 Likes
Message 7 of 15

rafael.sansao
Advisor
Advisor

Here's a simplified example of how to do this:

STRING ARRAY material[] = {"SS-420", "H-13", "P-20"}
INT C = INPUT CHOICE $material "What material are you machining?"

FOREACH $tl IN FOLDER('TOOL') {
	REAL $SPEED = 0
	REAL $FPR = 0
	IF $C==0 {
		//Set the cutting data for SS-420
		$SPEED = 100
		$FPR = 0.1
	} ELSEIF $C==1 {
		//Set the cutting data for H-13
		$SPEED = 200
		$FPR = 0.2
	} ELSEIF $C==2 {
		//Set the cutting data for P-20
		$SPEED = 300
		$FPR = 0.3
	}
	$tl.CuttingSpeed.finishing.drill = $SPEED
	$tl.FeedPerTooth.finishing.drill = $FPR
}

Rafael Sansão

OptiNC - www.optinc.tech

EESignature

0 Likes
Message 8 of 15

CKCNC
Enthusiast
Enthusiast

Please see attached picture.

My apologies for having a poorly labeled macro

0 Likes
Message 9 of 15

CKCNC
Enthusiast
Enthusiast

Rafael,

 

Thanks for the simplified version.

Cutting data for a family of drills seems to have a curve to it, meaning smaller diameters have a smaller relative feed/rev while the larger drills seem to have an upper limit. (see attached graph).

To me this makes it difficult to have a speed or feed/rev based on just a factor of diameter, or a Speed that can be used universally. Below are my reasons why I am approaching in this manner, I would welcome any input on this.

 

The solution I am attempting:

Define a series of STRINGS that have cutting data based on a specific tool family, diameter, LxD for each material, then create a FOREACH that builds a string based off of tool name to then reference a specific string. this would populate the cutting data. I admit that this approach would require creating roughly 125 STRING variables, but the benefit is any drill I purchase from this supplier with diameter 3mm-20mm and LxD of 3xD-30xD can simply be added to this template and the same macro run over again to add cutting data to it. If I need to add a material, then I create another 20-30 or so variables based on observed tool life/performance. With this method I could create an infinite number of drills within this family and I would already have the cutting data without looking up in the catalog, referencing other tools, looking though excel sheets etc. Also no redundancies in tool database. (screen shot for reference)

 

For those reasons this seems like a viable solution provided I can build a string variable, evaluate it, then make it = to a REAL.

 

Thoughts?

 

 

Thanks again for your time and input,

Cody

 

 

0 Likes
Message 10 of 15

rafael.sansao
Advisor
Advisor
Accepted solution

Try this (Note the lines in red color😞

//PROMPT USER FOR MATERIAL CHOICE
STRING ARRAY material[] = {"SS-420", "H-13", "P-20"}
INT C = INPUT CHOICE $material "What material are you machining?"

REAL $SPEED = 0
REAL $FPR = 0

// BELOW ARE STRINGS WITH CUTTING DATA RELEVENT TO A 3mm DIAMETER DRILL 
STRING $dc1500303_SS420_SPEED = "195"
STRING $dc1500303_SS420_FPR = "$tool.diameter*.015+.0018"
STRING $dc1500303_H13_SPEED = "210"
STRING $dc1500303_H13_FPR = "$tool.diameter*.009+.0018"
STRING $dc1500303_P20_SPEED = "250"
STRING $dc1500303_P20_FPR = "$tool.diameter*.02+.0022"

STRING $dc1500503_SS420_SPEED = "193"
STRING $dc1500503_SS420_FPR = "$tool.diameter*.014+.0016"
STRING $dc1500503_H13_SPEED = "200"
STRING $dc1500503_H13_FPR = "$tool.diameter*.0085+.0017"
STRING $dc1500503_P20_SPEED = "242"
STRING $dc1500503_P20_FPR = "$tool.diameter*.015+.0019"

STRING $dc1500803_SS420_SPEED = "195"
STRING $dc1500803_SS420_FPR = "$tool.diameter*.013+.0015"
STRING $dc1500803_H13_SPEED = "205"
STRING $dc1500803_H13_FPR = "$tool.diameter*.009+.0017"
STRING $dc1500803_P20_SPEED = "240"
STRING $dc1500803_P20_FPR = "$tool.diameter*.015+.0019"

STRING $dc1501203_SS420_SPEED = "180"
STRING $dc1501203_SS420_FPR = "$tool.diameter*.012+.0014"
STRING $dc1501203_H13_SPEED = "195"
STRING $dc1501203_H13_FPR = "$tool.diameter*.007+.0017"
STRING $dc1501203_P20_SPEED = "235"
STRING $dc1501203_P20_FPR = "$tool.diameter*.01+.0018"

FOREACH $tl IN FOLDER('TOOL') {
	STRING $toolname = substring("$tool.name",0,11)
	STRING $toolnamecomp = replace("$toolname","-","")
	IF $C==0 {
		//Set the cutting data for SS-420
		$SPEED = REAL(evaluate("$" + "$toolnamecomp" +"_SS420_SPEED"))
		$FPR = REAL(evaluate("$" + "$toolnamecomp" + "_SS420_FPR"))
	} ELSEIF $C==1 {
		//Set the cutting data for H-13
		$SPEED = REAL(evaluate("$" + "$toolnamecomp" +"_H13_SPEED"))
		$FPR = REAL(evaluate("$" + "$toolnamecomp" + "_H13_FPR"))
	} ELSEIF $C==2 {
		//Set the cutting data for P-20
		$SPEED = REAL(evaluate("$" + "$toolnamecomp" +"_P20_SPEED"))
		$FPR = REAL(evaluate("$" + "$toolnamecomp" + "_P20_FPR"))
	}
	$tl.CuttingSpeed.finishing.drill = $SPEED
	$tl.FeedPerTooth.finishing.drill = $FPR / $tool.Diameter
}

Rafael Sansão

OptiNC - www.optinc.tech

EESignature

0 Likes
Message 11 of 15

CKCNC
Enthusiast
Enthusiast

Rafael,

 

Thanks again for your continued help with this.

I have attached a couple pictures for reference.

 

I was getting an error with the STRING variables that referenced $tool.name because it was outside the FOREACH.

 

Once I moved the STRINGS inside the FOREACH the code worked*

 

However;

$tl.FeedPerTooth.finishing.drill = $FPR   

 

//populated the field incorrectly (SEE PICTURE "ODD FPR")

 

While;

EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL $tl QUIT FORM CUTDATAEDITOR
EDIT TOOL $tl SURFACESPEED $SPEED
EDIT TOOL $tl FEEDPERTOOTH $FPR

 

//populated the field correctly (SEE PICTURE "CORRECT FPR")

 

Any idea as to what would cause this?

WORKING CODE BELOW:

 


GRAPHICS LOCK
DIALOGS MESSAGE OFF
DEACTIVATE TOOL


STRING ARRAY material[] = {"SS-420", "H-13", "P-20"}
INT C = INPUT CHOICE $material "What material are you machining?"


REAL $SPEED = "0"
REAL $FPR = "0"


FOREACH $tl IN FOLDER('Tool\Drills\Solid Carbide (00.0000-00.2362in / 00.000-06.000mm)') {
ACTIVATE TOOL $tl

STRING $dc1500303_SS420_SPEED = "195"
STRING $dc1500303_SS420_FPR = "$tool.diameter*.015+.0018"
STRING $dc1500303_H13_SPEED = "210"
STRING $dc1500303_H13_FPR = "$tool.diameter*.009+.0018"
STRING $dc1500303_P20_SPEED = "195"
STRING $dc1500303_P20_FPR = "$tool.diameter*.02+.0022"

STRING $toolname = substring("$tool.name",0,11)
PRINT $toolname
STRING $toolnamecomp = replace("$toolname","-","")
PRINT $toolnamecomp

IF $C==0 {
//Set the cutting data for SS-420
$SPEED = REAL(evaluate("$" + "$toolnamecomp" +"_SS420_SPEED"))
$FPR = REAL(evaluate("$" + "$toolnamecomp" + "_SS420_FPR"))
EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL $tl QUIT FORM CUTDATAEDITOR
EDIT TOOL $tl SURFACESPEED $SPEED
EDIT TOOL $tl FEEDPERTOOTH $FPR

} ELSEIF $C==1 {
//Set the cutting data for H-13
$SPEED = REAL(evaluate("$" + "$toolnamecomp" +"_H13_SPEED"))
$FPR = REAL(evaluate("$" + "$toolnamecomp" + "_H13_FPR"))
EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL $tl QUIT FORM CUTDATAEDITOR
EDIT TOOL $tl SURFACESPEED $SPEED
EDIT TOOL $tl FEEDPERTOOTH $FPR
} ELSEIF $C==2 {
//Set the cutting data for P-20
$SPEED = REAL(evaluate("$" + "$toolnamecomp" +"_P20_SPEED"))
$FPR = REAL(evaluate("$" + "$toolnamecomp" + "_P20_FPR"))
EDIT TOOL FEEDSPEED SELECT 0 4
EDIT TOOL $tl QUIT FORM CUTDATAEDITOR
EDIT TOOL $tl SURFACESPEED $SPEED
EDIT TOOL $tl FEEDPERTOOTH $FPR
}
PRINT $SPEED
PRINT $FPR


}

DEACTIVATE TOOL
RESET LOCALVARS
GRAPHICS UNLOCK
DIALOGS MESSAGE ON

0 Likes
Message 12 of 15

rafael.sansao
Advisor
Advisor

Replace:

 

$FPR = REAL(evaluate("$" + "$toolnamecomp" + "_P20_FPR"))

By:

 

 

$FPR = REAL(evaluate("$" + "$toolnamecomp" + "_P20_FPR")) / $Tool.Diameter

Rafael Sansão

OptiNC - www.optinc.tech

EESignature

0 Likes
Message 13 of 15

CKCNC
Enthusiast
Enthusiast

Rafael,

 

It worked*

 

Please see attached picture "magic"

 

The final result is .01 in the feed/tooth field but $FPR does not = .01

how is this possible?

What am I missing?

 

 

0 Likes
Message 14 of 15

rafael.sansao
Advisor
Advisor

FEEDPERTOOTH is defined by default in units of diameter of the tool, ie you need to divide the feed by the diameter of the tool.

To view the feed in UDF, check this option:

Capturar.PNG

Rafael Sansão

OptiNC - www.optinc.tech

EESignature

Message 15 of 15

CKCNC
Enthusiast
Enthusiast

Rafael,

 

Thanks for the help and explanation, I believe you have solved my problem.

Very much appreciated.

 

Cody