Exemplo n.º 1
0
        public void InitializeBotnana(Botnana bot)
        {
            botnana    = bot;
            onSDOIndex = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                BeginInvoke(new Deg(() => { if (slv == slaveNumber)
                                            {
                                                textBoxSDOIndexS.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"sdo_index", 0, IntPtr.Zero, onSDOIndex);

            onSDOSubIndex = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                BeginInvoke(new Deg(() => { if (slv == slaveNumber)
                                            {
                                                textBoxSDOSubIndexS.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"sdo_subindex", 0, IntPtr.Zero, onSDOSubIndex);

            onSDOError = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                BeginInvoke(new Deg(() => { if (slv == slaveNumber)
                                            {
                                                textBoxSDOErrorS.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"sdo_error", 0, IntPtr.Zero, onSDOError);

            onSDOBusy = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                BeginInvoke(new Deg(() => { if (slv == slaveNumber)
                                            {
                                                textBoxSDOBusyS.Text = str;
                                            }
                                    }));
                if (slv == slaveNumber && str == "true")
                {
                    UpdateData();
                }
            });
            botnana.SetTagNameCB(@"sdo_busy", 0, IntPtr.Zero, onSDOBusy);

            onSDOData = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                BeginInvoke(new Deg(() => { if (slv == slaveNumber)
                                            {
                                                textBoxSDOValueS.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"sdo_data", 0, IntPtr.Zero, onSDOData);
        }
Exemplo n.º 2
0
        private void Form1_Load(object sender, EventArgs e)
        {
            Process thisProc = Process.GetCurrentProcess();

            thisProc.PriorityClass = ProcessPriorityClass.RealTime;

            bot = new Botnana("192.168.7.2");

            onWSError = new HandleMessage(OnWSErrorCallback);
            bot.SetOnErrorCB(IntPtr.Zero, onWSError);
            onWSOpen = new HandleMessage(OnWSOpenCallback);
            bot.SetOnOpenCB(IntPtr.Zero, onWSOpen);
            onMessage = new HandleMessage(OnMessageCallback);
            bot.SetOnMessageCB(IntPtr.Zero, onMessage);

            onUserParameter = new HandleMessage(OnUserParameterCallback);
            bot.SetTagCB(@"user_parameter", 0, IntPtr.Zero, onUserParameter);
            onRTRealTorque = new HandleMessage(OnRTRealTorqueCallback);
            bot.SetTagCB(@"rt_real_torque", 0, IntPtr.Zero, onRTRealTorque);
            onSlavesResponding = new HandleMessage(OnSlavesRespondingCallback);
            bot.SetTagCB(@"slaves_responding", 0, IntPtr.Zero, onSlavesResponding);
            onSlavesState = new HandleMessage(OnSlavesStateCallback);
            bot.SetTagCB(@"al_states", 0, IntPtr.Zero, onSlavesState);
            onWaitingSDOs = new HandleMessage(OnWaitingSDOsCallback);
            bot.SetTagCB(@"waiting_sdos_len", 0, IntPtr.Zero, onWaitingSDOs);
            onPDSState = new HandleTagNameMessage(OnPDSStateCallback);
            bot.SetTagNameCB(@"pds_state", 0, IntPtr.Zero, onPDSState);
            onDriveStatus = new HandleTagNameMessage(OnDriveStatusCallback);
            bot.SetTagNameCB(@"status_word", 0, IntPtr.Zero, onDriveStatus);
            onOperationMode = new HandleTagNameMessage(OnOperationModeCallback);
            bot.SetTagNameCB(@"operation_mode", 0, IntPtr.Zero, onOperationMode);
            onHomingMethod = new HandleTagNameMessage(OnHomingMethodCallback);
            bot.SetTagNameCB(@"homing_method", 0, IntPtr.Zero, onHomingMethod);
            onHomingSpeed1 = new HandleTagNameMessage(OnHomingSpeed1Callback);
            bot.SetTagNameCB(@"homing_speed_1", 0, IntPtr.Zero, onHomingSpeed1);
            onHomingSpeed2 = new HandleTagNameMessage(OnHomingSpeed2Callback);
            bot.SetTagNameCB(@"homing_speed_2", 0, IntPtr.Zero, onHomingSpeed2);
            onHomingAcc = new HandleTagNameMessage(OnHomingAccCallback);
            bot.SetTagNameCB(@"homing_acceleration", 0, IntPtr.Zero, onHomingAcc);
            onProfileVelocity = new HandleTagNameMessage(OnProfileVelocityCallback);
            bot.SetTagNameCB(@"profile_velocity", 0, IntPtr.Zero, onProfileVelocity);
            onProfileAcc = new HandleTagNameMessage(OnProfileAccCallback);
            bot.SetTagNameCB(@"profile_acceleration", 0, IntPtr.Zero, onProfileAcc);
            onRealPosition = new HandleTagNameMessage(OnRealPositionCallback);
            bot.SetTagNameCB(@"real_position", 0, IntPtr.Zero, onRealPosition);
            onRealTorque = new HandleTagNameMessage(OnRealTorqueCallback);
            bot.SetTagNameCB(@"real_torque", 0, IntPtr.Zero, onRealTorque);
            onDigitalInputs = new HandleTagNameMessage(OnDigitalInputsCallback);
            bot.SetTagNameCB("digital_inputs", 0, IntPtr.Zero, onDigitalInputs);
            onTargetPosition = new HandleTagNameMessage(OnTargetPositionCallback);
            bot.SetTagNameCB(@"target_position", 0, IntPtr.Zero, onTargetPosition);
            onErrorMessage = new HandleMessage(OnErrorMessageCallback);
            bot.SetTagCB(@"error", 0, IntPtr.Zero, onErrorMessage);
            onAxisPosition = new HandleTagNameMessage(OnAxisPositionCallback);
            bot.SetTagNameCB(@"axis_demand_position", 0, IntPtr.Zero, onAxisPosition);
            onFeedbackPosition = new HandleTagNameMessage(OnFeedbackPositionCallback);
            bot.SetTagNameCB(@"feedback_position", 0, IntPtr.Zero, onFeedbackPosition);
            onEncoderLengthUnit = new HandleTagNameMessage(OnEncoderLengthUnitCallback);
            bot.SetTagNameCB(@"encoder_length_unit", 0, IntPtr.Zero, onEncoderLengthUnit);
            onEncoderPPU = new HandleTagNameMessage(OnEncoderPPUCallback);
            bot.SetTagNameCB(@"encoder_ppu", 0, IntPtr.Zero, onEncoderPPU);
            onDriveAlias = new HandleTagNameMessage(OnDriveAliasCallback);
            bot.SetTagNameCB(@"drive_alias", 0, IntPtr.Zero, onDriveAlias);
            onDriveSlavePosition = new HandleTagNameMessage(OnDriveSlavePositionCallback);
            bot.SetTagNameCB(@"drive_slave_position", 0, IntPtr.Zero, onDriveSlavePosition);
            onDriveChannel = new HandleTagNameMessage(OnDriveChannelCallback);
            bot.SetTagNameCB(@"drive_channel", 0, IntPtr.Zero, onDriveChannel);
            onAxisVmax = new HandleTagNameMessage(OnAxisVmaxCallback);
            bot.SetTagNameCB(@"axis_vmax", 0, IntPtr.Zero, onAxisVmax);
            onAxisAmax = new HandleTagNameMessage(OnAxisAmaxCallback);
            bot.SetTagNameCB(@"axis_amax", 0, IntPtr.Zero, onAxisAmax);
            onGroupType = new HandleTagNameMessage(OnGroupTypeCallback);
            bot.SetTagNameCB(@"group_type", 0, IntPtr.Zero, onGroupType);
            onGroupMapping = new HandleTagNameMessage(OnGroupMappingCallback);
            bot.SetTagNameCB(@"group_mapping", 0, IntPtr.Zero, onGroupMapping);
            onGroupVmax = new HandleTagNameMessage(OnGroupVmaxCallback);
            bot.SetTagNameCB(@"group_vmax", 0, IntPtr.Zero, onGroupVmax);
            onGroupAmax = new HandleTagNameMessage(OnGroupAmaxCallback);
            bot.SetTagNameCB(@"group_amax", 0, IntPtr.Zero, onGroupAmax);
            onGroupJmax = new HandleTagNameMessage(OnGroupJmaxCallback);
            bot.SetTagNameCB(@"group_jmax", 0, IntPtr.Zero, onGroupJmax);
            onTravelTime = new HandleMessage(OnTravelTimeCallback);
            bot.SetTagCB(@"travel_time", 0, IntPtr.Zero, onTravelTime);
            onDeviceInfos = new HandleMessage(OnDeviceInfos);
            bot.SetTagCB(@"device_infos", 1, IntPtr.Zero, onDeviceInfos);
            onSystemReady = new HandleMessage(OnSystemReady);
            bot.SetTagCB(@"system_ready", 0, IntPtr.Zero, onSystemReady);

            chartTorque.ChartAreas[0].AxisX.Minimum = 0;
            chartTorque.ChartAreas[0].AxisX.Maximum = QueueCapacity;

            timer1.Interval           = 10;
            timer1.Enabled            = true;
            timer2.Interval           = 500;
            timer2.Enabled            = true;
            torqueThread              = new Thread(new ThreadStart(this.getTorqueInformation));
            pauseEvent                = new ManualResetEvent(false);
            torqueThread.IsBackground = true;
            torqueThread.Start();
        }
Exemplo n.º 3
0
 private static extern void botnana_set_tagname_cb_dll(IntPtr desc, string tagName, int count, IntPtr dataPtr, HandleTagNameMessage hm);
Exemplo n.º 4
0
 // Set callback function of name of tag
 public void SetTagNameCB(string tag, int count, IntPtr dataPtr, HandleTagNameMessage hm)
 {
     botnana_set_tagname_cb_dll(innerBotnana, tag, count, dataPtr, hm);
 }
Exemplo n.º 5
0
        private void Form1_Load(object sender, EventArgs e)
        {
            bot = new Botnana("192.168.7.2");

            // WS 連線錯誤就呼叫 OnWSErrorCallback
            onWSError = new HandleMessage(OnWSErrorCallback);
            bot.SetOnErrorCB(IntPtr.Zero, onWSError);

            // WS 連線成功就呼叫 OnWSOpenCallback
            onWSOpen = new HandleMessage(OnWSOpenCallback);
            bot.SetOnOpenCB(IntPtr.Zero, onWSOpen);

            // 收到 tag = error 就呼叫 OnErrorMessageCallback
            onErrorMessage = new HandleMessage(OnErrorMessageCallback);
            bot.SetTagCB(@"error", 0, IntPtr.Zero, onErrorMessage);

            onUserParameter = new HandleMessage(OnUserParameterCallback);
            bot.SetTagCB(@"user_parameter", 0, IntPtr.Zero, onUserParameter);

            onAxisSectionPositions = new HandleTagNameMessage(OnAxisSectionPositions);
            bot.SetTagNameCB(@"axis_section_p", 0, IntPtr.Zero, onAxisSectionPositions);

            onAxisSectionVecloities = new HandleTagNameMessage(OnAxisSectionVecloities);
            bot.SetTagNameCB(@"axis_section_v", 0, IntPtr.Zero, onAxisSectionVecloities);

            onAxisRunnings = new HandleTagNameMessage(OnAxisRunnings);
            bot.SetTagNameCB(@"axis_running", 0, IntPtr.Zero, onAxisRunnings);

            onAxisCmds = new HandleTagNameMessage(OnAxisCmds);
            bot.SetTagNameCB(@"axis_command_position", 0, IntPtr.Zero, onAxisCmds);

            onAxisDemands = new HandleTagNameMessage(OnAxisDemands);
            bot.SetTagNameCB(@"axis_demand_position", 0, IntPtr.Zero, onAxisDemands);

            onAxisFeedbacks = new HandleTagNameMessage(OnAxisFeedbacks);
            bot.SetTagNameCB(@"feedback_position", 0, IntPtr.Zero, onAxisFeedbacks);

            onAxisReacheds = new HandleTagNameMessage(OnAxisReacheds);
            bot.SetTagNameCB(@"axis_interpolator_reached", 0, IntPtr.Zero, onAxisReacheds);

            onAxisInterpolatorEnables = new HandleTagNameMessage(OnAxisInterpolatorEnables);
            bot.SetTagNameCB(@"axis_interpolator_enabled", 0, IntPtr.Zero, onAxisInterpolatorEnables);

            onCoordinatorEnabled = new HandleMessage(OnCoordinatorEnabled);
            bot.SetTagCB(@"coordinator_enabled", 0, IntPtr.Zero, onCoordinatorEnabled);

            // 將區段位置與速度的參數元件放到一個陣列內
            textAxisSectionPositions[1, 1]  = textAxis1P1;
            textAxisSectionPositions[1, 2]  = textAxis1P2;
            textAxisSectionPositions[1, 3]  = textAxis1P3;
            textAxisSectionPositions[1, 4]  = textAxis1P4;
            textAxisSectionPositions[1, 5]  = textAxis1P5;
            textAxisSectionVecloities[1, 1] = textAxis1V1;
            textAxisSectionVecloities[1, 2] = textAxis1V2;
            textAxisSectionVecloities[1, 3] = textAxis1V3;
            textAxisSectionVecloities[1, 4] = textAxis1V4;
            textAxisSectionVecloities[1, 5] = textAxis1V5;
            textAxisSectionPositions[2, 1]  = textAxis2P1;
            textAxisSectionPositions[2, 2]  = textAxis2P2;
            textAxisSectionPositions[2, 3]  = textAxis2P3;
            textAxisSectionPositions[2, 4]  = textAxis2P4;
            textAxisSectionPositions[2, 5]  = textAxis2P5;
            textAxisSectionVecloities[2, 1] = textAxis2V1;
            textAxisSectionVecloities[2, 2] = textAxis2V2;
            textAxisSectionVecloities[2, 3] = textAxis2V3;
            textAxisSectionVecloities[2, 4] = textAxis2V4;
            textAxisSectionVecloities[2, 5] = textAxis2V5;

            timerWSCheck.Interval = 1000;
            timerWSCheck.Enabled  = true;
            timerLoop.Interval    = 50;
            timerLoop.Enabled     = true;
        }
Exemplo n.º 6
0
        public void InitializeBotnana(Botnana bot)
        {
            botnana = bot;

            onECAlias = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                UInt32 a = UInt32.Parse(str);
                if (a != 0 && a == alias)
                {
                    slaveNumber = slv;
                    BeginInvoke(new Deg(() => textBoxSlavePos.Text = slv.ToString()));
                }
            });
            botnana.SetTagNameCB(@"ec_alias", 0, IntPtr.Zero, onECAlias);

            onPDSState = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxPDSState.Text = str));
                }
            });
            botnana.SetTagNameCB(@"pds_state", 0, IntPtr.Zero, onPDSState);

            onSupportedMode = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber && !supportedOPModeUpdated)
                {
                    Int32 supportedMode;
                    try { supportedMode = Convert.ToInt32(str, 16); } catch (Exception exc) { Console.WriteLine(exc); return; }
                    List <string> modes = new List <string>();
                    if ((supportedMode & 0x1) != 0)
                    {
                        modes.Add("PP");
                    }
                    if ((supportedMode & 0x4) != 0)
                    {
                        modes.Add("PV");
                    }
                    if ((supportedMode & 0x8) != 0)
                    {
                        modes.Add("PT");
                    }
                    if ((supportedMode & 0x20) != 0)
                    {
                        modes.Add("HM");
                    }
                    if ((supportedMode & 0x80) != 0)
                    {
                        modes.Add("CSP");
                    }
                    if ((supportedMode & 0x100) != 0)
                    {
                        modes.Add("CSV");
                    }
                    if ((supportedMode & 0x200) != 0)
                    {
                        modes.Add("CST");
                    }
                    BeginInvoke(new Deg(() => comboBoxOPMode.Items.AddRange(modes.Cast <object>().ToArray())));
                    supportedOPModeUpdated = true;
                }
            });
            botnana.SetTagNameCB(@"supported_drive_mode", 0, IntPtr.Zero, onSupportedMode);

            onRealPosition = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxRealPos.Text = str));
                    realPos = Int32.Parse(str);
                }
            });
            botnana.SetTagNameCB(@"real_position", 0, IntPtr.Zero, onRealPosition);

            onRealTorque = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxRealTorque.Text = str));
                }
            });
            botnana.SetTagNameCB(@"real_torque", 0, IntPtr.Zero, onRealTorque);

            onDigitalInput = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxDigitalInput.Text = str));
                }
            });
            botnana.SetTagNameCB(@"digital_inputs", 0, IntPtr.Zero, onDigitalInput);

            onControlWord = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxControlWord.Text = str));
                }
            });
            botnana.SetTagNameCB(@"control_word", 0, IntPtr.Zero, onControlWord);

            onStatusWord = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxStatusWord.Text = str));
                }
            });
            botnana.SetTagNameCB(@"status_word", 0, IntPtr.Zero, onStatusWord);

            onOperationMode = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    string mode;
                    switch (UInt32.Parse(str))
                    {
                    case 1:
                        mode = @"PP";
                        break;

                    case 3:
                        mode = @"PV";
                        break;

                    case 4:
                        mode = @"PT";
                        break;

                    case 6:
                        mode = @"HM";
                        break;

                    case 8:
                        mode = @"CSP";
                        break;

                    case 9:
                        mode = @"CSV";
                        break;

                    case 10:
                        mode = @"CST";
                        break;

                    default:
                        return;
                    }
                    BeginInvoke(new Deg(() =>
                    {
                        // 不知為何 comboBoxOPMode 顯示的文字會有閃爍的問題,這裡設定兩次問題就消失了。
                        comboBoxOPMode.Text = mode;
                        comboBoxOPMode.Text = mode;
                    }));
                }
            });
            botnana.SetTagNameCB(@"operation_mode", 0, IntPtr.Zero, onOperationMode);

            onHomingMethod = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxHMMethod.Text = str));
                }
            });
            botnana.SetTagNameCB(@"homing_method", 0, IntPtr.Zero, onHomingMethod);

            onHomingSpeed1 = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxHMSpeed1.Text = str));
                }
            });
            botnana.SetTagNameCB(@"homing_speed_1", 0, IntPtr.Zero, onHomingSpeed1);

            onHomingSpeed2 = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxHMSpeed2.Text = str));
                }
            });
            botnana.SetTagNameCB(@"homing_speed_2", 0, IntPtr.Zero, onHomingSpeed2);

            onHomingAcceleration = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxHMAcceleration.Text = str));
                }
            });
            botnana.SetTagNameCB(@"homing_acceleration", 0, IntPtr.Zero, onHomingAcceleration);

            onTargetPosition = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxTargetPosition.Text = str));
                    targetPos = Int32.Parse(str);
                }
            });
            botnana.SetTagNameCB(@"target_position", 0, IntPtr.Zero, onTargetPosition);

            onTargetVelocity = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxTargetVelocity.Text = str));
                }
            });
            botnana.SetTagNameCB(@"target_velocity", 0, IntPtr.Zero, onTargetVelocity);

            onProfileVelocity = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxProfileVelocity.Text = str));
                }
            });
            botnana.SetTagNameCB(@"profile_velocity", 0, IntPtr.Zero, onProfileVelocity);

            onProfileAcceleration = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxProfileAcceleration.Text = str));
                }
            });
            botnana.SetTagNameCB(@"profile_acceleration", 0, IntPtr.Zero, onProfileAcceleration);

            onProfileDeceleration = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxProfileDeceleration.Text = str));
                }
            });
            botnana.SetTagNameCB(@"profile_deceleration", 0, IntPtr.Zero, onProfileDeceleration);

            onTargetTorque = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxTargetTorque.Text = str));
                }
            });
            botnana.SetTagNameCB(@"target_torque", 0, IntPtr.Zero, onTargetTorque);

            onTorqueSlope = new HandleTagNameMessage((IntPtr _, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == slaveNumber && ch == channelNumber)
                {
                    BeginInvoke(new Deg(() => textBoxTorqueSlope.Text = str));
                }
            });
            botnana.SetTagNameCB(@"torque_slope", 0, IntPtr.Zero, onTorqueSlope);

            timer1.Interval = 100;
        }
Exemplo n.º 7
0
        private void Form1_Load(object sender, EventArgs e)
        {
            bot = new Botnana("192.168.7.2");

            // WS 連線錯誤就呼叫 OnWSErrorCallback
            onWSError = new HandleMessage(OnWSErrorCallback);
            bot.SetOnErrorCB(IntPtr.Zero, onWSError);

            // WS 連線成功就呼叫 OnWSOpenCallback
            onWSOpen = new HandleMessage(OnWSOpenCallback);
            bot.SetOnOpenCB(IntPtr.Zero, onWSOpen);

            onUserParameter = new HandleMessage(OnUserParameterCallback);
            bot.SetTagCB(@"user_parameter", 0, IntPtr.Zero, onUserParameter);

            onCoordinatorEnabled = new HandleMessage(OnCoordinatorEnabled);
            bot.SetTagCB(@"coordinator_enabled", 0, IntPtr.Zero, onCoordinatorEnabled);

            // 收到 tag = error 就呼叫 OnErrorMessageCallback
            onErrorMessage = new HandleMessage(OnErrorMessageCallback);
            bot.SetTagCB(@"error", 0, IntPtr.Zero, onErrorMessage);

            // 收到 tag = error 就呼叫 OnErrorMessageCallback
            onGroupNextV = new HandleMessage(OnGroupNextV);
            bot.SetTagCB(@"group_next_v", 0, IntPtr.Zero, onGroupNextV);

            onSlaves = new HandleMessage(OnSlaves);
            bot.SetTagCB(@"slaves_responding", 0, IntPtr.Zero, onSlaves);

            onEcReady = new HandleMessage(OnEcReady);
            bot.SetTagCB(@"ec_ready", 0, IntPtr.Zero, onEcReady);

            onDeviceType = new HandleTagNameMessage(OnDeviceType);
            bot.SetTagNameCB(@"device_type", 0, IntPtr.Zero, onDeviceType);

            onDriveStatus = new HandleTagNameMessage(OnDriveStatus);
            bot.SetTagNameCB(@"status_word", 0, IntPtr.Zero, onDriveStatus);

            onAxesCmd = new HandleTagNameMessage(OnAxesCmd);
            bot.SetTagNameCB(@"axis_command_position", 0, IntPtr.Zero, onAxesCmd);

            onAxesFeedback = new HandleTagNameMessage(OnAxesFeedback);
            bot.SetTagNameCB(@"feedback_position", 0, IntPtr.Zero, onAxesFeedback);

            onAxesFollowingErr = new HandleTagNameMessage(OnAxesFollowingErr);
            bot.SetTagNameCB(@"following_error", 0, IntPtr.Zero, onAxesFollowingErr);

            onMPGEncoder = new HandleMessage(OnMPGEncoder);
            bot.SetTagCB("real_position.1.6", 0, IntPtr.Zero, onMPGEncoder);

            onMPGDis = new HandleMessage(OnMPGDisCB);
            bot.SetTagCB("din_wd.1.7", 0, IntPtr.Zero, onMPGDis);


            chartPath.ChartAreas[0].AxisX.Minimum               = -10.0;
            chartPath.ChartAreas[0].AxisX.Maximum               = 160.0;
            chartVelocity.ChartAreas[0].AxisX.Minimum           = 0;
            chartVelocity.ChartAreas[0].AxisX.Maximum           = 2000;
            chartVelocity.ChartAreas[0].AxisY.Minimum           = -500;
            chartVelocity.ChartAreas[0].AxisY.Maximum           = 2000;
            chartVelocity.Series[0].BorderWidth                 = 3;
            chartVelocity.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
            chartVelocity.ChartAreas[0].AxisX.MinorGrid.Enabled = false;
            chartVelocity.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
            chartVelocity.ChartAreas[0].AxisY.MinorGrid.Enabled = false;

            pathThread              = new Thread(new ThreadStart(this.getPathInformation));
            velocityThread          = new Thread(new ThreadStart(this.getVelocityInformation));
            pauseEvent              = new ManualResetEvent(true);
            pathThread.IsBackground = true;
            pathThread.Start();
            velocityThread.IsBackground = true;
            velocityThread.Start();
            InitPathChart();
            InitVelocityChart();
        }
Exemplo n.º 8
0
        public void InitializeBotnana(Botnana bot)
        {
            botnana = bot;

            onAxisName = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxAxisName.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"config_axis_name", 0, IntPtr.Zero, onAxisName);

            onAxisHomeOffset = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxHomeOffset.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"axis_home_offset", 0, IntPtr.Zero, onAxisHomeOffset);

            onEncoderLengthUnit = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                comboBoxEncoderUnit.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"encoder_length_unit", 0, IntPtr.Zero, onEncoderLengthUnit);

            onEncoderPPU = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxEncoderPPU.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"encoder_ppu", 0, IntPtr.Zero, onEncoderPPU);

            onEncoderDirection = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxEncoderDirection.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"encoder_direction", 0, IntPtr.Zero, onEncoderDirection);

            onCloseLoopFilter = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxCloseLoopFilter.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"closed_loop_filter", 0, IntPtr.Zero, onCloseLoopFilter);

            onMaxPositionDeviation = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxMaxPosDeviation.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"max_position_deviation", 0, IntPtr.Zero, onMaxPositionDeviation);

            onDriveAlias = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxDriveAlias.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"drive_alias", 0, IntPtr.Zero, onDriveAlias);

            onDriveSlavePosition = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxDriveSlavePos.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"drive_slave_position", 0, IntPtr.Zero, onDriveSlavePosition);

            onDriveChannel = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxDriveChannel.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"drive_channel", 0, IntPtr.Zero, onDriveChannel);

            onExtEncoderPPU = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxExtEncoderPPU.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"ext_encoder_ppu", 0, IntPtr.Zero, onExtEncoderPPU);

            onExtEncoderDirection = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxExtEncoderDirection.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"ext_encoder_direction", 0, IntPtr.Zero, onExtEncoderDirection);

            onExtEncoderAlias = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxExtEncoderAlias.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"ext_encoder_alias", 0, IntPtr.Zero, onExtEncoderAlias);

            onExtEncoderSlavePosition = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxExtEncoderSlavePos.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"ext_encoder_slave_position", 0, IntPtr.Zero, onExtEncoderSlavePosition);

            onExtEncoderChannel = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxExtEncoderChannel.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"ext_encoder_channel", 0, IntPtr.Zero, onExtEncoderChannel);

            onAxisAmax = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxAmax.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"axis_amax", 0, IntPtr.Zero, onAxisAmax);

            onAxisVmax = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxVmax.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"axis_vmax", 0, IntPtr.Zero, onAxisVmax);

            onAxisIgnorableDistance = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxIgnorableDistance.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"axis_ignorable_distance", 0, IntPtr.Zero, onAxisIgnorableDistance);

            onAxisVff = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxVff.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"axis_vff", 0, IntPtr.Zero, onAxisVff);

            onAxisVfactor = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxVfactor.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"axis_vfactor", 0, IntPtr.Zero, onAxisVfactor);

            onAxisAff = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxAff.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"axis_aff", 0, IntPtr.Zero, onAxisAff);

            onAxisAfactor = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxAfactor.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"axis_afactor", 0, IntPtr.Zero, onAxisAfactor);

            onAxisDenamdPos = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                double ppu;
                double pos;
                if (!double.TryParse(textBoxEncoderPPU.Text, out ppu))
                {
                    ppu = 0.0;
                }
                if (!double.TryParse(str, out pos))
                {
                    pos = 0.0;
                }
                BeginInvoke(new Deg(() =>
                {
                    if (ax == axisNumber)
                    {
                        textBoxDemandPos.Text   = str;
                        textBoxOutputPulse.Text = (pos * ppu).ToString();
                    }
                }));
            });
            botnana.SetTagNameCB(@"axis_demand_position", 0, IntPtr.Zero, onAxisDenamdPos);

            onAxisEncoderPos = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxEncoderPos.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"encoder_position", 0, IntPtr.Zero, onAxisEncoderPos);

            onAxisFeedbackPos = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxFeedbackPos.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"feedback_position", 0, IntPtr.Zero, onAxisFeedbackPos);

            onAxisFollowingError = new HandleTagNameMessage((IntPtr _, UInt32 ax, UInt32 __, string str) =>
            {
                BeginInvoke(new Deg(() => { if (ax == axisNumber)
                                            {
                                                textBoxFollowingError.Text = str;
                                            }
                                    }));
            });
            botnana.SetTagNameCB(@"following_error", 0, IntPtr.Zero, onAxisFollowingError);

            timer1.Interval = 100;
        }
Exemplo n.º 9
0
        public FormTorque()
        {
            InitializeComponent();
            TopLevel        = false;
            Visible         = true;
            FormBorderStyle = FormBorderStyle.None;

            Process thisProc = Process.GetCurrentProcess();

            thisProc.PriorityClass = ProcessPriorityClass.RealTime;

            // On rt_real_torque tag callback.
            onRTRealTorque = new HandleMessage(OnRTRealTorqueCallback);
            FormApp.bot.SetTagCB(@"rt_real_torque", 0, IntPtr.Zero, onRTRealTorque);

            // On devices info tag callback.
            onTorqueInfo = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                string[] values    = str.Split('.');
                torqueDriveSlave   = int.Parse(values[0]);
                torqueDriveChannel = int.Parse(values[1]);
                torqueAxisNumber   = int.Parse(values[2]);
                torqueGroupNumber  = int.Parse(values[3]);

                string cmd = null;
                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 ";
                }
                FormApp.BotEvaluateScript(cmd);
            });
            FormApp.bot.SetTagCB(@"torque_slv_ch_ax_grp", 0, IntPtr.Zero, onTorqueInfo);

            // On torque_ready tag callback.
            onTorqueReady = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                if (str == "-1")
                {
                    BeginInvoke(new Torquedeg(() =>
                    {
                        buttonTorqueReady.Text      = "Torque ready";
                        buttonTorqueReady.BackColor = Color.FromArgb(0x53, 0xFF, 0x53);
                    }));
                }
                else
                {
                    BeginInvoke(new Torquedeg(() =>
                    {
                        buttonTorqueReady.Text      = "Torque not ready";
                        buttonTorqueReady.BackColor = Color.FromArgb(0xFF, 0x2D, 0x2D);
                    }));
                }
            });
            FormApp.bot.SetTagCB(@"torque_ready", 0, IntPtr.Zero, onTorqueReady);

            // On real_position tag name callback.
            onRealPosition = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    BeginInvoke(new Torquedeg(() => { textRealPosition.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"real_position", 0, IntPtr.Zero, onRealPosition);

            // On real_torque tag name callback.
            onRealTorque = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    BeginInvoke(new Torquedeg(() => { textRealTorque.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"real_torque", 0, IntPtr.Zero, onRealTorque);

            // On digital_inputs tag name callback.
            onDigitalInputs = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    string din = string.Format("0x{0:X8}", Convert.ToInt32(str, 16));
                    BeginInvoke(new Torquedeg(() => { textDigitalInputs.Text = din; }));
                }
            });
            FormApp.bot.SetTagNameCB("digital_inputs", 0, IntPtr.Zero, onDigitalInputs);

            // On target_position tag name callback.
            onTargetPosition = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    BeginInvoke(new Torquedeg(() => { textTargetPosition.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"target_position", 0, IntPtr.Zero, onTargetPosition);

            // On pds_state tag name callback.
            onPDSState = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    switch (str)
                    {
                    case "Operation Enabled":
                        BeginInvoke(new Torquedeg(() =>
                        {
                            textPDSState.Text          = str;
                            buttonDriveOn.BackColor    = Color.FromArgb(0x53, 0xFF, 0x53);
                            buttonDriveOff.BackColor   = SystemColors.Control;
                            buttonResetFault.BackColor = SystemColors.Control;
                        }));
                        break;

                    case "Fault":
                        BeginInvoke(new Torquedeg(() =>
                        {
                            textPDSState.Text          = str;
                            buttonDriveOn.BackColor    = SystemColors.Control;
                            buttonDriveOff.BackColor   = Color.FromArgb(0xFF, 0x2D, 0x2D);
                            buttonResetFault.BackColor = Color.FromArgb(0xFF, 0x2D, 0x2D);
                        }));
                        break;

                    default:
                        BeginInvoke(new Torquedeg(() =>
                        {
                            textPDSState.Text          = str;
                            buttonDriveOn.BackColor    = SystemColors.Control;
                            buttonDriveOff.BackColor   = Color.FromArgb(0xFF, 0x2D, 0x2D);
                            buttonResetFault.BackColor = SystemColors.Control;
                        }));
                        buttonDriveOn.BackColor    = SystemColors.Control;
                        buttonDriveOff.BackColor   = Color.FromArgb(0xFF, 0x2D, 0x2D);
                        buttonResetFault.BackColor = SystemColors.Control;
                        break;
                    }
                }
            });
            FormApp.bot.SetTagNameCB(@"pds_state", 0, IntPtr.Zero, onPDSState);

            //On status_word tag name callback.
            onDriveStatus = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    BeginInvoke(new Torquedeg(() => { textDriveStatus.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"status_word", 0, IntPtr.Zero, onDriveStatus);

            // On operation_mode tag name callback.
            onOperationMode = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    switch (str)
                    {
                    case "1":
                        BeginInvoke(new Torquedeg(() => { textOperationMode.Text = "PP"; }));
                        break;

                    case "6":
                        BeginInvoke(new Torquedeg(() => { textOperationMode.Text = "HM"; }));
                        break;

                    case "8":
                        BeginInvoke(new Torquedeg(() => { textOperationMode.Text = "CSP"; }));
                        break;

                    default:
                        break;
                    }
                }
            });
            FormApp.bot.SetTagNameCB(@"operation_mode", 0, IntPtr.Zero, onOperationMode);

            // On homing_method tag name callback.
            onHomingMethod = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    BeginInvoke(new Torquedeg(() => { textHomingMethod.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"homing_method", 0, IntPtr.Zero, onHomingMethod);

            // On homing_speed_1 tag name callback.
            onHomingSpeed1 = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    BeginInvoke(new Torquedeg(() => { textHomingSpeed1.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"homing_speed_1", 0, IntPtr.Zero, onHomingSpeed1);

            // On homing_speed_2 tag name callback.
            onHomingSpeed2 = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    BeginInvoke(new Torquedeg(() => { textHomingSpeed2.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"homing_speed_2", 0, IntPtr.Zero, onHomingSpeed2);

            // On homing_acceleration tag name callback.
            onHomingAcc = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == torqueDriveSlave && ch == torqueDriveChannel)
                {
                    BeginInvoke(new Torquedeg(() => { textHomingAcc.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"homing_acceleration", 0, IntPtr.Zero, onHomingAcc);

            // On axis_demand_position tag name callback.
            onAxisPosition = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    axisPosition   = double.Parse(str) * 1000.0;
                    string axisPos = axisPosition.ToString("F3");
                    BeginInvoke(new Torquedeg(() => { textAxisPosition.Text = axisPos; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"axis_demand_position", 0, IntPtr.Zero, onAxisPosition);

            // On feedback_position tag name callback.
            onFeedbackPosition = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    feedbackPosition   = double.Parse(str) * 1000.0;
                    string feedbackPos = feedbackPosition.ToString("F3");
                    BeginInvoke(new Torquedeg(() => { textFeedbackPosition.Text = feedbackPos; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"feedback_position", 0, IntPtr.Zero, onFeedbackPosition);

            // On encoder_length_unit tag name callback.
            onEncoderLengthUnit = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    BeginInvoke(new Torquedeg(() => { labelEncoderResolution.Text = "pulse/" + str.Substring(0, 1).ToLower(); }));
                }
            });
            FormApp.bot.SetTagNameCB(@"encoder_length_unit", 0, IntPtr.Zero, onEncoderLengthUnit);

            // On encoder_ppu tag name callback.
            onEncoderPPU = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textEncoderPPU.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"encoder_ppu", 0, IntPtr.Zero, onEncoderPPU);

            // On drive_alias tag name callback.
            onDriveAlias = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textDriveAlias.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"drive_alias", 0, IntPtr.Zero, onDriveAlias);

            // On drive_slave_position tag name callback.
            onDriveSlavePosition = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textDriveSlavePosition.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"drive_slave_position", 0, IntPtr.Zero, onDriveSlavePosition);

            // On drive_channel tag name callback.
            onDriveChannel = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textDriveChannel.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"drive_channel", 0, IntPtr.Zero, onDriveChannel);

            // On axis_vmax tag name callback.
            onAxisVmax = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    string vmax = (double.Parse(str) * 1000.0 * 60.0).ToString("F1");
                    BeginInvoke(new Torquedeg(() => { textAxisVmax.Text = vmax; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"axis_vmax", 0, IntPtr.Zero, onAxisVmax);

            // On axis_amax tag name callback.
            onAxisAmax = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueAxisNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textAxisAmax.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"axis_amax", 0, IntPtr.Zero, onAxisAmax);

            // On group_type tag name callback.
            onGroupType = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueGroupNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textGroupType.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"group_type", 0, IntPtr.Zero, onGroupType);

            // On group_mapping tag name callback.
            onGroupMapping = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueGroupNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textGroupMapping.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"group_mapping", 0, IntPtr.Zero, onGroupMapping);

            // On group_vmax tag name callback.
            onGroupVmax = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueGroupNumber)
                {
                    string vmax = (double.Parse(str) * 1000.0 * 60.0).ToString("F1");
                    BeginInvoke(new Torquedeg(() => { textGroupVmax.Text = vmax; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"group_vmax", 0, IntPtr.Zero, onGroupVmax);

            // On group_amax tag name callback.
            onGroupAmax = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueGroupNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textGroupAmax.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"group_amax", 0, IntPtr.Zero, onGroupAmax);

            // On group_jmax tag name callback.
            onGroupJmax = new HandleTagNameMessage((IntPtr dataPtr, UInt32 n, UInt32 _, string str) =>
            {
                if (n == torqueGroupNumber)
                {
                    BeginInvoke(new Torquedeg(() => { textGroupJmax.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"group_jmax", 0, IntPtr.Zero, onGroupJmax);

            // On travel_time tag callback.
            onTravelTime = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                new Thread(() => System.Windows.Forms.MessageBox.Show("TravelTime|" + str)).Start();
            });
            FormApp.bot.SetTagCB(@"travel_time", 0, IntPtr.Zero, onTravelTime);
        }
Exemplo n.º 10
0
        private void Form1_Load(object sender, EventArgs e)
        {
            bot = new Botnana("192.168.7.2");

            // WS 連線錯誤就呼叫 OnWSErrorCallback
            onWSError = new HandleMessage(OnWSErrorCallback);
            bot.SetOnErrorCB(IntPtr.Zero, onWSError);

            // WS 連線成功就呼叫 OnWSOpenCallback
            onWSOpen = new HandleMessage(OnWSOpenCallback);
            bot.SetOnOpenCB(IntPtr.Zero, onWSOpen);

            onUserParameter = new HandleMessage(OnUserParameterCallback);
            bot.SetTagCB(@"user_parameter", 0, IntPtr.Zero, onUserParameter);

            // 收到 tag = error 就呼叫 OnErrorMessageCallback
            onErrorMessage = new HandleMessage(OnErrorMessageCallback);
            bot.SetTagCB(@"error", 0, IntPtr.Zero, onErrorMessage);

            onSlaves = new HandleMessage(OnSlaves);
            bot.SetTagCB(@"slaves_responding", 0, IntPtr.Zero, onSlaves);

            onEcReady = new HandleMessage(OnEcReady);
            bot.SetTagCB(@"ec_ready", 0, IntPtr.Zero, onEcReady);

            onSystemReady = new HandleMessage(OnSystemReady);
            bot.SetTagCB(@"system_ready", 0, IntPtr.Zero, onSystemReady);

            onFeederReady = new HandleMessage(OnFeederReady);
            bot.SetTagCB(@"feeder_ready", 0, IntPtr.Zero, onFeederReady);

            onEncoderPosition = new HandleTagNameMessage(OnEncoderPosition);
            bot.SetTagNameCB(@"real_position", 0, IntPtr.Zero, onEncoderPosition);

            onTargetPosition = new HandleTagNameMessage(OnTargetPosition);
            bot.SetTagNameCB(@"target_position", 0, IntPtr.Zero, onTargetPosition);

            onDriveStatus = new HandleTagNameMessage(OnDriveStatus);
            bot.SetTagNameCB(@"status_word", 0, IntPtr.Zero, onDriveStatus);

            onOperationMode = new HandleTagNameMessage(OnOperationMode);
            bot.SetTagNameCB(@"operation_mode", 0, IntPtr.Zero, onOperationMode);

            onDriveDigitalInputs = new HandleTagNameMessage(OnDriveDigitalInputs);
            bot.SetTagNameCB(@"digital_inputs", 0, IntPtr.Zero, onDriveDigitalInputs);

            onTouchProbe = new HandleTagNameMessage(OnTouchProbe);
            bot.SetTagNameCB(@"touch_probe_function", 0, IntPtr.Zero, onTouchProbe);

            onCylinder = new HandleTagNameMessage(OnCylinder);
            bot.SetTagNameCB(@"dout", 0, IntPtr.Zero, onCylinder);

            onTPLatchPosition1 = new HandleTagNameMessage(OnTPLatchPosition1);
            bot.SetTagNameCB(@"tp_position_value_1", 0, IntPtr.Zero, onTPLatchPosition1);

            onTPLatchPosition2 = new HandleTagNameMessage(OnTPLatchPosition2);
            bot.SetTagNameCB(@"tp_position_value_2", 0, IntPtr.Zero, onTPLatchPosition2);

            onCylinderOnMs = new HandleMessage(OnCylinderOnMs);
            bot.SetTagCB(@"cylinder_on_duration", 0, IntPtr.Zero, onCylinderOnMs);

            onCylinderOffMs = new HandleMessage(OnCylinderOffMs);
            bot.SetTagCB(@"cylinder_off_duration", 0, IntPtr.Zero, onCylinderOffMs);

            onRotationDistance = new HandleMessage(OnRotationDistance);
            bot.SetTagCB(@"feeder_rotation_distance", 0, IntPtr.Zero, onRotationDistance);

            onRotationSpeed = new HandleMessage(OnRotationSpeed);
            bot.SetTagCB(@"feeder_rotation_speed", 0, IntPtr.Zero, onRotationSpeed);

            onSettlingDuration = new HandleMessage(OnSettlingDuration);
            bot.SetTagCB(@"feeder_settling_duration", 0, IntPtr.Zero, onSettlingDuration);

            onRetryCountMax = new HandleMessage(OnRetryCountMax);
            bot.SetTagCB(@"feeder_retry_count_max", 0, IntPtr.Zero, onRetryCountMax);

            onDriveDeviceSlave = new HandleMessage(OnDriveDeviceSlave);
            bot.SetTagCB(@"drive_device_slave", 1, IntPtr.Zero, onDriveDeviceSlave);

            onDriveDeviceChannel = new HandleMessage(OnDriveDeviceChannel);
            bot.SetTagCB(@"drive_device_channel", 1, IntPtr.Zero, onDriveDeviceChannel);

            onCylinderDeviceSlave = new HandleMessage(OnCylinderDeviceSlave);
            bot.SetTagCB(@"cylinder_device_slave", 1, IntPtr.Zero, onCylinderDeviceSlave);

            onCylinderDeviceChannel = new HandleMessage(OnCylinderDeviceChannel);
            bot.SetTagCB(@"cylinder_device_channel", 1, IntPtr.Zero, onCylinderDeviceChannel);

            onFeederRunning = new HandleMessage(OnFeederRunning);
            bot.SetTagCB(@"feeder_running", 0, IntPtr.Zero, onFeederRunning);

            onFeederEMS = new HandleMessage(OnFeederEMS);
            bot.SetTagCB(@"feeder_ems", 0, IntPtr.Zero, onFeederEMS);

            onFeederOperationMs = new HandleMessage(OnFeederOperationMs);
            bot.SetTagCB(@"feeder_operation_ms", 0, IntPtr.Zero, onFeederOperationMs);

            onTPStatus = new HandleTagNameMessage(OnTPStatus);
            bot.SetTagNameCB(@"sdo_0_24761", 0, IntPtr.Zero, onTPStatus);

            onTPDetected1 = new HandleMessage(OnTPDetected1);
            bot.SetTagCB(@"tp_detected_1", 0, IntPtr.Zero, onTPDetected1);

            onTPDetected2 = new HandleMessage(OnTPDetected2);
            bot.SetTagCB(@"tp_detected_2", 0, IntPtr.Zero, onTPDetected2);

            onTPDetectedPosition1 = new HandleMessage(OnTPDetectedPosition1);
            bot.SetTagCB(@"tp_detected_position_1", 0, IntPtr.Zero, onTPDetectedPosition1);

            onTPDetectedPosition2 = new HandleMessage(OnTPDetectedPosition2);
            bot.SetTagCB(@"tp_detected_position_2", 0, IntPtr.Zero, onTPDetectedPosition2);

            timerSlow.Enabled = true;
            timerPoll.Enabled = true;
            timer1s.Enabled   = true;
        }
Exemplo n.º 11
0
        public FormFeeder()
        {
            InitializeComponent();
            TopLevel        = false;
            Visible         = true;
            FormBorderStyle = FormBorderStyle.None;

            // On feeder_infos tag callback.
            onFeederInfo = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                string[] values       = str.Split('.');
                driveDeviceSlave      = int.Parse(values[0]);
                driveDeviceChannel    = int.Parse(values[1]);
                cylinderDeviceSlave   = int.Parse(values[2]);
                cylinderDeviceChannel = int.Parse(values[3]);

                string cmd = "";
                if (driveDeviceSlave != 0)
                {
                    cmd += driveDeviceSlave.ToString() + @" .slave ";
                }
                if (cylinderDeviceSlave != 0)
                {
                    cmd += cylinderDeviceSlave.ToString() + @" .slave ";
                }
                FormApp.BotEvaluateScript(cmd);
            });
            FormApp.bot.SetTagCB(@"feeder_infos", 0, IntPtr.Zero, onFeederInfo);

            // On feeder_ready tag callback.
            onFeederReady = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                feederReady = (int.Parse(str) != 0);
                if (feederReady)
                {
                    BeginInvoke(new Feederdeg(() =>
                    {
                        buttonFeederReady.Text      = "Feeder ready";
                        buttonFeederReady.BackColor = Color.FromArgb(0x53, 0xFF, 0x53);
                    }));
                }
                else
                {
                    BeginInvoke(new Feederdeg(() =>
                    {
                        buttonFeederReady.Text      = "Feeder not ready";
                        buttonFeederReady.BackColor = Color.FromArgb(0xFF, 0x2D, 0x2D);
                    }));
                }
            });
            FormApp.bot.SetTagCB(@"feeder_ready", 0, IntPtr.Zero, onFeederReady);

            // On real_position tag name callback.
            onEncoderPosition = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, String str) =>
            {
                if (slv == driveDeviceSlave && ch == driveDeviceChannel)
                {
                    BeginInvoke(new Feederdeg(() => { textEncoderPosition.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"real_position", 0, IntPtr.Zero, onEncoderPosition);

            // On target_position tag name callback.
            onTargetPosition = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == driveDeviceSlave && ch == driveDeviceChannel)
                {
                    BeginInvoke(new Feederdeg(() => { textTargetPosition.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"target_position", 0, IntPtr.Zero, onTargetPosition);

            // On pds_state tag name callback.
            onPDSState = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == driveDeviceSlave && ch == driveDeviceChannel)
                {
                    BeginInvoke(new Feederdeg(() => { textPDSState.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"pds_state", 0, IntPtr.Zero, onPDSState);

            // On operation_mode tag name callback.
            onOperationMode = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == driveDeviceSlave && ch == driveDeviceChannel)
                {
                    BeginInvoke(new Feederdeg(() => { textOperationMode.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"operation_mode", 0, IntPtr.Zero, onOperationMode);

            // On digital_inputs tag name callback.
            onDriveDigitalInputs = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == driveDeviceSlave && ch == driveDeviceChannel)
                {
                    int code       = Convert.ToInt32(str, 16);
                    bool driveExt1 = (code & 0x10000) != 0;
                    bool driveExt2 = (code & 0x20000) != 0;
                    bool driveDin0 = (code & 0x1000000) != 0;
                    bool driveDin1 = (code & 0x2000000) != 0;
                    bool driveDin2 = (code & 0x4000000) != 0;
                    bool driveDin3 = (code & 0x8000000) != 0;
                    BeginInvoke(new Feederdeg(() =>
                    {
                        radioDriveDin0.Checked = driveDin0;
                        radioDriveDin1.Checked = driveDin1;
                        radioDriveDin2.Checked = driveDin2;
                        radioDriveDin3.Checked = driveDin3;
                        radioDriveExt1.Checked = driveExt1;
                        radioDriveExt2.Checked = driveExt2;
                    }));
                }
            });
            FormApp.bot.SetTagNameCB(@"digital_inputs", 0, IntPtr.Zero, onDriveDigitalInputs);

            // On dout tag name callback.
            onCylinder = new HandleTagNameMessage((IntPtr dataPtr, UInt32 pos, UInt32 ch, string str) =>
            {
                if (pos == cylinderDeviceSlave && ch == cylinderDeviceChannel)
                {
                    BeginInvoke(new Feederdeg(() => { radioCylinder.Checked = int.Parse(str) != 0; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"dout", 0, IntPtr.Zero, onCylinder);

            // On touch_probe_function tag name callback.
            onTouchProbe = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == driveDeviceSlave && ch == driveDeviceChannel)
                {
                    int tmp                  = int.Parse(str);
                    bool enableTP1           = (tmp & 1) != 0;
                    bool enableTP2           = (tmp & 0x100) != 0;
                    bool tp1TriggerAction    = (tmp & 0x2) != 0;
                    bool tp2TriggerAction    = (tmp & 0x200) != 0;
                    bool tp1TriggerSelection = (tmp & 0x4) != 0;
                    bool tp2TriggerSelection = (tmp & 0x400) != 0;
                    bool tp1UpEdgeAction     = (tmp & 0x10) != 0;
                    bool tp2UpEdgeAction     = (tmp & 0x1000) != 0;
                    bool tp1DownEdgeAction   = (tmp & 0x20) != 0;
                    bool tp2DownEdgeAction   = (tmp & 0x2000) != 0;
                    BeginInvoke(new Feederdeg(() =>
                    {
                        radioEnableTP1.Checked           = enableTP1;
                        radioEnableTP2.Checked           = enableTP2;
                        radioTP1TriggerAction.Checked    = tp1TriggerAction;
                        radioTP2TriggerAction.Checked    = tp2TriggerAction;
                        radioTP1TriggerSelection.Checked = tp1TriggerSelection;
                        radioTP2TriggerSelection.Checked = tp2TriggerSelection;
                        radioTP1UpEdgeAction.Checked     = tp1UpEdgeAction;
                        radioTP2UpEdgeAction.Checked     = tp2UpEdgeAction;
                        radioTP1DownEdgeAction.Checked   = tp1DownEdgeAction;
                        radioTP2DownEdgeAction.Checked   = tp2DownEdgeAction;
                    }));
                }
            });
            FormApp.bot.SetTagNameCB(@"touch_probe_function", 0, IntPtr.Zero, onTouchProbe);

            // On tp_position_value_1 tag name callback.
            onTPLatchPosition1 = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == driveDeviceSlave && ch == driveDeviceChannel)
                {
                    BeginInvoke(new Feederdeg(() => { textTPLatchPosition1.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"tp_position_value_1", 0, IntPtr.Zero, onTPLatchPosition1);

            // On tp_position_value_2 tag name callback.
            onTPLatchPosition2 = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == driveDeviceSlave && ch == driveDeviceChannel)
                {
                    BeginInvoke(new Feederdeg(() => { textTPLatchPosition2.Text = str; }));
                }
            });
            FormApp.bot.SetTagNameCB(@"tp_position_value_2", 0, IntPtr.Zero, onTPLatchPosition2);

            // On cylinder_on_duration tag name callback.
            onCylinderOnMs = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textCylinderOnMs.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"cylinder_on_duration", 0, IntPtr.Zero, onCylinderOnMs);

            // On cylinder_off_duration tag name callback.
            onCylinderOffMs = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textCylinderOffMs.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"cylinder_off_duration", 0, IntPtr.Zero, onCylinderOffMs);

            // On feeder_running tag name callback.
            onFeederRunning = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { radioFeederRunning.Checked = int.Parse(str) != 0; }));
            });
            FormApp.bot.SetTagCB(@"feeder_running", 0, IntPtr.Zero, onFeederRunning);

            // On feeder_ems tag name callback.
            onFeederEMS = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { radioFeederEMS.Checked = int.Parse(str) != 0; }));
            });
            FormApp.bot.SetTagCB(@"feeder_ems", 0, IntPtr.Zero, onFeederEMS);

            // On feeder_operation_ms tag name callback.
            onFeederOperationMs = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textFeederOperationTime.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"feeder_operation_ms", 0, IntPtr.Zero, onFeederOperationMs);

            // On feeder_rotation_distance tag name callback.
            onRotationDistance = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textRotationDistance.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"feeder_rotation_distance", 0, IntPtr.Zero, onRotationDistance);

            // On feeder_rotation_speed tag name callback.
            onRotationSpeed = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textRotationSpeed.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"feeder_rotation_speed", 0, IntPtr.Zero, onRotationSpeed);

            // On feeder_settling_duration tag name callback.
            onSettlingDuration = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textBoxSettlingDurationMs.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"feeder_settling_duration", 0, IntPtr.Zero, onSettlingDuration);

            // On feeder_retry_count_max tag name callback.
            onRetryCountMax = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textBoxRetryCountMax.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"feeder_retry_count_max", 0, IntPtr.Zero, onRetryCountMax);

            // On sdo_0_24761 tag name callback.
            onTPStatus = new HandleTagNameMessage((IntPtr dataPtr, UInt32 slv, UInt32 ch, string str) =>
            {
                if (slv == driveDeviceSlave)
                {
                    int code;
                    if (Int32.TryParse(str, out code))
                    {
                        bool tp1Enabled = (code & 0x1) != 0;
                        bool tp2Enabled = (code & 0x100) != 0;
                        BeginInvoke(new Feederdeg(() =>
                        {
                            radioTP1Enabled.Checked = tp1Enabled;
                            radioTP2Enabled.Checked = tp2Enabled;
                        }));
                    }
                }
            });
            FormApp.bot.SetTagNameCB(@"sdo_0_24761", 0, IntPtr.Zero, onTPStatus);

            // On tp_detected_1 tag name callback.
            onTPDetected1 = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { radioTPDetected1.Checked = int.Parse(str) != 0; }));
            });
            FormApp.bot.SetTagCB(@"tp_detected_1", 0, IntPtr.Zero, onTPDetected1);

            // On tp_detected_2 tag name callback.
            onTPDetected2 = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { radioTPDetected2.Checked = int.Parse(str) != 0; }));
            });
            FormApp.bot.SetTagCB(@"tp_detected_2", 0, IntPtr.Zero, onTPDetected2);

            // On tp_detected_position_1 tag name callback.
            onTPDetectedPosition1 = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textTPDetectedPosition1.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"tp_detected_position_1", 0, IntPtr.Zero, onTPDetectedPosition1);

            // On tp_detected_position_2 tag name callback.
            onTPDetectedPosition2 = new HandleMessage((IntPtr dataPtr, string str) =>
            {
                BeginInvoke(new Feederdeg(() => { textTPDetectedPosition2.Text = str; }));
            });
            FormApp.bot.SetTagCB(@"tp_detected_position_2", 0, IntPtr.Zero, onTPDetectedPosition2);
        }