- Hardware & Machines
- Pick and Place
- Using M201 and Python to Lookup a CSV Table File and Using It's Values
Using M201 and Python to Lookup a CSV Table File and Using It's Values
- tommylight
- Away
- Moderator
Less
More
- Posts: 19011
- Thank you received: 6371
07 Aug 2022 13:52 #249271
by tommylight
Replied by tommylight on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
I concur !I guess I will have to make some more video's of the progress along the way.
The following user(s) said Thank You: my1987toyota
Please Log in or Create an account to join the conversation.
08 Aug 2022 01:25 - 08 Aug 2022 01:28 #249313
by andypugh
Replied by andypugh on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
I have had a bit of a play around, and with this as the .csv contents:
This Python looks to do what is required:
I was running this separately from LinuxCNC and so I am printing what the self.execute command should be, rather than doing it...
Example run
You can see that the csv DictReader has interpreted the first line as a set of keys for a Python Dictionary object.
The code then iterates through each row looking for a row where the "Feeder" value matches the number passed in (at the command line here, but it would be as the P parameter in your remap, as previously done in your example in forum.linuxcnc.org/pnp/46555-using-m2-fo...eeder-advance#248858 using words (note that "words" is another dictionary, and you have used the 'p' key to extract the associated value)
The bits you need to add to your code is the iteration through the dictionary to find your 'Feeder' and the formatting of the returned values into a string that can be executed.
You might want to use a more "pythonic" search through the list, see for example here: stackoverflow.com/questions/8653516/pyth...-dictionaries-search
You also probably want to strip leading spaces, possibly by defining a dialect as described here:
www.w3resource.com/python-exercises/csv/...n-csv-exercise-6.php
This will allow the header line to be Feeder, X, Y and similarly for the data.
Feeder,X,Y
1,0,10
2,0,20
5,1,50
4,1,40
This Python looks to do what is required:
import csv
import sys
P = int(float(sys.argv[1]))
with open('test.csv', newline='') as csvfile:
data = list(csv.DictReader(csvfile))
for line in data:
print(line)
if int(line["Feeder"]) == P:
print("self.execute('G0 X{X} Y{Y} Z0 C0')".format(X=line['X'], Y=line['Y']))
exit(0)
print("Index {} not found".format(P))
I was running this separately from LinuxCNC and so I am printing what the self.execute command should be, rather than doing it...
Example run
iMac:csvtest andypugh$ python3 test.py 2
{'Feeder': '1', 'X': '0', 'Y': '10'}
{'Feeder': '2', 'X': '0', 'Y': '20'}
self.execute('G0 X0 Y20 Z0 C0')
You can see that the csv DictReader has interpreted the first line as a set of keys for a Python Dictionary object.
The code then iterates through each row looking for a row where the "Feeder" value matches the number passed in (at the command line here, but it would be as the P parameter in your remap, as previously done in your example in forum.linuxcnc.org/pnp/46555-using-m2-fo...eeder-advance#248858 using words (note that "words" is another dictionary, and you have used the 'p' key to extract the associated value)
The bits you need to add to your code is the iteration through the dictionary to find your 'Feeder' and the formatting of the returned values into a string that can be executed.
You might want to use a more "pythonic" search through the list, see for example here: stackoverflow.com/questions/8653516/pyth...-dictionaries-search
You also probably want to strip leading spaces, possibly by defining a dialect as described here:
www.w3resource.com/python-exercises/csv/...n-csv-exercise-6.php
This will allow the header line to be Feeder, X, Y and similarly for the data.
Last edit: 08 Aug 2022 01:28 by andypugh.
The following user(s) said Thank You: my1987toyota
Please Log in or Create an account to join the conversation.
- my1987toyota
- Topic Author
- Offline
- Platinum Member
Less
More
- Posts: 812
- Thank you received: 329
10 Aug 2022 01:59 #249436
by my1987toyota
Replied by my1987toyota on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
Nice work Andypugh . I haven't messed around with DictReader yet but today this code is what I was working on.
I haven't crossed it over to the M201 code remap yet. I did it this way to simplify preliminary testing.
I hope conversion into the M201 remap wont be too complicated. But it will be a lot of typing. I am sure these codes
scream noobie.
csv file in txt format
python file in text format
csv code file in txt format . just reformat to csv to use.
python file
I haven't crossed it over to the M201 code remap yet. I did it this way to simplify preliminary testing.
I hope conversion into the M201 remap wont be too complicated. But it will be a lot of typing. I am sure these codes
scream noobie.
csv file in txt format
Feeder Number,X-axis,Y axis,Z-axis,C-axis
Feeder 1,X0.125,Y-0.5118,Z-0.0,C0.0
Feeder 2,X0.125,Y-1.0235,Z-0.0,C0.0
Feeder 3,X0.125,Y-1.5354,Z-0.0,C0.0
Feeder 4,X0.125,Y-2.0472,Z-0.0,C0.0
Feeder 5,X0.125,Y-2.5590,Z-0.0,C0.0
Feeder 6,X0.125,Y-3.0708,Z-0.0,C0.0
Feeder 7,X0.125,Y-3.5826,Z-0.0,C0.0
Feeder 8,X0.125,Y-4.0994,Z-0.0,C0.0
Feeder 9,X0.125,Y-4.6062,Z-0.0,C0.0
Feeder 10,X0.125,Y-5.1180,Z-0.0,C0.0
Feeder 11,X0.125,Y-5.6298,Z-0.0,C0.0
Feeder 12,X0.125,Y-6.1416,Z-0.0,C0.0
Feeder 13,X0.125,Y-6.6534,Z-0.0,C0.0
Feeder 14,X0.125,Y-7.1652,Z-0.0,C0.0
Feeder 15,X0.125,Y-7.6770,Z-0.0,C0.0
Feeder 16,X0.125,Y-8.1888,Z-0.0,C0.0
Feeder 17,X0.125,Y-8.7006,Z-0.0,C0.0
Feeder 18,X0.125,Y-9.2124,Z-0.0,C0.0
Feeder 19,X0.125,Y-9.7242,Z-0.0,C0.0
Feeder 20,X0.125,Y-10.2360,Z-0.0,C0.0
Feeder 21,X0.125,Y-10.7478,Z-0.0,C0.0
Feeder 22,X0.125,Y-11.2596,Z-0.0,C0.0
Feeder 23,X0.125,Y-11.7714,Z-0.0,C0.0
Feeder 24,X0.125,Y-12.2832,Z-0.0,C0.0
Feeder 25,X15.875,Y-0.5118,Z-0.0,C0.0
Feeder 26,X15.875,Y-1.0235,Z-0.0,C0.0
Feeder 27,X15.875,Y-1.5354,Z-0.0,C0.0
Feeder 28,X15.875,Y-2.0472,Z-0.0,C0.0
Feeder 29,X15.875,Y-2.5590,Z-0.0,C0.0
Feeder 30,X15.875,Y-3.0708,Z-0.0,C0.0
Feeder 31,X15.875,Y-3.5826,Z-0.0,C0.0
Feeder 32,X15.875,Y-4.0994,Z-0.0,C0.0
Feeder 33,X15.875,Y-4.6062,Z-0.0,C0.0
Feeder 34,X15.875,Y-5.1180,Z-0.0,C0.0
Feeder 35,X15.875,Y-5.6298,Z-0.0,C0.0
Feeder 36,X15.875,Y-6.1416,Z-0.0,C0.0
Feeder 37,X15.875,Y-6.6534,Z-0.0,C0.0
Feeder 38,X15.875,Y-7.1652,Z-0.0,C0.0
Feeder 39,X15.875,Y-7.6770,Z-0.0,C0.0
Feeder 40,X15.875,Y-8.1888,Z-0.0,C0.0
Feeder 41,X15.875,Y-8.7006,Z-0.0,C0.0
Feeder 42,X15.875,Y-9.2124,Z-0.0,C0.0
Feeder 43,X15.875,Y-9.7242,Z-0.0,C0.0
Feeder 44,X15.875,Y-10.2360,Z-0.0,C0.0
Feeder 45,X15.875,Y-10.7478,Z-0.0,C0.0
Feeder 46,X15.875,Y-11.2596,Z-0.0,C0.0
Feeder 47,X15.875,Y-11.7714,Z-0.0,C0.0
Feeder 48,X15.875,Y-12.2832,Z-0.0,C0.0
python file in text format
import csv
print(' Choose "P" number ')
P = input()
endCoord = 'Z0.0 C0.0'
prefix1 = 'G53 G0 '
prefix2 = 'G53 G1 '
feeds1 = ' F150'
vacOn = 'M7'
pTime = 'G4 P0.5'
retract = 'G53 G1 Z0.0 F150'
feedersFile = open('feeder_V1.04.csv')
coordinatesReader = csv.reader(feedersFile)
locationData = list(coordinatesReader)
# Side 1 feeders
# the first number in exampleData is row and the second number is column
if P.upper() == 'P1':
print(prefix1 + locationData[1][1] + ' ' + locationData[1][2] + ' ' + endCoord)
print(prefix2 + locationData[1][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P1')
if P.upper() == 'P2':
print(prefix1 + locationData[2][1] + ' ' + locationData[2][2] + ' ' + endCoord)
print(prefix2 + locationData[2][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P2')
if P.upper() == 'P3':
print(prefix1 + locationData[3][1] + ' ' + locationData[3][2] + ' ' + endCoord)
print(prefix2 + locationData[3][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P3')
if P.upper() == 'P4':
print(prefix1 + locationData[4][1] + ' ' + locationData[4][2] + ' ' + endCoord)
print(prefix2 + locationData[4][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P4')
if P.upper() == 'P5':
print(prefix1 + locationData[5][1] + ' ' + locationData[5][2] + ' ' + endCoord)
print(prefix2 + locationData[5][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P5')
if P.upper() == 'P6':
print(prefix1 + locationData[6][1] + ' ' + locationData[6][2] + ' ' + endCoord)
print(prefix2 + locationData[6][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P6')
if P.upper() == 'P7':
print(prefix1 + locationData[7][1] + ' ' + locationData[7][2] + ' ' + endCoord)
print(prefix2 + locationData[7][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P7')
if P.upper() == 'P8':
print(prefix1 + locationData[8][1] + ' ' + locationData[8][2] + ' ' + endCoord)
print(prefix2 + locationData[8][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P8')
if P.upper() == 'P9':
print(prefix1 + locationData[9][1] + ' ' + locationData[9][2] + ' ' + endCoord)
print(prefix2 + locationData[9][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P9')
if P.upper() == 'P10':
print(prefix1 + locationData[10][1] + ' ' + locationData[10][2] + ' ' + endCoord)
print(prefix2 + locationData[10][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P10')
if P.upper() == 'P11':
print(prefix1 + locationData[11][1] + ' ' + locationData[11][2] + ' ' + endCoord)
print(prefix2 + locationData[11][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P11')
if P.upper() == 'P12':
print(prefix1 + locationData[12][1] + ' ' + locationData[12][2] + ' ' + endCoord)
print(prefix2 + locationData[12][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P12')
if P.upper() == 'P13':
print(prefix1 + locationData[13][1] + ' ' + locationData[13][2] + ' ' + endCoord)
print(prefix2 + locationData[13][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P13')
if P.upper() == 'P14':
print(prefix1 + locationData[14][1] + ' ' + locationData[14][2] + ' ' + endCoord)
print(prefix2 + locationData[14][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P14')
if P.upper() == 'P15':
print(prefix1 + locationData[15][1] + ' ' + locationData[15][2] + ' ' + endCoord)
print(prefix2 + locationData[15][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P15')
if P.upper() == 'P16':
print(prefix1 + locationData[16][1] + ' ' + locationData[16][2] + ' ' + endCoord)
print(prefix2 + locationData[16][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P16')
if P.upper() == 'P17':
print(prefix1 + locationData[17][1] + ' ' + locationData[17][2] + ' ' + endCoord)
print(prefix2 + locationData[17][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P17')
if P.upper() == 'P18':
print(prefix1 + locationData[18][1] + ' ' + locationData[18][2] + ' ' + endCoord)
print(prefix2 + locationData[18][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P18')
if P.upper() == 'P19':
print(prefix1 + locationData[19][1] + ' ' + locationData[19][2] + ' ' + endCoord)
print(prefix2 + locationData[19][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 19')
if P.upper() == 'P20':
print(prefix1 + locationData[20][1] + ' ' + locationData[20][2] + ' ' + endCoord)
print(prefix2 + locationData[20][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P20')
if P.upper() == 'P21':
print(prefix1 + locationData[21][1] + ' ' + locationData[21][2] + ' ' + endCoord)
print(prefix2 + locationData[21][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P21')
if P.upper() == 'P22':
print(prefix1 + locationData[22][1] + ' ' + locationData[22][2] + ' ' + endCoord)
print(prefix2 + locationData[22][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P22')
if P.upper() == 'P23':
print(prefix1 + locationData[23][1] + ' ' + locationData[23][2] + ' ' + endCoord)
print(prefix2 + locationData[23][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P23')
if P.upper() == 'P24':
print(prefix1 + locationData[24][1] + ' ' + locationData[24][2] + ' ' + endCoord)
print(prefix2 + locationData[24][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P24')
# Side 2 feeders
if P.upper() == 'P25':
print(prefix1 + locationData[25][1] + ' ' + locationData[25][2] + ' ' + endCoord)
print(prefix2 + locationData[25][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P25')
if P.upper() == 'P26':
print(prefix1 + locationData[26][1] + ' ' + locationData[26][2] + ' ' + endCoord)
print(prefix2 + locationData[26][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P26')
if P.upper() == 'P27':
print(prefix1 + locationData[27][1] + ' ' + locationData[27][2] + ' ' + endCoord)
print(prefix2 + locationData[27][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P27')
if P.upper() == 'P28':
print(prefix1 + locationData[28][1] + ' ' + locationData[28][2] + ' ' + endCoord)
print(prefix2 + locationData[28][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P28')
if P.upper() == 'P29':
print(prefix1 + locationData[29][1] + ' ' + locationData[29][2] + ' ' + endCoord)
print(prefix2 + locationData[29][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P29')
if P.upper() == 'P30':
print(prefix1 + locationData[30][1] + ' ' + locationData[30][2] + ' ' + endCoord)
print(prefix2 + locationData[30][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P30')
if P.upper() == 'P31':
print(prefix1 + locationData[31][1] + ' ' + locationData[31][2] + ' ' + endCoord)
print(prefix2 + locationData[31][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P31')
if P.upper() == 'P32':
print(prefix1 + locationData[32][1] + ' ' + locationData[32][2] + ' ' + endCoord)
print(prefix2 + locationData[32][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P32')
if P.upper() == 'P33':
print(prefix1 + locationData[33][1] + ' ' + locationData[33][2] + ' ' + endCoord)
print(prefix2 + locationData[33][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P33')
if P.upper() == 'P34':
print(prefix1 + locationData[34][1] + ' ' + locationData[34][2] + ' ' + endCoord)
print(prefix2 + locationData[34][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P34')
if P.upper() == 'P35':
print(prefix1 + locationData[35][1] + ' ' + locationData[35][2] + ' ' + endCoord)
print(prefix2 + locationData[35][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P35')
if P.upper() == 'P36':
print(prefix1 + locationData[36][1] + ' ' + locationData[36][2] + ' ' + endCoord)
print(prefix2 + locationData[36][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P36')
if P.upper() == 'P37':
print(prefix1 + locationData[37][1] + ' ' + locationData[37][2] + ' ' + endCoord)
print(prefix2 + locationData[37][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P37')
if P.upper() == 'P38':
print(prefix1 + locationData[38][1] + ' ' + locationData[38][2] + ' ' + endCoord)
print(prefix2 + locationData[38][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P38')
if P.upper() == 'P39':
print(prefix1 + locationData[39][1] + ' ' + locationData[39][2] + ' ' + endCoord)
print(prefix2 + locationData[39][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P39')
if P.upper() == 'P40':
print(prefix1 + locationData[40][1] + ' ' + locationData[40][2] + ' ' + endCoord)
print(prefix2 + locationData[40][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P40')
if P.upper() == 'P41':
print(prefix1 + locationData[41][1] + ' ' + locationData[41][2] + ' ' + endCoord)
print(prefix2 + locationData[41][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P41')
if P.upper() == 'P42':
print(prefix1 + locationData[42][1] + ' ' + locationData[42][2] + ' ' + endCoord)
print(prefix2 + locationData[42][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P42')
if P.upper() == 'P43':
print(prefix1 + locationData[43][1] + ' ' + locationData[43][2] + ' ' + endCoord)
print(prefix2 + locationData[43][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P43')
if P.upper() == 'P44':
print(prefix1 + locationData[44][1] + ' ' + locationData[44][2] + ' ' + endCoord)
print(prefix2 + locationData[44][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P44')
if P.upper() == 'P45':
print(prefix1 + locationData[45][1] + ' ' + locationData[45][2] + ' ' + endCoord)
print(prefix2 + locationData[45][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P45')
if P.upper() == 'P46':
print(prefix1 + locationData[46][1] + ' ' + locationData[46][2] + ' ' + endCoord)
print(prefix2 + locationData[46][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P46')
if P.upper() == 'P47':
print(prefix1 + locationData[47][1] + ' ' + locationData[47][2] + ' ' + endCoord)
print(prefix2 + locationData[47][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P47')
if P.upper() == 'P48':
print(prefix1 + locationData[48][1] + ' ' + locationData[48][2] + ' ' + endCoord)
print(prefix2 + locationData[48][3] + feeds1)
print(vacOn)
print(pTime)
print(retract)
print('M161 P48')
csv code file in txt format . just reformat to csv to use.
python file
Attachments:
Please Log in or Create an account to join the conversation.
- my1987toyota
- Topic Author
- Offline
- Platinum Member
Less
More
- Posts: 812
- Thank you received: 329
10 Aug 2022 02:29 - 10 Aug 2022 03:20 #249437
by my1987toyota
Replied by my1987toyota on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
For those curious about how I got the code this is based off of see the book " Automate the Boring Stuff With Python" by Al Sweigart
link below to his free to read online version of the book released under Creative Commons License. See chapter 16
automatetheboringstuff.com/#toc
link below to his free to read online version of the book released under Creative Commons License. See chapter 16
automatetheboringstuff.com/#toc
Last edit: 10 Aug 2022 03:20 by my1987toyota. Reason: updating info
The following user(s) said Thank You: tjtr33, tommylight
Please Log in or Create an account to join the conversation.
- my1987toyota
- Topic Author
- Offline
- Platinum Member
Less
More
- Posts: 812
- Thank you received: 329
11 Aug 2022 17:07 - 11 Aug 2022 21:26 #249536
by my1987toyota
Replied by my1987toyota on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
Well looks like I still have a lot to learn. The code works great in Python ide's but I keep getting an error in Linuxcnc when I tried to cross it over.
The error is
UnboundLocalError.local variable 'prefix1'
referenced before assignment
first I will have to look up what that means and then rework the code to correct it. I will most likely need to check into what andypugh posted
about dict.reader and rewrite accordingly.
The Faulty code is below
just remove the _10 if testing in Linuxcnc otherwise Python don't care.
the csv file is in text format . just replace the extension with csv to return it to a csv file
The error is
UnboundLocalError.local variable 'prefix1'
referenced before assignment
first I will have to look up what that means and then rework the code to correct it. I will most likely need to check into what andypugh posted
about dict.reader and rewrite accordingly.
The Faulty code is below
just remove the _10 if testing in Linuxcnc otherwise Python don't care.
the csv file is in text format . just replace the extension with csv to return it to a csv file
Attachments:
Last edit: 11 Aug 2022 21:26 by my1987toyota.
Please Log in or Create an account to join the conversation.
11 Aug 2022 19:48 #249546
by rodw
Try addingbefore your if statement
The errror message is telling you whats wrong.
You are creating your variables in the if statement.
in your elif statements you are trying to manipulate a variable that has not been created which obviously will not work
Replied by rodw on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
Try adding
prefix1=''
prefix2=''
The errror message is telling you whats wrong.
You are creating your variables in the if statement.
in your elif statements you are trying to manipulate a variable that has not been created which obviously will not work
The following user(s) said Thank You: my1987toyota
Please Log in or Create an account to join the conversation.
11 Aug 2022 19:56 #249547
by rodw
Replied by rodw on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
Actually all of your variables are being defined inside the if statement. You likely need to move this block to be above the if statement.In fact, you probably would move it to be above this line so its only executed once (eg as global variables) instead of each time the procedure is called.
# these codes can be taylored to your machine if needed
endCoord = 'Z0.0 C0.0' # G_codes to ensure Z and C axis are in there 0 position
prefix1 = 'G53 G0 ' # machine coordinate system and G0 rapid move
prefix2 = 'G53 G1 ' # machine coordinate system and G1 move
feeds1 = ' F150' # feed value for Z to pick up part
vacOn = 'M7' # M_code for turning on vaccum
pTime = 'G4 P0.5' # G_code for pause time to allow vaccum to asstablish
retract = 'G53 G1 Z0.0 F150' # Z retract speed with part attatched
fdrCycl = 'M161 ' # M_code for feeder advance
def M201(self, **words):
The following user(s) said Thank You: tommylight, my1987toyota
Please Log in or Create an account to join the conversation.
- my1987toyota
- Topic Author
- Offline
- Platinum Member
Less
More
- Posts: 812
- Thank you received: 329
11 Aug 2022 21:50 - 12 Aug 2022 12:37 #249556
by my1987toyota
Replied by my1987toyota on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
Hit the nail on the head rodw.
I actually had to chase down a few other error's as well in my above code to get it to work You are right Rod The main
one was I had to move the csv read code to be a global instead of a local. ( I didn't know anyone had replied to
my above post until after I posted this post). I am glad I didn't have to do a complete rewrite of my python code.
I had to correct a small error in this post but apparently the forum software decided to completely butcher the codes posted.
I will be posting just the codes in the next reply.
I actually had to chase down a few other error's as well in my above code to get it to work You are right Rod The main
one was I had to move the csv read code to be a global instead of a local. ( I didn't know anyone had replied to
my above post until after I posted this post). I am glad I didn't have to do a complete rewrite of my python code.
I had to correct a small error in this post but apparently the forum software decided to completely butcher the codes posted.
I will be posting just the codes in the next reply.
Attachments:
Last edit: 12 Aug 2022 12:37 by my1987toyota. Reason: correcting the mess the forum software made of my post
The following user(s) said Thank You: tommylight, rodw
Please Log in or Create an account to join the conversation.
- my1987toyota
- Topic Author
- Offline
- Platinum Member
Less
More
- Posts: 812
- Thank you received: 329
11 Aug 2022 23:47 - 12 Aug 2022 12:40 #249564
by my1987toyota
Replied by my1987toyota on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
The working M201 Python script
The CSV file
The CSV file
Attachments:
Last edit: 12 Aug 2022 12:40 by my1987toyota. Reason: correcting the major botch job from the forum software
Please Log in or Create an account to join the conversation.
- my1987toyota
- Topic Author
- Offline
- Platinum Member
Less
More
- Posts: 812
- Thank you received: 329
12 Aug 2022 12:47 #249585
by my1987toyota
Replied by my1987toyota on topic Using M201 and Python to Lookup a CSV Table File and Using It's Values
Now in readable format
M201
The feeder_V1.04 csv file
M201
#remap version 11.02
import emccanon
import sys
import interpreter
import csv
feedersFile = open('feeder_V1.04.csv')
coordinatesReader = csv.reader(feedersFile)
locationData = list(coordinatesReader)
fdrPos = locationData
# these codes can be changed to meet your machines needs
endCoord = 'Z0.0 C0.0' # G_codes to ensure Z and C axis are in there 0 position
prefix1 = 'G53 G0 ' # machine coordinate system and G0 rapid move
prefix2 = 'G53 G1 ' # machine coordinate system and G1 move
feeds1 = ' F150' # feed value for Z to pick up part
vacOn = 'M7' # M_code for turning on vaccum
pTime = 'G4 P0.5' # G_code for pause time to allow vaccum to asstablish
retract = 'G53 G1 Z0.0 F150' # Z retract speed with part attatched
fdrCycl = 'M161 P' # M_code to advance the feeder
def M201(self, **words):
print(words)
P = words['p']
print(P)
if P < 0:
print("error, a P parameter must be passed")
#side 1 feeders
elif P == 1:
self.execute(prefix1 + fdrPos[1][1] + ' ' + fdrPos[1][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos [1][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '1')
elif P == 2:
self.execute(prefix1 + fdrPos[2][1] + ' ' + fdrPos[2][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[2][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '2')
elif P == 3:
self.execute(prefix1 + fdrPos[3][1] + ' ' + fdrPos[3][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[3][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '3')
elif P == 4:
self.execute(prefix1 + fdrPos[4][1] + ' ' + fdrPos[4][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[4][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '4')
elif P == 5:
self.execute(prefix1 + fdrPos[5][1] + ' ' + fdrPos[5][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[5][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '5')
elif P == 6:
self.execute(prefix1 + fdrPos[6][1] + ' ' + fdrPos[6][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[6][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '6')
elif P == 7:
self.execute(prefix1 + fdrPos[7][1] + ' ' + fdrPos[7][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[7][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '7')
elif P == 8:
self.execute(prefix1 + fdrPos[8][1] + ' ' + fdrPos[8][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[8][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '8')
elif P == 9:
self.execute(prefix1 + fdrPos[9][1] + ' ' + fdrPos[9][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[9][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '9')
elif P == 10:
self.execute(prefix1 + fdrPos[10][1] + ' ' + fdrPos[10][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[10][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '10')
elif P == 11:
self.execute(prefix1 + fdrPos[11][1] + ' ' + fdrPos[11][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[11][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '11')
elif P == 12:
self.execute(prefix1 + fdrPos[12][1] + ' ' + [12][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[12][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '12')
elif P == 13:
self.execute(prefix1 + fdrPos[13][1] + ' ' + fdrPos[13][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[13][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '13')
elif P == 14:
self.execute(prefix1 + fdrPos[14][1] + ' ' + fdrPos[14][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[14][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '14')
elif P == 15:
self.execute(prefix1 + fdrPos[15][1] + ' ' + fdrPos[15][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[15][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '15')
elif P == 16:
self.execute(prefix1 + fdrPos[16][1] + ' ' + fdrPos[16][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[16][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '16')
elif P == 17:
self.execute(prefix1 + fdrPos[17][1] + ' ' + fdrPos[17][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[17][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '17')
elif P == 18:
self.execute(prefix1 + fdrPos[18][1] + ' ' + fdrPos[18][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[18][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '18')
elif P == 19:
self.execute(prefix1 + fdrPos[19][1] + ' ' + fdrPos[19][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[19][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '19')
elif P == 20:
self.execute(prefix1 + fdrPos[20][1] + ' ' + fdrPos[20][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[20][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '20')
elif P == 21:
self.execute(prefix1 + fdrPos[21][1] + ' ' + fdrPos[21][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[21][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '21')
elif P == 22:
self.execute(prefix1 + fdrPos[22][1] + ' ' + fdrPos[22][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[22][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '22')
elif P == 23:
self.execute(prefix1 + fdrPos[23][1] + ' ' + fdrPos[23][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[23][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '23')
elif P == 24:
self.execute(prefix1 + fdrPos[24][1] + ' ' + fdrPos[24][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[24][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '24')
#side 2 feeders
elif P == 25:
self.execute(prefix1 + fdrPos[25][1] + ' ' + fdrPos[25][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[25][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '25')
elif P == 26:
self.execute(prefix1 + fdrPos[26][1] + ' ' + fdrPos[26][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[26][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '26')
elif P == 27:
self.execute(prefix1 + fdrPos[27][1] + ' ' + fdrPos[27][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[27][3] + feeds1)
self.executevacOn(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '27')
elif P == 28:
self.execute(prefix1 + fdrPos[28][1] + ' ' + fdrPos[28][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[28][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '28')
elif P == 29:
self.execute(prefix1 + fdrPos[29][1] + ' ' + fdrPos[29][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[29][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '29')
elif P == 30:
self.execute(prefix1 + fdrPos[30][1] + ' ' + fdrPos[30][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[30][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '30')
elif P == 31:
self.execute(prefix1 + fdrPos[31][1] + ' ' + fdrPos[31][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[31][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '31')
elif P == 32:
self.execute(prefix1 + fdrPos[32][1] + ' ' + fdrPos[32][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[32][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '32')
elif P == 33:
self.execute(prefix1 + fdrPos[33][1] + ' ' + fdrPos[33][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[33][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '33')
elif P == 34:
self.execute(prefix1 + fdrPos[34][1] + ' ' + fdrPos[34][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[34][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '34')
elif P == 35:
self.execute(prefix1 + fdrPos[35][1] + ' ' + fdrPos[35][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[35][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '35')
elif P == 36:
self.execute(prefix1 + fdrPos[36][1] + ' ' + fdrPos[36][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[36][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '36')
elif P == 37:
self.execute(prefix1 + fdrPos[37][1] + ' ' + fdrPos[37][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[37][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '37')
elif P == 38:
self.execute(prefix1 + fdrPos[38][1] + ' ' + fdrPos[38][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[38][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '38')
elif P == 39:
self.execute(prefix1 + fdrPos[39][1] + ' ' + fdrPos[39][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[39][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '39')
elif P == 40:
self.execute(prefix1 + fdrPos[40][1] + ' ' + fdrPos[40][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[40][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '40')
elif P == 41:
self.execute(prefix1 + fdrPos[41][1] + ' ' + fdrPos[41][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[41][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '41')
elif P == 42:
self.execute(prefix1 + fdrPos[42][1] + ' ' + fdrPos[42][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[42][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '42')
elif P == 43:
self.execute(prefix1 + fdrPos[43][1] + ' ' + fdrPos[43][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[43][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '43')
elif P == 44:
self.execute(prefix1 + fdrPos[44][1] + ' ' + fdrPos[44][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[44][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '44')
elif P == 45:
self.execute(prefix1 + fdrPos[45][1] + ' ' + fdrPos[45][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[45][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '45')
elif P == 46:
self.execute(prefix1 + fdrPos[46][1] + ' ' + fdrPos[46][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[46][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '46')
elif P == 47:
self.execute(prefix1 + fdrPos[47][1] + ' ' + fdrPos[47][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[47][3] + feeds1)
self.execute(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '47')
elif P == 48:
self.execute(prefix1 + fdrPos[48][1] + ' ' + fdrPos[48][2] + ' ' + endCoord)
self.execute(prefix2 + fdrPos[48][3] + feeds1)
self.execut(vacOn)
self.execute(pTime)
self.execute(retract)
self.execute(fdrCycl + '48')
return interpreter.INTERP_OK
The feeder_V1.04 csv file
Feeder Number,X-axis,Y axis,Z-axis,C-axis
Feeder 1,X0.125,Y-0.5118,Z-0.0,C0.0
Feeder 2,X0.125,Y-1.0235,Z-0.0,C0.0
Feeder 3,X0.125,Y-1.5354,Z-0.0,C0.0
Feeder 4,X0.125,Y-2.0472,Z-0.0,C0.0
Feeder 5,X0.125,Y-2.5590,Z-0.0,C0.0
Feeder 6,X0.125,Y-3.0708,Z-0.0,C0.0
Feeder 7,X0.125,Y-3.5826,Z-0.0,C0.0
Feeder 8,X0.125,Y-4.0994,Z-0.0,C0.0
Feeder 9,X0.125,Y-4.6062,Z-0.0,C0.0
Feeder 10,X0.125,Y-5.1180,Z-0.0,C0.0
Feeder 11,X0.125,Y-5.6298,Z-0.0,C0.0
Feeder 12,X0.125,Y-6.1416,Z-0.0,C0.0
Feeder 13,X0.125,Y-6.6534,Z-0.0,C0.0
Feeder 14,X0.125,Y-7.1652,Z-0.0,C0.0
Feeder 15,X0.125,Y-7.6770,Z-0.0,C0.0
Feeder 16,X0.125,Y-8.1888,Z-0.0,C0.0
Feeder 17,X0.125,Y-8.7006,Z-0.0,C0.0
Feeder 18,X0.125,Y-9.2124,Z-0.0,C0.0
Feeder 19,X0.125,Y-9.7242,Z-0.0,C0.0
Feeder 20,X0.125,Y-10.2360,Z-0.0,C0.0
Feeder 21,X0.125,Y-10.7478,Z-0.0,C0.0
Feeder 22,X0.125,Y-11.2596,Z-0.0,C0.0
Feeder 23,X0.125,Y-11.7714,Z-0.0,C0.0
Feeder 24,X0.125,Y-12.2832,Z-0.0,C0.0
Feeder 25,X15.875,Y-0.5118,Z-0.0,C0.0
Feeder 26,X15.875,Y-1.0235,Z-0.0,C0.0
Feeder 27,X15.875,Y-1.5354,Z-0.0,C0.0
Feeder 28,X15.875,Y-2.0472,Z-0.0,C0.0
Feeder 29,X15.875,Y-2.5590,Z-0.0,C0.0
Feeder 30,X15.875,Y-3.0708,Z-0.0,C0.0
Feeder 31,X15.875,Y-3.5826,Z-0.0,C0.0
Feeder 32,X15.875,Y-4.0994,Z-0.0,C0.0
Feeder 33,X15.875,Y-4.6062,Z-0.0,C0.0
Feeder 34,X15.875,Y-5.1180,Z-0.0,C0.0
Feeder 35,X15.875,Y-5.6298,Z-0.0,C0.0
Feeder 36,X15.875,Y-6.1416,Z-0.0,C0.0
Feeder 37,X15.875,Y-6.6534,Z-0.0,C0.0
Feeder 38,X15.875,Y-7.1652,Z-0.0,C0.0
Feeder 39,X15.875,Y-7.6770,Z-0.0,C0.0
Feeder 40,X15.875,Y-8.1888,Z-0.0,C0.0
Feeder 41,X15.875,Y-8.7006,Z-0.0,C0.0
Feeder 42,X15.875,Y-9.2124,Z-0.0,C0.0
Feeder 43,X15.875,Y-9.7242,Z-0.0,C0.0
Feeder 44,X15.875,Y-10.2360,Z-0.0,C0.0
Feeder 45,X15.875,Y-10.7478,Z-0.0,C0.0
Feeder 46,X15.875,Y-11.2596,Z-0.0,C0.0
Feeder 47,X15.875,Y-11.7714,Z-0.0,C0.0
Feeder 48,X15.875,Y-12.2832,Z-0.0,C0.0
Please Log in or Create an account to join the conversation.
- Hardware & Machines
- Pick and Place
- Using M201 and Python to Lookup a CSV Table File and Using It's Values
Time to create page: 0.129 seconds