private void OnUserParameterCB(IntPtr ptr, string str) { int para = Int32.Parse(str); switch (para) { case 0: // 設定 user parameter 為 0x10 // 如果此範例重新執行不會再載入以下 SFC bot.EvaluateScript("$10 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun // 載入後再執行 `reset-overrun` bot.EvaluateScript("0sfc ignore-overrun"); // 要留意載入順序 bot.LoadSFC(@"..\..\rcon-system.fs"); bot.LoadSFC(@"..\..\plc.fs"); // SFC 設置完成後下個週期 reset overrun bot.EvaluateScript("1 ms reset-overrun"); break; default: break; } sfcLoaded = true; }
private void OnUserParameterCallback(IntPtr dataPtr, string str) { int para = Int32.Parse(str); switch (para) { case 0: // 設定 user parameter 為 16 // 如果此範例重新執行不會再載入以下 SFC bot.EvaluateScript("16 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun // 載入後再執行 `reset-overrun` bot.EvaluateScript(@"0sfc ignore-overrun"); bot.LoadSFC(@"../../group2d.sfc"); bot.LoadSFC(@"../../mpg.sfc"); bot.LoadSFC(@"../../manager.sfc"); bot.EvaluateScript(@"marker -axes .user-para"); break; case 16: bot.EvaluateScript(@"reset-overrun 32 user-para! .user-para"); break; case 32: hasSFC = true; break; default: break; } }
private static void OnUserParameterCB(IntPtr dataPtr, string str) { int para = Int32.Parse(str); switch (para) { case 0: // 設定 user parameter 為 0x10 // 如果此範例重新執行不會在載入以下 SFC bot.EvaluateScript("$10 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun // 載入後再執行 `reset-overrun` bot.EvaluateScript("0sfc ignore-overrun"); bot.LoadSFC(@"..\..\config.sfc"); bot.LoadSFC(@"..\..\servo_on_off.sfc"); bot.LoadSFC(@"..\..\homing.sfc"); bot.LoadSFC(@"..\..\motion_state.sfc"); bot.LoadSFC(@"..\..\manager.sfc"); // 等待 SFC 設置完成 Thread.Sleep(500); bot.EvaluateScript("reset-overrun"); break; default: break; } hasSFC = true; }
private void OnUserParameterCallback(IntPtr dataPtr, string str) { int para = Int32.Parse(str); switch (para) { case 0: // 設定 user parameter 為 0x10 // 如果此範例重新執行不會在載入以下 SFC //EvaluateScript("$10 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun // 載入後再執行 `reset-overrun` bot.EvaluateScript("0sfc ignore-overrun"); bot.EvaluateScript("-work marker -work"); bot.LoadSFC(@"..\..\positionComparsion.sfc"); // 等待 SFC 設置完成 has_updated = true; Thread.Sleep(10); bot.EvaluateScript("reset-overrun"); break; default: break; } }
private void OnUserParameterCallback(IntPtr dataPtr, string str) { int para = Int32.Parse(str); switch (para) { case 0: // 設定 user parameter 為 0x10 // 如果此範例重新執行不會在載入以下 SFC //EvaluateScript("$10 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun // 載入後再執行 `reset-overrun` bot.EvaluateScript("0sfc ignore-overrun"); bot.EvaluateScript("-work marker -work"); bot.LoadSFC(@"SDOUploadList.sfc"); // 等待 SFC 設置完成 Thread.Sleep(100); // 設定 SDOUploadList.sfc 中的 AIN 與 AOUT 模組的站號 bot.EvaluateScript(DeltaAinSlavePosStr + " ain-slave-pos! " + DeltaAoutSlavePosStr + " aout-slave-pos! "); // send-param-request 是要求 AIN, AOUT 模組送回目前模式設定 // 回傳的資料範例如下: // aout1_mode|3 // aout2_mode|1 // aout3_mode|0 // aout4_mode|0 // ain_mode|1 bot.EvaluateScript("reset-overrun send-param-request"); break; default: break; } }
private void OnUserParameterCallback(IntPtr dataPtr, string str) { int para = Int32.Parse(str); switch (para) { case 0: // 設定 user parameter 為 16 // 如果此範例重新執行不會再載入以下 SFC bot.EvaluateScript("16 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun // 載入後再執行 `reset-overrun` bot.EvaluateScript(@"0sfc ignore-overrun -work marker -work"); bot.LoadSFC(@"../../feeder.fs"); bot.LoadSFC(@"../../sdo_upload.fs"); bot.LoadSFC(@"../../manager.fs"); bot.EvaluateScript(@"marker -feeder .user-para"); //new Thread(() => System.Windows.Forms.MessageBox.Show("OnUserParameterCallback 0")).Start(); break; case 16: bot.EvaluateScript(@"reset-overrun 32 user-para! .user-para"); //new Thread(() => System.Windows.Forms.MessageBox.Show("OnUserParameterCallback 16")).Start(); break; case 32: //new Thread(() => System.Windows.Forms.MessageBox.Show("OnUserParameterCallback 32")).Start(); bot.EvaluateScript(@".devices-info .feeder-para .ec-links 64 user-para! .user-para"); break; case 64: //new Thread(() => System.Windows.Forms.MessageBox.Show("OnUserParameterCallback 64")).Start(); string cmd = null; for (int i = 1; i <= slavesLen; i++) { cmd += (i.ToString() + @" .slave "); } bot.EvaluateScript(cmd); hasSFC = true; break; default: break; } }
private void OnUserParameterCB(IntPtr dataPtr, string str) { int para = Int32.Parse(str); switch (para) { case 0: // 設定 user parameter 為 0x10 // 如果此範例重新執行不會再載入以下 SFC //botnana.EvaluateScript("$10 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun // 載入後再執行 `reset-overrun` botnana.EvaluateScript("0sfc ignore-overrun -work marker -work "); botnana.LoadSFC(@"mpg.sfc"); botnana.LoadSFC(@"manager.sfc"); // 等待 SFC 設置完成 botnana.SendScript("reset-overrun"); break; default: break; } hasSFC = true; }
private void OnUserParameterCallback(IntPtr dataPtr, string str) { int para = Int32.Parse(str); switch (para) { case 0: // 設定 user parameter 為 16 // 如果此範例重新執行不會再載入以下 SFC bot.EvaluateScript("16 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun // 載入後再執行 `reset-overrun` bot.EvaluateScript(@"0sfc ignore-overrun -work marker -work"); bot.LoadSFC(@"config.fs"); bot.LoadSFC(@"demo.fs"); bot.LoadSFC(@"torque.fs"); bot.LoadSFC(@"manager.fs"); bot.EvaluateScript(@"marker -torque .user-para"); //new Thread(() => System.Windows.Forms.MessageBox.Show("OnUserParameterCallback 0")).Start(); break; case 16: bot.EvaluateScript(@"reset-overrun 32 user-para! .user-para"); //new Thread(() => System.Windows.Forms.MessageBox.Show("OnUserParameterCallback 16")).Start(); break; case 32: //new Thread(() => System.Windows.Forms.MessageBox.Show("OnUserParameterCallback 32")).Start(); bot.EvaluateScript(@".device-infos .ec-links 64 user-para! .user-para"); break; case 64: //new Thread(() => System.Windows.Forms.MessageBox.Show("OnUserParameterCallback 64")).Start(); string cmd = null; // +coordinator : 啟動軸組控制的功能 cmd += @"+coordinator "; if (torqueDriveSlave != 0) { // 1 .slave 回應的訊息範例如下: // vendor.1|0x000001DD|product.1|0x10305070|description.1||ec_alias.1|0|slave_state.1|0x23 // |device_type.1|0x04020192|profile_deceleration.1.1|100000|profile_acceleration.1.1|100000 // |profile_velocity.1.1|50000|operation_mode.1.1|6|home_offset.1.1|0|homing_method.1.1|35 // |homing_speed_1.1.1|10000|homing_speed_2.1.1|1000|homing_acceleration.1.1|50000 // |supported_drive_mode.1.1|0x000003ED|target_velocity.1.1|0|drive_polarity.1.1|0x00 // |min_position_limit.1.1|-2147483648|max_position_limit.1.1|2147483647|target_torque.1.1|0 // |torque_slope.1.1|200|max_motor_speed.1.1|5000|drive_homed.1.1|0|drive_douts.1.1|0 // |drive_douts_mask.1.1|0|control_word.1.1|0x0000|target_position.1.1|0|status_word.1.1|0x0250 // |real_position.1.1|0|digital_inputs.1.1|0x00000004|real_torque.1.1|0|pds_state.1.1|Switch On Disabled // |pds_goal.1.1|Switch On Disabled cmd += torqueDriveSlave.ToString() + @" .slave "; } if (torqueAxisNumber != 0) { // "1 .axiscfg" 回應的訊息範例如下: // axis_name.1|A2|axis_home_offset.1|0.0000000|encoder_length_unit.1|Meter // |encoder_ppu.1|1000000.00000|encoder_direction.1|1|ext_encoder_ppu.1|60000.00000 // |ext_encoder_direction.1|-1|closed_loop_filter.1|15.0|max_position_deviation.1|0.001000 // |drive_alias.1 |0|drive_slave_position.1|1|drive_channel.1|1|ext_encoder_alias.1|0 // |ext_encoder_slave_position.1|0|ext_encoder_channel.1|0|axis_amax.1|5.00000 // |axis_vmax.1|0.10000|axis_vff.1|0.00|axis_vfactor.1|1.00000|axis_aff.1|0.00 // |axis_afactor.1|1.00000 // 其中 encoder_length_unit 是設定 Encoder 解析度的單位距離 // encoder_ppu 是設定 Encoder 單位距離有幾個脈波數 // axis_vmax 是運動軸的最大速度 [m/s] // axis_amax 是運動軸的最大加速度 [m/s^2] // drive_alias, drive_slave_position, drive_channel 用來指定對應的驅動器, // 如果 drive_alias > 0 就採用 drive_alias 與 drive_channel, // 如果 drive_alias == 0 就採用 drive_slave_position 與 drive_channel, // 如果沒有對應的驅動器,該運動軸及為虛擬軸 cmd += torqueAxisNumber.ToString() + @" .axiscfg "; } if (torqueGroupNumber != 0) { // "1 .grpcfg" 回應的訊息範例如下: // group_name.1|G1X|group_type.1|1D|group_mapping.1|1|group_vmax.1|0.05000 // |group_amax.1|2.00000|group_jmax.1|40.00000 // 其中 group_type 是設定軸組型態 // group_mapping 是設定軸組會使用哪幾個運動軸 // group_vmax 是運動軸的最加速度 [m/s] // group_amax 是運動軸的最大加速度 [m/s^2] // group_jmax 是運動軸的最大加加速度 [m/s^3] cmd += torqueGroupNumber.ToString() + @" .grpcfg "; } bot.EvaluateScript(cmd); hasSFC = true; break; default: break; } }
public FormApp() { InitializeComponent(); bot = new Botnana("192.168.7.2"); // 啟動終端機,可幫助除錯,若不使用可不啟動。 RunConsole(); // On WebSocket open callback. onWSOpen = new HandleMessage((IntPtr dataPtr, string str) => { webSocketState = 2; rebooting = false; BeginInvoke(new Appdeg(() => { buttonWSState.Text = "WebSocket ready"; buttonWSState.BackColor = Color.FromArgb(0x53, 0xFF, 0x53); })); // 送出 .user-para 命令,讓為回傳的訊息去觸發 OnUserParameterCallback // 若重複執行從 32 開始,因為需要 .device-infos 取得周邊裝置的資訊 // .user-para 回應的訊息範例如下: // user_parameter|0 bot.EvaluateScript(@"user-para@ 32 min user-para! .user-para"); Console.WriteLine("WebSocket connected."); }); bot.SetOnOpenCB(IntPtr.Zero, onWSOpen); // On WebSocket error callback. onWSError = new HandleMessage((IntPtr dataPtr, string str) => { webSocketState = 0; slavesCount = 0; hasSFC = false; BeginInvoke(new Appdeg(() => { buttonWSState.Text = "WebSocket not ready"; buttonWSState.BackColor = Color.FromArgb(0xFF, 0x2D, 0x2D); buttonECState.Text = "EtherCAT not ready(" + slavesCount.ToString() + ")"; buttonECState.BackColor = Color.FromArgb(0xFF, 0x2D, 0x2D); buttonSystemReady.Text = "System not ready"; buttonSystemReady.BackColor = Color.FromArgb(0xFF, 0x2D, 0x2D); })); formTorque.Reset(); formFeeder.Reset(); formRCON.Reset(); Console.WriteLine("WS error : " + str); }); bot.SetOnErrorCB(IntPtr.Zero, onWSError); // On Message callback. onMessage = new HandleMessage((IntPtr dataPtr, string str) => { Console.WriteLine("OnMessage : " + str); }); bot.SetOnMessageCB(IntPtr.Zero, onMessage); // On Error tag callback onErrorMessage = new HandleMessage((IntPtr dataPtr, string str) => { if (errorsLen < 3) { errorsLen += 1; new Thread(() => { System.Windows.Forms.MessageBox.Show("Error|" + str); errorsLen -= 1; }).Start(); } Console.WriteLine("Error|" + str); }); bot.SetTagCB(@"error", 0, IntPtr.Zero, onErrorMessage); // On user_parameter tag callback. onUserParameter = new HandleMessage((IntPtr dataPtr, string str) => { switch (Int32.Parse(str)) { case 0: Console.WriteLine("OnUserParameterCallback 0"); if (webSocketState == 2 && !rebooting) { // 設定 user parameter 為 16,如果此範例重新執行不會再載入以下 SFC bot.EvaluateScript("16 user-para!"); // 清除SFC 邏輯,載入 SFC 時會造成 real time cycle overrun,所以要暫時 ignore-overrun bot.EvaluateScript(@"ignore-overrun 0sfc -work marker -work"); bot.LoadSFC(@"config.fs"); bot.LoadSFC(@"sdo.fs"); bot.LoadSFC(@"torque.fs"); bot.LoadSFC(@"feeder.fs"); bot.LoadSFC(@"rcon.fs"); bot.LoadSFC(@"manager.fs"); bot.EvaluateScript(@"marker -app .user-para"); } break; case 16: Console.WriteLine("OnUserParameterCallback 16"); // 載入後執行 `reset-overrun` BotEvaluateScript(@"reset-overrun 32 user-para! .user-para"); break; case 32: Console.WriteLine("OnUserParameterCallback 32"); formTorque.Initialize(); formFeeder.Initialize(); formRCON.Initialize(); BotEvaluateScript(@"+coordinator 64 user-para! .user-para"); break; case 64: Console.WriteLine("OnUserParameterCallback 64"); hasSFC = true; break; default: break; } }); bot.SetTagCB(@"user_parameter", 0, IntPtr.Zero, onUserParameter); // On ec_ready tag callback. onECReady = new HandleMessage((IntPtr dataPtr, string str) => { if (str == "1") { BeginInvoke(new Appdeg(() => { buttonECState.Text = "EtherCAT ready(" + slavesCount.ToString() + ")"; buttonECState.BackColor = Color.FromArgb(0x53, 0xFF, 0x53); })); } else { BeginInvoke(new Appdeg(() => { buttonECState.Text = "EtherCAT not ready(" + slavesCount.ToString() + ")"; buttonECState.BackColor = Color.FromArgb(0xFF, 0x2D, 0x2D); })); } }); bot.SetTagCB(@"ec_ready", 0, IntPtr.Zero, onECReady); // On slaves_responding tag callback. onSlavesResponding = new HandleMessage((IntPtr dataPtr, string str) => { slavesCount = int.Parse(str); }); bot.SetTagCB(@"slaves_responding", 0, IntPtr.Zero, onSlavesResponding); // On system_ready tag callback. onSystemReady = new HandleMessage((IntPtr dataPtr, string str) => { if (str == "-1") { BeginInvoke(new Appdeg(() => { buttonSystemReady.Text = "System ready"; buttonSystemReady.BackColor = Color.FromArgb(0x53, 0xFF, 0x53); })); } else { BeginInvoke(new Appdeg(() => { buttonSystemReady.Text = "System not ready"; buttonSystemReady.BackColor = Color.FromArgb(0xFF, 0x2D, 0x2D); })); } }); bot.SetTagCB(@"system_ready", 0, IntPtr.Zero, onSystemReady); formTorque = new FormTorque(); formFeeder = new FormFeeder(); formRCON = new FormRCON(); }