private async Task <bool> StsImpl(VsmdAxis axis) { await VsmdController.GetVsmdController().Sts(axis); string newPos = VsmdController.GetVsmdController().GetAxis(axis).curPos.ToString(); switch (axis) { case VsmdAxis.X: txtPosX.Text = newPos; break; case VsmdAxis.Y: txtPosY.Text = newPos; break; case VsmdAxis.Z: txtPosZ.Text = newPos; break; default: break; } return(true); }
private void InitAxises() { if (!VsmdController.GetVsmdController().IsInitialized()) { StatusBar.DisplayMessage(MessageType.Error, "设备未连接!"); DisableAllControls(); return; } VsmdInfoSync ax = VsmdController.GetVsmdController().GetAxis(VsmdAxis.X); txtCidX.Text = ax.Cid.ToString(); txtPosX.Text = ax.curPos.ToString(); txtSpeedX.Text = ax.GetAttributeValue(VsmdAttribute.Spd).ToString(); txtZsdX.Text = ax.GetAttributeValue(VsmdAttribute.Zsd).ToString(); VsmdInfoSync ay = VsmdController.GetVsmdController().GetAxis(VsmdAxis.Y); txtCidY.Text = ay.Cid.ToString(); txtPosY.Text = ay.curPos.ToString(); txtSpeedY.Text = ay.GetAttributeValue(VsmdAttribute.Spd).ToString(); txtZsdY.Text = ay.GetAttributeValue(VsmdAttribute.Zsd).ToString(); VsmdInfoSync az = VsmdController.GetVsmdController().GetAxis(VsmdAxis.Z); txtCidZ.Text = az.Cid.ToString(); txtPosZ.Text = az.curPos.ToString(); txtSpeedZ.Text = az.GetAttributeValue(VsmdAttribute.Spd).ToString(); txtZsdZ.Text = az.GetAttributeValue(VsmdAttribute.Zsd).ToString(); }
private void btnOK_Click(object sender, EventArgs e) { GeneralSettingMeta meta = GeneralSettings.GetInstance().GetSettingMeta(); //meta.DispenseInterval = (int)numDripInter.Value; meta.MoveSpeed = float.Parse(txtMoveSpd.Text.Trim()); meta.AutoConnect = ckbAutoConnect.Checked; meta.OutputCommandLog = ckbEnableCmdLog.Checked; meta.OutputStsCommandLog = ckbEnableStsCmdLog.Checked; meta.PipettingSpeed = int.Parse(txtPipettingSpeed.Text); bool retVal = GeneralSettings.GetInstance().Save(); if (retVal) { StatusBar.DisplayMessage(MessageType.Info, "设置成功!"); if (VsmdController.GetVsmdController().IsInitialized()) { VsmdController.GetVsmdController().SetOutputCommandLogFlag(meta.OutputCommandLog); } this.Close(); } else { StatusBar.DisplayMessage(MessageType.Error, "设置失败!"); } }
private async void GoHome() { VsmdInfoSync ax = VsmdController.GetVsmdController().GetAxis(VsmdAxis.X); var speedX = ax.GetAttributeValue(VsmdAttribute.Spd); var zsdX = ax.GetAttributeValue(VsmdAttribute.Zsd); VsmdInfoSync ay = VsmdController.GetVsmdController().GetAxis(VsmdAxis.Y); var speedY = ay.GetAttributeValue(VsmdAttribute.Spd); var zsdY = ay.GetAttributeValue(VsmdAttribute.Zsd); VsmdInfoSync az = VsmdController.GetVsmdController().GetAxis(VsmdAxis.Z); var speedZ = az.GetAttributeValue(VsmdAttribute.Spd); var zsdZ = az.GetAttributeValue(VsmdAttribute.Zsd); await VsmdController.GetVsmdController().SetZsd(VsmdAxis.Z, zsdZ); await VsmdController.GetVsmdController().ZeroStart(VsmdAxis.Z); await VsmdController.GetVsmdController().SetZsd(VsmdAxis.X, zsdX); VsmdController.GetVsmdController().ZeroStart(VsmdAxis.X); await VsmdController.GetVsmdController().SetZsd(VsmdAxis.Y, zsdY); await VsmdController.GetVsmdController().ZeroStart(VsmdAxis.Y); //set positive limit register ax.cfgPsr(3); ay.cfgPsr(3); az.cfgPsr(3); }
private void ConnectVsmd_FormClosing(object sender, FormClosingEventArgs e) { if (VsmdController.GetVsmdController().IsInitialized()) { SavePref(); } }
public async void DripTube(string args) { JObject targetTube = (JObject)JsonConvert.DeserializeObject(args); int type = int.Parse(targetTube["type"].ToString()); int blockNum, row, col = 1; if (type == (int)BoardType.Site) { blockNum = int.Parse(targetTube["site"].ToString()); col = int.Parse(targetTube["col"].ToString()); } else { blockNum = int.Parse(targetTube["grid"].ToString()); } row = int.Parse(targetTube["row"].ToString()); SetDrippingTube(blockNum, row, col); VsmdController vsmdController = VsmdController.GetVsmdController(); PumpController pumpController = PumpController.GetPumpController(); BoardSetting curBoardSetting = BoardSetting.GetInstance(); await vsmdController.MoveTo(VsmdAxis.Z, curBoardSetting.CurrentBoard.ZDispense); await pumpController.Drip(); Thread.Sleep(GeneralSettings.GetInstance().DripInterval); await pumpController.Drip(); await vsmdController.MoveTo(VsmdAxis.Z, curBoardSetting.CurrentBoard.ZTravel); MoveCallBack(blockNum, row, col); }
private async void Move2Position(VsmdAxis axis, int val) { var spd = VsmdController.GetVsmdController().GetAxis(axis).GetAttributeValue(VsmdLib.VsmdAttribute.Spd); await VsmdController.GetVsmdController().SetSpeed(axis, spd); await VsmdController.GetVsmdController().MoveTo(axis, val); }
public static VsmdController GetVsmdController() { if (m_vsmdController == null) { m_vsmdController = new VsmdController(); } return(m_vsmdController); }
private async Task <bool> MoveAxis(float speed) { await VsmdController.GetVsmdController().SetSpeed(m_axisType, speed); VsmdController.GetVsmdController().GetAxis(m_axisType).SendCommand("mov"); m_inMoving = true; return(true); }
public async Task <bool> PumpDrip() { VsmdController vsmdController = VsmdController.GetVsmdController(); await vsmdController.SetS3Mode(VsmdAxis.Z, 1); await SwitchS3OnOff(); return(true); }
/// <summary> /// /// </summary> private async void DoPipetting() { //Logger.Instance.Write("DoPipetting"); log.Info("Do Pipetting"); VsmdController vsmdController = VsmdController.GetVsmdController(); PumpController pumpController = PumpController.GetPumpController(); BoardSetting curBoardSetting = BoardSetting.GetInstance(); await BeforeMove(m_selectedTubes.Count); int touchDelaySeconds = (int)(1000 * curBoardSetting.CurrentBoard.DelaySeconds); int delayMicroSecondsBetweenSamples = (int)(Preference.GetInstace().DelaySeconds * 1000); int blockNum, row, col = 1; //await vsmdController.SetS3Mode(VsmdAxis.Z, 1); for (int i = m_pipettingIndex + 1; i < m_sortedTubesArr.Length; i++) { if (m_dripStatus != PipettingStatus.Moving) { break; } JObject obj = (JObject)m_sortedTubesArr[i]; GetPositionInfo(obj, out blockNum, out row, out col); SetPipettingWell(blockNum, row, col); int xPos = curBoardSetting.Convert2PhysicalPos(VsmdAxis.X, blockNum, col); int offset = curBoardSetting.CurrentBoard.TouchEdgeOffset; await vsmdController.MoveTo(VsmdAxis.X, xPos); await vsmdController.MoveTo(VsmdAxis.Y, curBoardSetting.Convert2PhysicalPos(VsmdAxis.Y, blockNum, row)); // TODO await vsmdController.MoveTo(VsmdAxis.Z, curBoardSetting.CurrentBoard.ZDispense); // start pipetting await pumpController.SwitchOnOff(i); // wait several seconds, this time should be changed according to the volume dispensed Thread.Sleep(delayMicroSecondsBetweenSamples); await vsmdController.MoveTo(VsmdAxis.X, xPos + offset); Thread.Sleep(touchDelaySeconds); await vsmdController.MoveTo(VsmdAxis.Z, curBoardSetting.CurrentBoard.ZTravel); // change the UI to start Thread.Sleep(100); MoveCallBack(blockNum, row, col); m_pipettingIndex = i; } bool bok = await AfterMove(); log.InfoFormat("finished pipetting, result is: {0}", bok); //Logger.Instance.Write("error happened in afterMove"); }
public async Task <bool> SwitchS3OnOff() { VsmdController vsmdController = VsmdController.GetVsmdController(); Thread.Sleep(500); await vsmdController.S3On(VsmdAxis.Z); Thread.Sleep(500); await vsmdController.S3Off(VsmdAxis.Z); return(true); }
public void StopMove() { DripStatus preMode = m_dripStatus; m_dripStatus = DripStatus.Idle; m_selectedTubes.Clear(); VsmdController.GetVsmdController().Stop(); if (preMode == DripStatus.PauseMove) { AfterMove(); } }
private void SetTubePositionFrm_Load(object sender, EventArgs e) { m_preAxisSpeed = VsmdController.GetVsmdController().GetAxis(m_axisType).GetAttributeValue(VsmdLib.VsmdAttribute.Spd); if (m_axisType == VsmdAxis.X) { lblTip.Text = "请通过键盘上\"←\"和、\"→\"来操作。"; } else if (m_axisType == VsmdAxis.Y) { lblTip.Text = "请通过键盘上\"↑\"和、\"↓\"来操作。"; } this.KeyPreview = true; }
private void MainFrm_FormClosing(object sender, FormClosingEventArgs e) { if (m_dripForm != null) { if (m_dripForm.PipettingStatus != PipettingStatus.Idle) { e.Cancel = true; StatusBar.DisplayMessage(MessageType.Warning, "正在运行,请勿关闭!"); return; } } VsmdController.GetVsmdController().Dispose(); }
private async void btnMoveFront_Click(object sender, EventArgs e) { bool bok = await VsmdController.GetVsmdController().MoveTo(VsmdAxis.Y, 100); if (bok) { StatusBar.DisplayMessage(VsmdWorkstation.Controls.MessageType.Info, "移动到最前端!"); } else { StatusBar.DisplayMessage(VsmdWorkstation.Controls.MessageType.Error, "未能移动到最前端!"); } }
/// <summary> /// /// </summary> private async void DripThread() { VsmdController vsmdController = VsmdController.GetVsmdController(); PumpController pumpController = PumpController.GetPumpController(); BoardSetting curBoardSetting = BoardSetting.GetInstance(); JArray jsArr = m_selectedTubes; await BeforeMove(); int dripInterval = GeneralSettings.GetInstance().DripInterval; int blockNum, row, col = 1; //await vsmdController.SetS3Mode(VsmdAxis.Z, 1); for (int i = m_dripIndex + 1; i < jsArr.Count; i++) { if (m_dripStatus != DripStatus.Moving) { break; } JObject obj = (JObject)jsArr[i]; GetPositionInfo(obj, out blockNum, out row, out col); SetDrippingTube(blockNum, row, col); //await vsmdController.MoveTo(VsmdAxis.X, curBoardSetting.Convert2PhysicalPos(VsmdAxis.X, blockNum, col)); //await vsmdController.MoveTo(VsmdAxis.Y, curBoardSetting.Convert2PhysicalPos(VsmdAxis.Y, blockNum, row)); var moveXTask = vsmdController.MoveTo(VsmdAxis.X, curBoardSetting.Convert2PhysicalPos(VsmdAxis.X, blockNum, col)); var moveYTask = vsmdController.MoveTo(VsmdAxis.Y, curBoardSetting.Convert2PhysicalPos(VsmdAxis.Y, blockNum, row)); await Task.WhenAll(moveXTask, moveYTask); // TODO await vsmdController.MoveTo(VsmdAxis.Z, curBoardSetting.CurrentBoard.ZDispense); // start drip //await vsmdController.ClickPump(); await pumpController.Drip(); // wait 5 seconds, this time should be changed according to the volume dripped Thread.Sleep(dripInterval); await vsmdController.MoveTo(VsmdAxis.Z, curBoardSetting.CurrentBoard.ZTravel); // change the screen to start await pumpController.Drip(); //await Task.Delay(1000); MoveCallBack(blockNum, row, col); m_dripIndex = i; } AfterMove(); }
private async void btnMoveToBack_Click(object sender, EventArgs e) { BoardSetting curBoardSetting = BoardSetting.GetInstance(); bool bok = await VsmdController.GetVsmdController().MoveTo(VsmdAxis.Y, 30500); if (bok) { StatusBar.DisplayMessage(VsmdWorkstation.Controls.MessageType.Info, "移动到后端!"); } else { StatusBar.DisplayMessage(VsmdWorkstation.Controls.MessageType.Error, "未能移动到后端!"); } }
private void BoardSettingFrm_Load(object sender, EventArgs e) { panelGrid.Top = panelSite.Top; m_curMeta = new BoardMeta(); m_curMeta.Type = (int)BoardType.Site; FillData(); m_mode = FORM_MODE.Add; if (!VsmdController.GetVsmdController().IsInitialized()) { StatusBar.DisplayMessage(MessageType.Error, "设备未连接!"); DisableControls(); return; } }
public async void MoveToHere(string args) { JObject targetTube = (JObject)JsonConvert.DeserializeObject(args); int blockNum, row, col; GetPositionInfo(targetTube, out blockNum, out row, out col); VsmdController vsmdController = VsmdController.GetVsmdController(); BoardSetting curBoardSetting = BoardSetting.GetInstance(); //await vsmdController.MoveTo(VsmdAxis.X, curBoardSetting.Convert2PhysicalPos(VsmdAxis.X, blockNum, col)); //await vsmdController.MoveTo(VsmdAxis.Y, curBoardSetting.Convert2PhysicalPos(VsmdAxis.Y, blockNum, row)); var moveXTask = vsmdController.MoveTo(VsmdAxis.X, curBoardSetting.Convert2PhysicalPos(VsmdAxis.X, blockNum, col)); var moveYTask = vsmdController.MoveTo(VsmdAxis.Y, curBoardSetting.Convert2PhysicalPos(VsmdAxis.Y, blockNum, row)); await Task.WhenAll(moveXTask, moveYTask); }
private async void SetTubePositionFrm_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) { if (m_inMoving) { await VsmdController.GetVsmdController().Stop(m_axisType); m_inMoving = false; txtPos.Text = VsmdController.GetVsmdController().GetAxis(m_axisType).curPos.ToString(); } } }
private async Task <bool> BeforeMove() { m_dripStatus = DripStatus.Moving; CallJS("JsExecutor.beforeMove();"); if (!m_isFromPause) { VsmdController vsmdController = VsmdController.GetVsmdController(); await vsmdController.ZeroStart(VsmdAxis.X); await vsmdController.ZeroStart(VsmdAxis.Y); await vsmdController.ZeroStart(VsmdAxis.Z); } return(true); }
private async Task <bool> SaveImpl(VsmdAxis axis) { switch (axis) { case VsmdAxis.X: if (!string.IsNullOrWhiteSpace(txtSpeedX.Text)) { await VsmdController.GetVsmdController().SetSpeed(axis, float.Parse(txtSpeedX.Text)); } if (!string.IsNullOrWhiteSpace(txtZsdX.Text)) { await VsmdController.GetVsmdController().SetZsd(axis, float.Parse(txtZsdX.Text)); } break; case VsmdAxis.Y: if (!string.IsNullOrWhiteSpace(txtSpeedY.Text)) { await VsmdController.GetVsmdController().SetSpeed(axis, float.Parse(txtSpeedY.Text)); } if (!string.IsNullOrWhiteSpace(txtZsdY.Text)) { await VsmdController.GetVsmdController().SetZsd(axis, float.Parse(txtZsdY.Text)); } break; case VsmdAxis.Z: if (!string.IsNullOrWhiteSpace(txtSpeedZ.Text)) { await VsmdController.GetVsmdController().SetSpeed(axis, float.Parse(txtSpeedZ.Text)); } if (!string.IsNullOrWhiteSpace(txtZsdX.Text)) { await VsmdController.GetVsmdController().SetZsd(axis, float.Parse(txtZsdZ.Text)); } break; default: break; } return(true); }
public void UpdateControlState() { if (VsmdController.GetVsmdController().IsInitialized()) { cmbPort.Enabled = false; cmbBaudrate.Enabled = false; cmbPumpPort.Enabled = false; lblCurInfo.Text = "已连接"; btnConnect.Text = "断开连接"; } else { cmbPort.Enabled = true; cmbBaudrate.Enabled = true; cmbPumpPort.Enabled = true; lblCurInfo.Text = "未连接"; btnConnect.Text = "连接"; } }
public void Move() { VsmdController vsmdController = VsmdController.GetVsmdController(); if (!vsmdController.IsInitialized()) { StatusBar.DisplayMessage(MessageType.Error, "设备未连接!"); return; } float spdX = vsmdController.GetAxis(VsmdAxis.X).GetAttributeValue(VsmdLib.VsmdAttribute.Spd); float spdY = vsmdController.GetAxis(VsmdAxis.Y).GetAttributeValue(VsmdLib.VsmdAttribute.Spd); float spdZ = vsmdController.GetAxis(VsmdAxis.Z).GetAttributeValue(VsmdLib.VsmdAttribute.Spd); string errAxis = ""; if (spdX <= 0.0) { errAxis += "X"; } if (spdY <= 0.0) { if (errAxis.Length > 0) { errAxis += ","; } errAxis += "Y"; } if (spdZ <= 0.0) { if (errAxis.Length > 0) { errAxis += ","; } errAxis += "Z"; } if (errAxis.Length > 0) { StatusBar.DisplayMessage(MessageType.Error, "控制轴" + errAxis + "速度不能为0!"); } else { CallJS("JsExecutor.startDrip()"); } }
private async Task <bool> AfterMove() { //await VsmdController.GetVsmdController().Off(VsmdAxis.X); //await VsmdController.GetVsmdController().Off(VsmdAxis.Y); bool bok = await VsmdController.GetVsmdController().MoveTo(VsmdAxis.Y, 100); if (m_dripStatus != PipettingStatus.PauseMove) { CallJS("JsExecutor.afterMove();"); m_isFromPause = false; m_dripStatus = PipettingStatus.Idle; m_selectedTubes.Clear(); if (onPipettingFinished != null) { onPipettingFinished(); } } return(bok); }
private void tsmDrip_Click(object sender, EventArgs e) { SetAllSubFormState(); if (VsmdController.GetVsmdController().IsInitialized()) { if (m_dripForm == null || !m_dripForm.IsOpened) { m_dripForm = new DripFrm(); m_dripForm.MdiParent = this; //m_dripForm.WindowState = FormWindowState.Maximized; m_dripForm.Show(); } else { m_dripForm.BringToFront(); } } else { StatusBar.DisplayMessage(MessageType.Error, "设备未连接!"); } }
private async void btnResetControler_Click(object sender, EventArgs e) { await VsmdController.GetVsmdController().ResetVsmdController(); }
private async void btnConnect_Click(object sender, EventArgs e) { if (VsmdController.GetVsmdController().IsInitialized()) { VsmdController.GetVsmdController().Dispose(); PumpController.GetPumpController().Dispose(); UpdateControlState(); return; } if (m_isConnecting) { return; } if (cmbPort.SelectedItem == null) { StatusBar.DisplayMessage(VsmdWorkstation.Controls.MessageType.Error, "电机端口不能为空!"); return; } if (cmbPumpPort.SelectedItem == null) { StatusBar.DisplayMessage(VsmdWorkstation.Controls.MessageType.Error, "蠕动泵端口不能为空!"); return; } string vsmdPort = cmbPort.SelectedItem.ToString(); string pumpPort = cmbPumpPort.SelectedItem.ToString(); if (vsmdPort == pumpPort) { StatusBar.DisplayMessage(VsmdWorkstation.Controls.MessageType.Error, "电机端口与蠕动泵端口不能相同!"); return; } int baudrate = int.Parse(cmbBaudrate.SelectedItem.ToString()); if (vsmdPort == VsmdController.GetVsmdController().GetPort() && baudrate == VsmdController.GetVsmdController().GetBaudrate() && pumpPort == PumpController.GetPumpController().GetPort()) { if (m_initCB != null) { m_initCB(new InitResult() { Message = "设备连接成功!", IsSuccess = true }); } this.Close(); } m_isConnecting = true; InitResult vsmdRet = await VsmdController.GetVsmdController().Init(vsmdPort, baudrate); InitResult pumpRet = PumpController.GetPumpController().Init(pumpPort); if (m_initCB != null) { InitResult connectRet = new InitResult(); connectRet.IsSuccess = vsmdRet.IsSuccess && pumpRet.IsSuccess; connectRet.Message = vsmdRet.IsSuccess ? pumpRet.Message : vsmdRet.Message; m_initCB(connectRet); m_isConnecting = false; } if (vsmdRet.IsSuccess && pumpRet.IsSuccess) { this.Close(); } }
private void ConnectVsmd_Load(object sender, EventArgs e) { cmbPort.Items.AddRange(SerialPort.GetPortNames()); cmbPumpPort.Items.AddRange(SerialPort.GetPortNames()); if (VsmdController.GetVsmdController().IsInitialized()) { //lblCurInfo.Text = VsmdController.GetVsmdController().GetPort() + ", " + VsmdController.GetVsmdController().GetBaudrate() + ", " + PumpController.GetPumpController().GetPort(); int idx = cmbPort.Items.IndexOf(VsmdController.GetVsmdController().GetPort()); if (idx > -1) { cmbPort.SelectedIndex = idx; } idx = cmbBaudrate.Items.IndexOf(VsmdController.GetVsmdController().GetBaudrate().ToString()); if (idx > -1) { cmbBaudrate.SelectedIndex = idx; } idx = cmbPumpPort.Items.IndexOf(PumpController.GetPumpController().GetPort()); if (idx > -1) { cmbPumpPort.SelectedIndex = idx; } UpdateControlState(); return; } else { UpdateControlState(); } if (Preference.GetInstace().HasPreference) { int idx = cmbPort.Items.IndexOf(Preference.GetInstace().VsmdPort); if (idx > -1) { cmbPort.SelectedIndex = idx; } idx = cmbBaudrate.Items.IndexOf(Preference.GetInstace().Baudrate.ToString()); if (idx > -1) { cmbBaudrate.SelectedIndex = idx; } idx = cmbPumpPort.Items.IndexOf(Preference.GetInstace().PumpPort); if (idx > -1) { cmbPumpPort.SelectedIndex = idx; } } else { if (cmbPort.Items.Count > 0) { cmbPort.SelectedIndex = 0; cmbPumpPort.SelectedIndex = 0; } cmbBaudrate.SelectedIndex = 2; } IsClosed = false; if (GeneralSettings.GetInstance().AutoConnect) { btnConnect_Click(null, null); } }