Program Examples:Reverse engineering for cam table

From SoftMC-Wiki
Jump to: navigation, search
Language: English  • 中文(简体)‎

This is an example of using cam table without no a-priory knowledge on the cam data.

the file buildCam.prg executes motions and builds the cam tables according to the generated profiles.

the file app.prg is the application that uses the cam table. in this example we use tex-el application for a machine that handles textile material.


buildCam.prg (use default configuration with record.lib)

'------------------------------------------------------------------------------
' File:        buildCam.prg
' Purpose:     tex-el motion application
' Version:     1.00
' Author:      Eran Korkidi
' Description:
' History:     13-APR-2015    Created
'------------------------------------------------------------------------------


import record.lib
common shared builtCamTable as CAM

dim shared sCarriageprfRec	as string ="CRG_prf.rec"
dim shared sT2prfRec		as string ="T2_prf.rec"
dim shared sBasculaprfRec	as string ="BSC_prf.rec"
dim shared camTable[10000]	as double
dim shared camTray[10000]	as double

dim shared carriageDistance as double = 562.4
dim shared masterDistance	as double = sqrt(2)*2*562.4 ' = 1590.71
dim shared basculaDistance	as double = 210.0
dim shared carriageVcruise	as double = 424.0
dim shared masterIncrements as double
dim shared T2DistanceTotal	as double = 422.0
dim shared T2DistancePos	as double = 214.45901693934426
dim shared T2DistanceNeg	as double = 207.5409836065574
dim shared T2vcruise		as double = 100.0	'	TBD
dim shared basculaVcruise	as double = 100.0	'	TBD



program

	dim i as long

	call motionRecCarriage
	call motionRecT2
	call motionRecBascula

	call generateRecordingTableCarriage
	StoreCamData CARRIAGE.CAM builtCamTable
'	for i = 1 to builtCamTable.Size
'		Print "MasterData[" i "]=" builtCamTable.MasterData[i] " ,  SlaveData["  i "]=" builtCamTable.SlaveData[i]
'		Sleep 50
'	next
'
	call generateRecordingTableT2
	StoreCamData T2.CAM builtCamTable
'	for i = 1 to builtCamTable.Size
'		Print "MasterData[" i "]=" builtCamTable.MasterData[i] " ,  SlaveData["  i "]=" builtCamTable.SlaveData[i]
'		Sleep 50
'	next

	call generateRecordingTableBascula
	StoreCamData BASCULA.CAM builtCamTable
	for i = 1 to builtCamTable.Size
		Print "MasterData[" i "]=" builtCamTable.MasterData[i] " ,  SlaveData["  i "]=" builtCamTable.SlaveData[i]
		Sleep 10
	next


terminate program


sub motionRecCarriage
	Record$ sCarriageprfRec 10000 Gap=1 RecData = A2.IsMoving, A2.Pcmd, A2.Vfb, A2.Vcmd, A2.Pfb
	Attach A2
		A2.En=1
		Move A2 0 Vcruise=carriageVcruise Abs=TRUE 'Acc=1000 Dec=1000
		while A2.IsMoving
			Sleep 1
		end while
		RecordOn
			Sleep 40
			Move A2 carriageDistance Vcruise=carriageVcruise Abs=TRUE 'Acc=1000 Dec=1000
			while A2.IsMoving
				Sleep 1
			end while
			Move A2 0 Vcruise=carriageVcruise Abs=TRUE StartType=SUPERIMMEDIATE 'Acc=1000 Dec=1000
			while A2.IsMoving
				Sleep 1
			end while
			Sleep 40
		RecordClose
	Detach A2
end sub


sub motionRecT2
	
	Record$ sT2prfRec 10000 Gap=1 RecData = A2.IsMoving, A2.Pcmd, A2.Vfb, A2.Vcmd, A2.Pfb
	Attach A2
		A2.En=1
		Move A2 0 Vcruise=carriageVcruise Abs=TRUE
		while A2.IsMoving
			Sleep 1
		end while
		RecordOn
			Sleep 40
			Move A2 T2DistancePos  Vcruise=T2vcruise Abs=TRUE
			while A2.IsMoving
				Sleep 1
			end while
			Move A2 -T2DistanceNeg Vcruise=T2vcruise Abs=FALSE StartType=SUPERIMMEDIATE
			while A2.IsMoving
				Sleep 1
			end while
			Sleep 40
		RecordClose

		Move A2 0 Vcruise=T2vcruise Abs=TRUE
		while A2.IsMoving
			Sleep 1
		end while

	Detach A2
end sub


sub generateRecordingTableCarriage

	dim sCRSfile as string
	dim handleAddress as long = 1
	dim sCurrentLine  as string 
	dim dA2pcmd 	as double
	dim lA2ismoving as double
	dim lCommaLoc as long
	dim tableCounter as long = 0
	dim i as long

	tableCounter = 0
	
	if recconvert(sCarriageprfRec) <> 1 then
		Print "convert failed"
	else
		sCRSfile = Left$(sCarriageprfRec,Len(sCarriageprfRec)-4) + ".CSR"
		Open sCRSfile Mode="r" as #handleAddress
			sCurrentLine = input$(#handleAddress)
			while sCurrentLine <> ""
				lCommaLoc = Instr(sCurrentLine,",")
				lA2ismoving = Val(Left$(sCurrentLine, lCommaLoc-1))
				sCurrentLine = Right$(sCurrentLine,Len(sCurrentLine)- lCommaLoc)
				dA2pcmd = Val(Left$(sCurrentLine, lCommaLoc-1))
				if lA2ismoving then
					tableCounter = tableCounter + 1 
					'Print "dA2ismoving="lA2ismoving, " , dA2pcmd="dA2pcmd
					camTable[tableCounter] = dA2pcmd
				end if
				sCurrentLine = input$(#handleAddress)
			end while
		close #handleAddress
		masterIncrements = masterDistance/(tableCounter+1)
		createcamdata tableCounter+2 builtCamTable
		builtCamTable.MasterData[1] = 0.0
		builtCamTable.SlaveData[1]  = 0.0
		for i = 1 to builtCamTable.Size-2
			builtCamTable.MasterData[i+1] = masterIncrements * i
			builtCamTable.SlaveData[i+1]  = camTable[i]
		next
		builtCamTable.MasterData[builtCamTable.Size] = masterDistance
		builtCamTable.SlaveData[builtCamTable.Size]  = 0.0
	end if

end sub


sub generateRecordingTableT2

	dim sCRSfile		as string
	dim handleAddress	as long = 1
	dim sCurrentLine	as string 
	dim dA2pcmd			as double
	dim lA2ismoving		as double
	dim lCommaLoc		as long
	dim tableCounter	as long = 0
	dim i				as long

	tableCounter = 0
	
	if recconvert(sT2prfRec) <> 1 then
		Print "convert failed"
	else
		sCRSfile = Left$(sT2prfRec,Len(sT2prfRec)-4) + ".CSR"
		Open sCRSfile Mode="r" as #handleAddress
			sCurrentLine = input$(#handleAddress)
			while sCurrentLine <> ""
				lCommaLoc = Instr(sCurrentLine,",")
				lA2ismoving = Val(Left$(sCurrentLine, lCommaLoc-1))
				sCurrentLine = Right$(sCurrentLine,Len(sCurrentLine)- lCommaLoc)
				dA2pcmd = Val(Left$(sCurrentLine, lCommaLoc-1))
				if lA2ismoving then
					tableCounter = tableCounter + 1 
					'Print "dA2ismoving="lA2ismoving, " , dA2pcmd="dA2pcmd
					camTable[tableCounter] = dA2pcmd
				end if
				sCurrentLine = input$(#handleAddress)
			end while
		close #handleAddress
		masterIncrements = T2DistanceTotal/tableCounter
		createcamdata tableCounter+1 builtCamTable
		builtCamTable.MasterData[1] = 0.0
		builtCamTable.SlaveData[1]  = 0.0
		for i = 1 to builtCamTable.Size-1
			builtCamTable.MasterData[i+1] = masterIncrements * i
			builtCamTable.SlaveData[i+1]  = camTable[i]
		next
	end if

end sub



sub motionRecBascula
	Record$ sBasculaprfRec 10000 Gap=1 RecData = A2.IsMoving, A2.Pcmd', A2.Vfb, A2.Vcmd, A2.Pfb
	Attach A2
		A2.En=1
		Move A2 0 Vcruise=basculaVcruise Abs=TRUE
		while A2.IsMoving
			Sleep 1
		end while
		RecordOn
			Sleep 40
			Move A2 basculaDistance Vcruise=basculaVcruise Abs=TRUE
			while A2.IsMoving
				Sleep 1
			end while
			Move A2 0 Vcruise=basculaVcruise Abs=TRUE StartType=SUPERIMMEDIATE
			while A2.IsMoving
				Sleep 1
			end while
			Sleep 40
		RecordClose
	Detach A2
end sub




sub generateRecordingTableBascula

	dim sCRSfile as string
	dim handleAddress as long = 1
	dim sCurrentLine  as string 
	dim dA2pcmd 	as double
	dim lA2ismoving as double
	dim lCommaLoc as long
	dim tableCounter as long = 0
	dim i as long

	tableCounter = 0
	
	if recconvert(sBasculaprfRec) <> 1 then
		Print "convert failed"
	else
		sCRSfile = Left$(sBasculaprfRec,Len(sBasculaprfRec)-4) + ".CSR"
		Open sCRSfile Mode="r" as #handleAddress
			sCurrentLine = input$(#handleAddress)
			while sCurrentLine <> ""
				lCommaLoc = Instr(sCurrentLine,",")
				lA2ismoving = Val(Left$(sCurrentLine, lCommaLoc-1))
				sCurrentLine = Right$(sCurrentLine,Len(sCurrentLine)- lCommaLoc)
				dA2pcmd = Val(Left$(sCurrentLine, lCommaLoc-1))
				if lA2ismoving then
					tableCounter = tableCounter + 1 
					'Print "dA2ismoving="lA2ismoving, " , dA2pcmd="dA2pcmd
					camTable[tableCounter] = dA2pcmd
				end if
				sCurrentLine = input$(#handleAddress)
			end while
		close #handleAddress
		masterIncrements = T2DistanceTotal/(tableCounter+1)
		createcamdata tableCounter+2 builtCamTable
		builtCamTable.MasterData[1] = 0.0
		builtCamTable.SlaveData[1]  = 0.0
		for i = 1 to builtCamTable.Size-2
			builtCamTable.MasterData[i+1] = masterIncrements * i
			builtCamTable.SlaveData[i+1]  = camTable[i]
		next
		builtCamTable.MasterData[builtCamTable.Size] = T2DistanceTotal
		builtCamTable.SlaveData[builtCamTable.Size]  = 0.0
	end if

end sub



app.prg (use default configuration, preferred after running buildCam.prg)

'------------------------------------------------------------------------------
' File:        CamDemo.prg
' Purpose:     tex-el motion application
' Version:     1.00
' Author:      Eran Korkidi
' Description:
' History:     13-APR-2015    Created
'------------------------------------------------------------------------------

common shared camCariage	as CAM
common shared camT2			as CAM
common shared camBascula	as CAM
common shared MASTER 	as generic axis
common shared CARRIAGE 	as generic axis
common shared BASCULA	as generic axis
common shared T2		as generic axis

program

	call setaxis(A5,1000)
	call setaxis(A4,1000)
	call setaxis(A3,1000)
	call setaxis(A2,1000)
	call SetAxis(A1,1000)
	try
		LoadCamData CARRIAGE.CAM camCariage
		catch 3063
			Load buildCam.prg
			Stas buildCam.prg
			Sleep 20*1000
			LoadCamData CARRIAGE.CAM camCariage
	end try
	try
		LoadCamData T2.CAM camT2
		catch 3063
			Load buildCam.prg
			Stas buildCam.prg
			Sleep 20*1000
			LoadCamData T2.CAM camT2
	end try
	try
		LoadCamData BASCULA.CAM camBascula
		catch 3063
			Load buildCam.prg
			Stas buildCam.prg
			Sleep 20*1000
			LoadCamData BASCULA.CAM camBascula
	end try
	camCariage.Cycle = -1
	camT2.Cycle = -1
	camBascula.Cycle = -1

	Attach A2
		A2.MasterSource = A1.PositionFeedback
		A2.GearRatio = 1'0.5
		A2.Slave = GEAR
		A2.En=1
	Detach A2

	Attach A3
		a3.MasterSource = a2.Pcmd
		a3.GearRatio = 1.0       
		a3.CamOffset = camCariage.MasterData[1]
		a3.FirstCam  = camCariage
		a3.Slave     = CAM       
		A3.En = 1                
	Detach A3
	
	Attach A4
		a4.MasterSource = a2.Pcmd
		a4.GearRatio = 1.0       
		a4.CamOffset = camT2.MasterData[1]
		a4.FirstCam  = camT2
		a4.Slave     = CAM       
		A4.En = 1
	Detach A4

	Attach A5
		A5.MasterSource = a2.Pcmd
		A5.GearRatio = 1.0       
		A5.CamOffset = camBascula.MasterData[1]
		A5.FirstCam  = camBascula
		A5.Slave     = CAM       
		A5.En = 1                
	Detach A5
	
	MASTER	 = A1
	CARRIAGE = A3
	T2		 = A4
	BASCULA  = A5
	
	Attach A1
		A1.En=1
		Record crg_T3.REC 20000 Gap=1 RecData = MASTER.Vcmd, CARRIAGE.Pcmd, CARRIAGE.Vcmd, T2.Pcmd, T2.Vcmd, BASCULA.Pcmd, BASCULA.Vcmd
		RecordOn
		Sleep 10
		Jog A1 100
		Sleep 24000
		RecordClose
		while 1
			Sleep 10
		end while		
	Detach A1


end program

 
sub SetAxis(ax as generic axis, byval vvv as double)

	dim omega	as double	= 15
	dim profile	as long		= -1

	with ax
    	Attach
	 		Slave = 0
      		En = 0
      		Sleep 10
      		Simulated = 1
      		Pfac = 1E6/5
      		Vfac = pfac/1000
      		Afac = vfac/1000 
      		Jfac = afac/1000 
      		Vmax = vvv
      		Amax = omega*Vmax
      		Dmax = omega*Vmax
      		Jmax = omega*Amax
      		Vcruise = Vmax
      		Acc = Amax
      		Dec = Dmax
      		Jerk = Jmax
      		prftype = profile
      		Smooth = -1
      		Vospd               = 2*Vmax 
      		VelocitySafetyLimit = 100*Vmax
      		Positionerrorsettle = 5
      		PeMax  = 10
      		PmaxEn = 1
      		PminEn = 1
      		Disp = 0
      		Absolute = 1
      		Positionrolloverenable = 0
      		Simulated = 1
      		Print "axis "; ElementName ; " set."
		Detach
	end with

end sub