Post Processor
Bir DXF dosyası ya da hazır şekil G koda dönüştürülüp sisteme aktarılmak istendiğinde Post Prosesör makrosu kullanılır. Operatör bir DXF doyasını ya da hazır şekillerden birini açtığında HSC Studio şekilleri sırayla tarayarak Post Prosesör makrosuna yönlendirir. Post Prosesör makrosu diğer C# makroları gibi makrolar bölümüne PostPro ismi ile oluşturulmalıdır. HSC Studio bu makro programına ilgili değerleri aktarmak ve oluşan G kodları biriktirmek için ön tanımlı post sınıfı içerir. Makro programı içinde hiçbir atama yapmaya gerek kalmadan bu sınıfa ulaşılabilir. Oluşturulan makro içerisinde PostProCmd isimli bir fonksiyon bulunmalıdır. HSC Studio çıktıları bu fonksiyona string tipinde yönlendirir.
public void PostProCmd(string cmd)
{
// Post prosesör yönlendirmeleri burada yapılmalıdır
}
Post Prosesör komut listesi:
Init
Finish
Comment
BeginLayer
EndLayer
Line
Arc
StartDistance
EndDistance
post sınıfı:
public float Tolerance = 0.1F;
public int CompSide = 0;
public float StartX = 0;
public float StartY = 0;
public float StartZ = 0;
public float EndX = 0;
public float EndY = 0;
public float EndZ = 0;
public float ArcCenterX = 0;
public float ArcCenterY = 0;
public float ArcRadius = 0;
public bool ArcDir = false;
public float ZRetract = 0;
public float ZSafePos = 0;
public float ZCutPos = 0;
public int Tool = 0;
public float Feed = 0;
public float ZFeed = 0;
public int SpindleDir = 0;
public int SpindleSpeed = 0;
public string Comment = "";
public string LayerName = "";
public string Label = "";
/// <summary>
/// Gönderilen karakter dizesini Output değişkenine ekler
/// </summary>
/// <param name="s">Output değişkenine eklenecek karakter dizesi</param>
/// <returns></returns>
public void Add(string s)
/// <summary>
/// Gönderilen karakter dizesini
/// sonuna satır sonu karakterleri ilave ederek
/// Output değişkenine ekler
/// </summary>
/// <param name="s">Output değişkenine eklenecek karakter dizesi</param>
/// <returns></returns>
public void AddLine(string s)
/// <summary>
/// Gönderilen double tipini ve komutu formatlayarak string olarak döndürür
/// </summary>
/// <param name="cmd"></param>
/// <param name="n"></param>
/// <returns></returns>
public string Cmd(string cmd, float n, int precision)
Örnek Post Prosesör Makrosu :
// Yerel değişkenler
int precision = 4; // Ondalık hane sayısı
int compSide = 0; // Son takım yarıçap telafi yönü (0: KAPALI, 1: SOL, 2: SAĞ)
int spdDir = 0; // Son spindle dönüş yönü
int spdSpeed = 0; // Son spindle hızı
int tool = 0; // Son takım
float curX = float.MinValue; // İşlenen son X pozisyonu
float curY = float.MinValue; // İşlenen son Y pozisyonu
float curZ = float.MinValue; // İşlenen son Z pozisyonu
float curF = float.MinValue; // Verilen son ilerleme komutu
int NCounter = 1;
bool g50_1 = false;
/// <summary>
/// Boş bırakın
/// </summary>
public void Main()
{
}
/// <summary>
/// Dönüşüm için ana metod
/// <param name="cmd">Command</param>
/// </summary>
public void PostProCmd(string cmd)
{
switch (cmd)
{
case "Init":
Init();
break;
case "Finish":
Finish();
break;
case "Comment":
Comment();
break;
case "BeginLayer":
BeginLayer();
break;
case "EndLayer":
EndLayer();
break;
case "Line":
Line();
break;
case "Arc":
Arc();
break;
case "StartDistance":
break;
case "EndDistance":
break;
default:
break;
}
}
/// <summary>
/// G kod dosyası oluşturmaya başlamadan hemen önce çağrılır
/// İhtiyaç duyulan başlangıç atamaları burada gerçekleştirilebilir
/// </summary>
private void Init()
{
compSide = 0;
feed = 0;
spdDir = 0;
spdSpeed = 0;
tool = 0;
curX = float.MinValue;
curY = float.MinValue;
curZ = float.MinValue;
curF = float.MinValue;
post.AddLine("(THIS FILE IS CREATED BY HSC STUDIO)");
post.AddLine("(-- www.hsckontrol.com ---)");
post.AddLine("");
post.AddLine("G54 G90 G00 G40 G49 G80 G21");
post.AddLine("");
}
/// <summary>
/// Dosyanın sonuna yazdırılacak kod bloğu
/// </summary>
private void Finish()
{
// Takım çap telafiyi (açıksa) kapat
if (compSide != 0) post.AddLine("G40");
// Spindle stop
post.AddLine("M5");
// Z referans konumuna
post.AddLine("G53 G90 G00 Z0.");
post.AddLine("M30 (END OF PROGRAM)");
post.AddLine("%");
// G kod dosyasına kaydet
string file_name = "C:\\shape.cnc";
using (StreamWriter writer = new StreamWriter(file_name, false))
{
writer.Write(post.Output);
}
// Pulser’a kopyala
CopyGCode(file_name);
}
/// <summary>
/// Açıklama
/// <param name="post.Comment">Açıklama içeriği</param>
/// </summary>
private void Comment()
{
post.AddLine("(" + post.Comment + ")");
}
/// <summary>
/// Yeni bir katmana başlanıyor
/// </summary>
private void BeginLayer()
{
}
/// <summary>
/// Katman tamamlandı
/// </summary>
private void EndLayer()
{
}
/// <summary>
/// Lineer kesim hareketi için gereken kod bloğu
/// <param name="post.StartX">Hareketin X başlangıç koordinatı</param>
/// <param name="post.StartY">Hareketin Y başlangıç koordinatı</param>
/// <param name="post.StartZ">Hareketin Z başlangıç koordinatı</param>
/// <param name="post.EndX">Hareketin X hedef koordinatı</param>
/// <param name="post.EndY">Hareketin Y hedef koordinatı</param>
/// <param name="post.EndZ">Hareketin Z hedef koordinatı</param>
/// </summary>
private void Line()
{
// Çerçeve çizgileri atlanır
if (post.Label == "Border") return;
// Gerekliyse hareketin başlangıç noktasına rapid hareket
RapidMoveToStartPos();
// Z başlangıç koordinatına hareket
if (curZ != post.StartZ)
{
// Z Eksen kesim başlangıç koordinatına yavaş hareket
post.AddLine("G01" + post.Cmd("Z", post.StartZ, precision) +
post.Cmd("F", post.ZFeed, precision));
curZ = post.StartZ;
}
// Dokum baslangıcı tamamlandı
if (g50_1 == true)
{
post.Add("G50.1 ");
g50_1 = false;
}
// Lineer kesim komutu
post.Add("G01 ");
// X hedef
if (post.StartX != post.EndX)
post.Add(post.Cmd("X", post.EndX, precision));
// Y hedef
if (post.StartY != post.EndY)
post.Add(post.Cmd("Y", post.EndY, precision));
// Z hedef
if (post.StartZ != post.EndZ)
post.Add(post.Cmd("Z", post.EndZ, precision));
// F hedef
if (curF != post.Feed)
post.Add(post.Cmd("F", post.Feed, 1));
// Satır sonu
post.AddLine("");
// Anlık konumu sakla
curX = post.EndX;
curY = post.EndY;
curZ = post.EndZ;
curF = post.Feed;
}
/// <summary>
/// Yay kesim hareketi için gereken kod bloğu
/// <param name="post.StartX">Hareketin X başlangıç koordinatı</param>
/// <param name="post.StartY">Hareketin Y başlangıç koordinatı</param>
/// <param name="post.StartZ">Hareketin Z başlangıç koordinatı</param>
/// <param name="post.EndX">Hareketin X hedef koordinatı</param>
/// <param name="post.EndY">Hareketin Y hedef koordinatı</param>
/// <param name="post.EndZ">Hareketin Z hedef koordinatı</param>
/// <param name="post.ArcCenterX">Yay merkezinin X koordinatı</param>
/// <param name="post.ArcCenterY">Yay merkezinin Y koordinatı</param>
/// <param name="post.ArcRadius">Yayın yarıçapı</param>
/// <param name="post.ArcDir">Yay dönüş yönü false: CCW, true: CW </param>
/// </summary>
private void Arc()
{
// Çerçeve çizgileri atlanır
if (post.Label == "Border") return;
// Gerekliyse hareketin başlangıç noktasına rapid hareket
RapidMoveToStartPos();
// Z başlangıç koordinatına hareket
if (curZ != post.StartZ)
{
// Z Eksen kesim başlangıç koordinatına yavaş hareket
post.AddLine("G01" + post.Cmd("Z", post.StartZ, precision) +
post.Cmd("F", post.ZFeed, precision));
curZ = post.StartZ;
}
// Dokum baslangıcı tamamlandı
if (g50_1 == true)
{
post.Add("G50.1 ");
g50_1 = false;
}
// Yay kesim komutu
if (post.ArcDir == false) post.Add("G03 ");
else post.Add("G02 ");
// X hedef
if (post.StartX != post.EndX)
post.Add(post.Cmd("X", post.EndX, precision));
// Y hedef
if (post.StartY != post.EndY)
post.Add(post.Cmd("Y", post.EndY, precision));
// Z hedef
if (post.StartZ != post.EndZ)
post.Add(post.Cmd("Z", post.EndZ, precision));
// Yay merkezi X (I komutu)
post.Add(post.Cmd("I", post.ArcCenterX - post.StartX, precision));
// Yay merkezi Y (J komutu)
post.Add(post.Cmd("J", post.ArcCenterY - post.StartY, precision));
// F hedef
if (curF != post.Feed)
post.Add(post.Cmd("F", post.Feed, 1));
// Satır sonu
post.AddLine("");
// Anlık konumu sakla
curX = post.EndX;
curY = post.EndY;
curZ = post.EndZ;
curF = post.Feed;
}
/// <summary>
/// Hareketin başlangıcına -gerekliyse- Rapid hareket
/// </summary>
private void RapidMoveToStartPos()
{
/*
if(post.Tool != tool){
post.AddLine( "M06 T" + post.Tool.ToString());
post.AddLine( "G43 H" + post.Tool.ToString());
tool = post.Tool;
}
*/
if ((post.SpindleDir != spdDir) || (post.SpindleSpeed != spdSpeed))
{
switch (post.SpindleDir)
{
case 1:
post.AddLine("M03 S" + post.SpindleSpeed.ToString());
break;
case 2:
post.AddLine("M04 S" + post.SpindleSpeed.ToString());
break;
default:
post.AddLine("M05");
break;
}
spdDir = post.SpindleDir;
spdSpeed = post.SpindleSpeed;
}
if ((Math.Abs(post.StartX - curX) > post.Tolerance)
|| (Math.Abs(post.StartY - curY) > post.Tolerance))
{
// Rapid hareketten önce takım çap telafiyi (açıksa) kapat
if (compSide != 0) post.AddLine("G40");
// Z geri kaçma noktasına hızlı hareket
post.AddLine("G00" + post.Cmd("Z", post.ZRetract, precision));
//N Numaraları eklenir
post.AddLine("N" + NCounter++.ToString());
// Kesime başlamadan önce takım çap telafiyi aç
if (post.CompSide == 1) post.AddLine("G41 D" + post.Tool.ToString());
else if (post.CompSide == 2) post.AddLine("G42 D" + post.Tool.ToString());
compSide = post.CompSide;
// XY kesim başlangıç noktasına hızlı hareket
post.AddLine("G00" + post.Cmd("X", post.StartX, precision) +
post.Cmd("Y", post.StartY, precision));
// Z Eksen emniyetli noktaya rapid hızlı hareket
post.AddLine("G50.2 G00" + post.Cmd("Z", post.ZSafePos, precision));
// Z Eksen kesim koordinatına yavaş hareket
post.AddLine("G01" + post.Cmd("Z", post.StartZ, precision) +
post.Cmd("F", post.ZFeed, precision));
// Anlık konumu sakla
curX = post.StartX;
curY = post.StartY;
curZ = post.StartZ;
curF = post.ZFeed;
}
}
