private void buttonDeploy_Click(object sender, EventArgs e) { int p1 = Int32.Parse(textP1.Text); int p2 = Int32.Parse(textP2.Text); int p3 = Int32.Parse(textP3.Text); //deploy 後要等待 deployed|ok 訊息回傳後才能執行 pm_run(botnana, program); bot.ClearProgram(); bot.AddProgramLine("pp 1 1 op-mode!"); bot.AddProgramLine("until-no-requests"); //program_line_dll(program, " begin -1 while"); // 如果要p1->p2->p3->p1...運動,就移除此行註解 bot.AddProgramLine(p1.ToString() + " 1 1 target-p!"); bot.AddProgramLine(" 1 1 go 1 1 until-target-reached"); bot.AddProgramLine(p2.ToString() + " 1 1 target-p!"); bot.AddProgramLine(" 1 1 go 1 1 until-target-reached"); bot.AddProgramLine(p3.ToString() + " 1 1 target-p!"); bot.AddProgramLine(" 1 1 go 1 1 until-target-reached"); //program_line_dll(program, " repeat"); // 如果要p1->p2->p3->p1...運動,就移除此行註解 bot.EvaluateScript("-work marker -work"); // 清除先前定義的program bot.DeployProgram(); buttonPMAbort.Enabled = true; buttonRun.Enabled = true; }
// 送出 NC 程式到 Botnana Control private void btnSend_Click(object sender, EventArgs e) { if (motionState == 3) { new Thread(() => System.Windows.Forms.MessageBox.Show("Motion in Machining !!")).Start(); } else if (ncSuspended == 1) { new Thread(() => System.Windows.Forms.MessageBox.Show("Machining Feed Hold!!")).Start(); } else if (hasProgram) { new Thread(() => System.Windows.Forms.MessageBox.Show("Has program !!")).Start(); } else { //deploy 後要等待 deployed|ok 訊息回傳後才能執行 pm_run(botnana, program); bot.ClearProgram(); // 判斷 G92 if (ncProgram[2, 0].Value == null || ncProgram[3, 0].Value == null || ncProgram[4, 0].Value == null) { new Thread(() => System.Windows.Forms.MessageBox.Show("Invalid G92")).Start(); } else { double[] positions = new double[3]; double[] next_positions = new double[3]; double feedrate = 0.015; positions[0] = double.Parse(ncProgram[2, 0].Value.ToString()); positions[1] = double.Parse(ncProgram[3, 0].Value.ToString()); positions[2] = double.Parse(ncProgram[4, 0].Value.ToString()); // 清除先前定義的program bot.EvaluateScript("-nc marker -nc"); // 切換到 Group 1,清除先前路徑 bot.AddProgramLine("1 group! 0path "); // 設定 path id 與 mode bot.AddProgramLine("1 path-id! 92 path-mode!"); // G92 對應的指令 bot.AddProgramLine(positions[0].ToString("F5") + "e mm " + positions[1].ToString("F5") + "e mm " + positions[2].ToString("F5") + "e mm move3d"); for (int i = 1; i < 10; i++) { // 從表格取得目標位置 for (int j = 0; j < 3; j++) { next_positions[j] = positions[j]; if (ncProgram[2 + j, i].Value != null) { next_positions[j] = double.Parse(ncProgram[2 + j, i].Value.ToString()); } } // 從表格取得 feedrate if (ncProgram[5, i].Value != null) { feedrate = double.Parse(ncProgram[5, i].Value.ToString()); bot.AddProgramLine("1 group! " + feedrate.ToString("F2") + "e mm/min feedrate!"); } // 如果是新的目標位置,就插入直線路徑 // 如果需要圓弧就要使用 `helix3d` 指令 if (next_positions[0] != positions[0] || next_positions[1] != positions[1] || next_positions[2] != positions[2]) { // 取得路徑上的運動模式 (例如:加工或是非加工) int mode = Int32.Parse(ncProgram[1, i].Value.ToString()); positions[0] = next_positions[0]; positions[1] = next_positions[1]; positions[2] = next_positions[2]; bot.AddProgramLine("1 group! "); // 設定 path id and mode bot.AddProgramLine(i.ToString() + @" path-id! " + mode.ToString() + @" path-mode!"); // 插入直線路徑 bot.AddProgramLine(positions[0].ToString("F5") + "e mm " + positions[1].ToString("F5") + "e mm " + positions[2].ToString("F5") + "e mm line3d"); } } // 等待 Group 1 走到路徑終點 bot.AddProgramLine("begin 1 group! gend? not while pause repeat"); // 通知 machining state NC 程式執行完畢 bot.AddProgramLine("true machining-finished !"); // 送到 NC Task 編譯 bot.DeployProgram(); } } }