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); }
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(); }
private static extern void botnana_set_tagname_cb_dll(IntPtr desc, string tagName, int count, IntPtr dataPtr, HandleTagNameMessage hm);
// 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); }
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; }
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; }
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(); }
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; }
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); }
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; }
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); }