示例#1
0
        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;
        }
示例#2
0
        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;
            }
        }
示例#3
0
        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;
        }
示例#4
0
        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;
            }
        }
示例#5
0
        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;
            }
        }
示例#6
0
        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;
            }
        }
示例#7
0
        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;
        }
示例#8
0
        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;
            }
        }
示例#9
0
        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();
        }