Skriva program för att översätta NC-kod från nc .tap till EMCO format

Permalänk
Medlem

Skriva program för att översätta NC-kod från nc .tap till EMCO format

Tjena!

Vi har på verkstan ett antal EMCO cnc maskiner som vi till just nu skriver manuella program för vad vi ska göra. Men det finns massvis med trevliga cam mjukvaror som det skulle vara kul att använda.

Problemet är bara att de sällan har stöd för våra maskiner rent formatmässigt i filen.

Så vad jag vill göra är ett program som enkelt översätter koden till vad våra maskiner kan läsa. Det är egentligen bara rena textfiler men de ser inte ur som maskinerna vill ha.

Ex. så här ser koden ut som kommer från CAM mjukvarorna:

T1M6
G0Z7.343
G0X0.000Y0.000S15000M3
G0X0.001Y0.001Z7.343
G1Z-7.000F240.0
G1X0.110F600.0
X99.999
Y0.101

Men den ska formateras om så den ser ut såhär:

N0000 T0101 M06
N0010 G00 Z7.343
N0020 G00 X0.000 Y0.000 S15000 M03
N0030 G00 X0.001 Y0.001 Z7.343
N0040 G01 Z-7.000 F240
N0050 G01 X0.110 F600
N0060 X99.999
N0070 Y0.101

Så ni förstår ungefär hur den ska förändras.

Nxxxx Måste läggas till i början på vare rad.
T1 ska bli T0101,
Gx måste bli Gxx,
Mx måste bli Mxx osv.

Det är egentiligen en ganska enkel uppgift att lösa men hur tycker ni att jag ska gå tillväga enklast?

Jag kan en del java och c# men det var ett tag sedan.

Visa signatur

Nämns inget annat så menar jag denna maskinen:
ASUS G53SW - Intel i7-2630QM @ 2.00Ghz - 12GB RAM - Nvidia GeForce GTX460M 1.5GB
Intel 510 SSD 128GB - Seagate Momentus XT SSHD 500GB - Windows 7 x64 Ultimate SP1
Chrome v38/latest, Chrome Canary och Firefox for development / debug

Permalänk

Om du tankar visual c# express så kan du göra en forloop.. Med lite ifsatser ska du kunna få ut rätt formatering. Om det är många olika sorters formatering på koden från mjukvarorna kanske du ska börja läsa på lite om regex också

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Hedersmedlem

Så länge man vet precis hur varje rad skall transformeras är det väl inte så svårt att skriva något snabbt i c#? Är det där alla möjliga fall eller finns det hur många som helst?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Elgot
Så länge man vet precis hur varje rad skall transformeras är det väl inte så svårt att skriva något snabbt i c#? Är det där alla möjliga fall eller finns det hur många som helst?

Det var ett exempel, men jag vill kunna bygga ut det hela.
Det finns inte hur många som helst men nog finns det över 200st olika fall om man skulle vara noga men jag klarar mig nog med runt 15st just nu. Men man vill ju kunna bygga ut

Frågan är hur jag ska läsa/skriva till filen enklast, ska jag läsa in hela filen och sen skriva ut den eller ska jag editera varje rad för sig?

Visa signatur

Nämns inget annat så menar jag denna maskinen:
ASUS G53SW - Intel i7-2630QM @ 2.00Ghz - 12GB RAM - Nvidia GeForce GTX460M 1.5GB
Intel 510 SSD 128GB - Seagate Momentus XT SSHD 500GB - Windows 7 x64 Ultimate SP1
Chrome v38/latest, Chrome Canary och Firefox for development / debug

Permalänk

Det beror ju helt på hur du vill bygga upp det. Läsa text i c# är inte särskilt svårt. Kolla på TextReader. Är raderna alltid i samma ordning? Ser ut som att i ditt exempel att du bör läsa per rad. Sen kan du även ha ett regex som matchar det du vill ha ut per rad. När du väl får ut en match från ditt regex är det väldigt enkelt att manipulera det som du vill

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Josasp
Frågan är hur jag ska läsa/skriva till filen enklast, ska jag läsa in hela filen och sen skriva ut den eller ska jag editera varje rad för sig?

Effektivast är nog att läsa lite i taget, plocka ut rätt data med reguljära uttryck och spara till målfilen.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av KurreKula
Är raderna alltid i samma ordning? Ser ut som att i ditt exempel att du bör läsa per rad.

Beror på hur du menar "i samma ordning" N**** nummret är fortlöpande genom hela, dvs man skulle kunna säga att det är "radnummer" så maskinen vet var den är i filen.

Visa signatur

Nämns inget annat så menar jag denna maskinen:
ASUS G53SW - Intel i7-2630QM @ 2.00Ghz - 12GB RAM - Nvidia GeForce GTX460M 1.5GB
Intel 510 SSD 128GB - Seagate Momentus XT SSHD 500GB - Windows 7 x64 Ultimate SP1
Chrome v38/latest, Chrome Canary och Firefox for development / debug

Permalänk
Citat:

Ursprungligen inskrivet av Josasp
Beror på hur du menar "i samma ordning" N**** nummret är fortlöpande genom hela, dvs man skulle kunna säga att det är "radnummer" så maskinen vet var den är i filen.

Menar att om du vet vilken ordning raderna är i vet du även vilket radindex du ska göra vad med..

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Jag skrev ihop ett litet C++-program som gör ungefär vad du önskar. Jag antog att varje tecken alltid följs av en siffra, och sen gör jag olika saker med siffran beroende på vilket tecken det var före. Jag vet inte hur strikt det är med att t.ex. X och Y alltid måste ha 3 decimaler, men man får väl lägga in fall för det också i så fall. Förhoppningsvis ger det dig en bra start i alla fall. Det borde inte vara så svårt att skriva något liknande i C# om du föredrar det.

#include <iostream> #include <fstream> #include <sstream> #include <list> typedef std::list<char> symbol_list; typedef std::list<double> number_list; // Formats a number into a string of size 4, with leading zeroes. std::string line_nr_to_str(int line_nr) { std::stringstream ss; std::string str; ss.fill('0'); ss.width(4); ss << line_nr; ss >> str; return str; } int main(int argc, char **argv) { if(argc <= 1) { std::cout << "Usage: " << argv[0] << " input_file" << std::endl; return 0; } // Open input and output files. std::ifstream input(argv[1]); std::string output_filename = argv[1]; output_filename += ".emco"; std::ofstream output(output_filename.c_str()); std::string str; int line_number = 0; // Read the file line by line. while(std::getline(input, str)) { // Output the line number. output << 'N' << line_nr_to_str(line_number) << ' '; // Parse the line into symbols and numbers. std::stringstream ss(str); symbol_list symbols; number_list numbers; char c; double d; while((ss >> c)) { symbols.push_back(c); if(ss >> d) { numbers.push_back(d); } } // If the number of symbols and numbers differs something is wrong. if(symbols.size() != numbers.size()) { std::cout << "Invalid data format!" << std::endl; return 1; } symbol_list::iterator s_end = symbols.end(); symbol_list::iterator symbol = symbols.begin(); number_list::iterator number = numbers.begin(); // For each symbol-number pair for(; symbol != s_end; ++symbol, ++number) { // Output the symbol. output << *symbol; // Output the number, with some special cases. switch(*symbol) { case 'G': case 'M': output << '0' << *number; break; case 'T': output << '0' << *number << '0' << *number; break; default: output << *number; break; } output << ' '; } // Finally, increment the line number. line_number += 10; output << '\n'; } }

Permalänk
Medlem

Det där gör man på en pisskvart i Perl, problemet är bara att du inte har specat upp alla undantag. När ska man plocka bort decimalerna, t.ex.? Fullhack:

$rownum = 0; while (<DATA>) { chomp($_); printf('N%04d ', $rownum); my @arr = split(/(?=[A-Z])/); foreach my $command (@arr) { my ($command, $value) = ($command =~ /([A-Z])(.*)/); $value = sprintf('%02d', $value) if ($value =~ /^\d$/); $value .= $value if ($command eq 'T'); printf("%s%s ", $command, $value); } print "\n"; $rownum += 10; } __DATA__ T1M6 G0Z7.343 G0X0.000Y0.000S15000M3 G0X0.001Y0.001Z7.343 G1Z-7.000F240.0 G1X0.110F600.0 X99.999 Y0.101

E:\Stuff>perl nc.pl N0000 T0101 M06 N0010 G00 Z7.343 N0020 G00 X0.000 Y0.000 S15000 M03 N0030 G00 X0.001 Y0.001 Z7.343 N0040 G01 Z-7.000 F240.0 N0050 G01 X0.110 F600.0 N0060 X99.999 N0070 Y0.101

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Avstängd

hej lite ny här inne - söker väl perost men kan inte maila till han
Han kanske kan hjälpa mig
Sen en annan fråga är

Drupel s programvara att rekommendera eller skall man börja med något enklare /svårare eller så?
Som sagt jag är i starten - och vet inte hur mycket tid jag kommer på att lägga på att lära mig gör hemsidor
så tips tas emot - vill ha gjord en hemsida - o har mailat runt lite
har 2 st olika projekt som vill sjösättas

br

Seven

Citat:

Ursprungligen inskrivet av perost
Jag skrev ihop ett litet C++-program som gör ungefär vad du önskar. Jag antog att varje tecken alltid följs av en siffra, och sen gör jag olika saker med siffran beroende på vilket tecken det var före. Jag vet inte hur strikt det är med att t.ex. X och Y alltid måste ha 3 decimaler, men man får väl lägga in fall för det också i så fall. Förhoppningsvis ger det dig en bra start i alla fall. Det borde inte vara så svårt att skriva något liknande i C# om du föredrar det.

#include <iostream> #include <fstream> #include <sstream> #include <list> typedef std::list<char> symbol_list; typedef std::list<double> number_list; // Formats a number into a string of size 4, with leading zeroes. std::string line_nr_to_str(int line_nr) { std::stringstream ss; std::string str; ss.fill('0'); ss.width(4); ss << line_nr; ss >> str; return str; } int main(int argc, char **argv) { if(argc <= 1) { std::cout << "Usage: " << argv[0] << " input_file" << std::endl; return 0; } // Open input and output files. std::ifstream input(argv[1]); std::string output_filename = argv[1]; output_filename += ".emco"; std::ofstream output(output_filename.c_str()); std::string str; int line_number = 0; // Read the file line by line. while(std::getline(input, str)) { // Output the line number. output << 'N' << line_nr_to_str(line_number) << ' '; // Parse the line into symbols and numbers. std::stringstream ss(str); symbol_list symbols; number_list numbers; char c; double d; while((ss >> c)) { symbols.push_back(c); if(ss >> d) { numbers.push_back(d); } } // If the number of symbols and numbers differs something is wrong. if(symbols.size() != numbers.size()) { std::cout << "Invalid data format!" << std::endl; return 1; } symbol_list::iterator s_end = symbols.end(); symbol_list::iterator symbol = symbols.begin(); number_list::iterator number = numbers.begin(); // For each symbol-number pair for(; symbol != s_end; ++symbol, ++number) { // Output the symbol. output << *symbol; // Output the number, with some special cases. switch(*symbol) { case 'G': case 'M': output << '0' << *number; break; case 'T': output << '0' << *number << '0' << *number; break; default: output << *number; break; } output << ' '; } // Finally, increment the line number. line_number += 10; output << '\n'; } }

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Oddjobb
hej lite ny här inne - söker väl perost men kan inte maila till han
Han kanske kan hjälpa mig
Sen en annan fråga är

Drupel s programvara att rekommendera eller skall man börja med något enklare /svårare eller så?
Som sagt jag är i starten - och vet inte hur mycket tid jag kommer på att lägga på att lära mig gör hemsidor
så tips tas emot - vill ha gjord en hemsida - o har mailat runt lite
har 2 st olika projekt som vill sjösättas

br

Seven

Allvarligt, vad yrar du i?

Visa signatur

Nämns inget annat så menar jag denna maskinen:
ASUS G53SW - Intel i7-2630QM @ 2.00Ghz - 12GB RAM - Nvidia GeForce GTX460M 1.5GB
Intel 510 SSD 128GB - Seagate Momentus XT SSHD 500GB - Windows 7 x64 Ultimate SP1
Chrome v38/latest, Chrome Canary och Firefox for development / debug