/// <summary> /// 关闭气缸,可选延迟 /// </summary> /// <param name="delay">等待时间,等于0时不等待直接返回OK</param> /// <param name="bdoevnet">为True时,循环中处理其他系统信息,例如界面刷新等</param> /// <returns></returns> public EM_RES SetOff(int delay = 0, bool bdoevnet = false) { //防呆 if (ChkSafe != null) { EM_RES res = ChkSafe((int)GPIO.IO_STA.OUT_OFF); if (res != EM_RES.OK) { return(res); } } //set off io_out.SetOff(); if (io_out.res != EM_RES.OK) { return(io_out.res); } //delay if (delay > 0) { while (delay > 0) { Thread.Sleep(delay); if (bdoevnet) { Application.DoEvents(); } delay -= 10; } } return(EM_RES.OK); }
public EM_RES ChkParam() { if (type == IO_TYPE.NULL) { res = EM_RES.OK; } if (m_id < 0) { if (bShowErrmsg) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, String.Format("{0} ID({1})异常!", disc, m_id)); } bShowErrmsg = false; res = EM_RES.PARA_ERR; return(res); } if (card == null || !card.isReady) { if (bShowErrmsg) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, String.Format("{0} 对应板卡{1}未初始化!", disc, card.disc)); } bShowErrmsg = false; res = EM_RES.PARA_ERR; return(res); } bShowErrmsg = true; res = EM_RES.OK; return(res); }
/// <summary> /// 打开气缸,可选等待传感器到位 /// </summary> /// <param name="bquit">取消控制</param> /// <param name="waitms">等待时间,等于0时不等待直接返回OK</param> /// <param name="bdoevnet">为True时,循环中处理其他系统信息,例如界面刷新等</param> /// <returns>在指定时间内感应到对应的传感器则返回OK</returns> public EM_RES SetOn(ref bool bquit, int waitms = 0, bool bdoevnet = false) { //防呆 if (ChkSafe != null) { EM_RES res = ChkSafe((int)GPIO.IO_STA.OUT_ON); if (res != EM_RES.OK) { return(res); } } //set on io_out.SetOn(); if (io_out.res != EM_RES.OK) { return(io_out.res); } //wait for sensor EM_RES ret = EM_RES.OK; if (waitms > 0) { if (io_sen_on != null) { ret = io_sen_on.WaitForSta(ref bquit, io_sen_on_active, (uint)waitms, true, bdoevnet); if (ret != EM_RES.OK) { return(ret); } } if (io_sen_off != null) { ret = io_sen_off.WaitForSta(ref bquit, io_sen_off_active == GPIO.IO_STA.IN_ON ? GPIO.IO_STA.IN_OFF : GPIO.IO_STA.IN_ON, (uint)waitms, true, bdoevnet); if (ret != EM_RES.OK) { return(ret); } } if (io_sen_on == null && io_sen_off == null) { while (waitms > 0) { Thread.Sleep(waitms); if (bdoevnet) { Application.DoEvents(); } waitms -= 10; } } } return(ret); }
private void btn_m_Click(object sender, EventArgs e) { if (gpio_out != null) { EM_RES ret = gpio_out.Invert(); if (ret != EM_RES.OK) { MessageBox.Show(gpio_out.disc + " IO Operation error!"); } lbl_on.BackColor = (gpio_out.isON ? mOUT_Color : Color.Silver); } }
/// <summary> /// 等待到指定状态后立刻返回 /// </summary> /// <param name="bquit">取消控制</param> /// <param name="sta_wait_for">指定状态</param> /// <param name="timeout_ms">超时控制</param> /// <param name="bshow_mgs">显示异常信息</param> /// <param name="bdoevnet">为True时,循环中处理其他系统信息,例如界面刷新等</param> /// <returns>在指时间内检查到指定状态则返回EM_RES.OK</returns> public EM_RES WaitForSta(ref bool bquit, IO_STA sta_wait_for, uint timeout_ms, bool bshow_mgs = true, bool bdoevnet = false) { //check res = ChkParam(); if (res != EM_RES.OK) { return(res); } IO_STA pbitstate = 0; int timeout = (int)timeout_ms; do { //cancel if (bquit == true) { return(res = EM_RES.QUIT); } //check and return pbitstate = Status; if (pbitstate == sta_wait_for) { return(res = EM_RES.OK); } else if (pbitstate == IO_STA.ERR) { res = EM_RES.ERR; VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, String.Format("{0} 等待状态返回异常!", disc)); return(res); } //delay 10ms if (timeout > 0) { timeout -= 10; if (bdoevnet) { Application.DoEvents(); } Thread.Sleep(10); } } while (timeout > 0); if (bshow_mgs) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, String.Format("{0} 等待 {1} 超时({2}ms)!", disc, sta_wait_for == IO_STA.IN_ON ? "ON" : "OFF", timeout_ms)); } return(EM_RES.TIMEOUT); }
public static EM_RES SetAxToManualSpd(List <AXIS> ax_list) { EM_RES ret = EM_RES.OK; foreach (AXIS ax in ax_list) { ret = ax.SetToManualHighSpd(); if (ret != EM_RES.OK) { return(ret); } } return(ret); }
public static EM_RES SetAxToWorkSpd(List <AXIS> ax_list, double persent = 1.0) { EM_RES ret = EM_RES.OK; foreach (AXIS ax in ax_list) { ret = ax.SetToWorkSpd(persent); if (ret != EM_RES.OK) { return(ret); } } return(ret); }
/// <summary> /// 取反气缸,可选延迟 /// </summary> /// <param name="delay">等待时间,等于0时不等待直接返回OK</param> /// <param name="bdoevnet">为True时,循环中处理其他系统信息,例如界面刷新等</param> /// <returns></returns> public EM_RES Invert(int delay = 0, bool bdoevnet = false) { if (io_out == null) { return(EM_RES.PARA_ERR); } //防呆 if (ChkSafe != null) { EM_RES res = ChkSafe((int)(io_out.isON?GPIO.IO_STA.OUT_OFF: GPIO.IO_STA.OUT_ON)); if (res != EM_RES.OK) { return(res); } } //invert io_out.Invert(); if (io_out.res != EM_RES.OK) { return(io_out.res); } //delay if (delay > 0) { while (delay > 0) { Thread.Sleep(delay); if (bdoevnet) { Application.DoEvents(); } delay -= 10; } } return(EM_RES.OK); }
/// <summary> /// 检查板卡是否在线,否在重连 /// </summary> /// <returns></returns> public EM_RES ChkOnline(string filename = "") { EM_RES res = EM_RES.OK; #if LEADSHINE if (brand == BRAND.LEADSHINE) { if (isReady) { return(EM_RES.OK); } } #endif #if ZMOTION if (brand == BRAND.ZMOTION) { //check on line if (((long)handle) == 0) { if (bshowmsg) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0} 掉线!", disc)); } bshowmsg = false; return(res = EM_RES.ERR); } uint val = 0; int ret = zmcaux.ZAux_Direct_GetIn(handle, 0, ref val); if (ret != 0) { if (bshowmsg) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0} 掉线!", disc)); } if (((long)handle) != 0) { zmcaux.ZAux_Close(handle); } handle = (IntPtr)0; bshowmsg = false; res = EM_RES.ERR; } else if (((long)handle) == 0) { bshowmsg = true; res = Init(ip, filename); } } #endif #if ORIENTALMOTOR if (brand == BRAND.ORIENTALMOTOR) { foreach (AXIS ax in AxList) { ax.AzdMotor.ErrorCount = 0; } if (AZD.Motor.isRs485Ready) { return(res = EM_RES.OK); } else { res = Init(); return(res); //res = EM_RES.ERR; //return res; } } #endif return(res); }
public EM_RES DownLoadFile(string filename = "") { int ret = 0; //if (!isReady) return EM_RES.ERR; #if LEADSHINE if (brand == BRAND.LEADSHINE) { //download config if (filename == "") { filename = string.Format("{0}DMC3800_{1}.ini", Path.GetFullPath("..") + "\\syscfg\\", card_id); } VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, String.Format("{0}下载配置,{1}", str_disc, filename)); ret = LTDMC.dmc_download_configfile((ushort)card_id, filename); if (ret != 0) { LTDMC.dmc_board_close(); isInit = false; VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, String.Format("{0}/id{1},配置失败!Err:0x{2:X8}", disc, card_id, ret)); return(EM_RES.ERR); } else { VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, String.Format("{0}/id{1},更新配置成功!", disc, card_id)); } } #endif #if ZMOTION if (brand == BRAND.ZMOTION) { //下载时,容易引起程序丢失 //if (filename == "") filename = string.Format("{0}{1}_{2}.bas", Path.GetFullPath("..") + "\\syscfg\\", str_disc, id); //VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, String.Format("{0}下载配置,{1}", str_disc, filename)); //ret = zmcaux.ZAux_BasDown(handle, filename); //if (ret != 0) //{ // isInit = false; // zmcaux.ZAux_Close(handle); // handle = (IntPtr)0; // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0} 下载配置失败,Err:{1},{2}", disc, ret, filename)); // return EM_RES.ERR; //} //else //{ // //set max_spd // foreach (AXIS ax in AxList) // { // zmcaux.ZAux_Direct_SetMaxSpeed(handle, ax.num, (int)(ax.max_spd * ax.pul_per_mm)); // if (ret != 0) // { // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0} 配置MAX_SPD失败,Err:{1}", disc, ret)); // } // } // VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, String.Format("{0}/id{1},更新配置成功!", disc, id)); //} } #endif #if ORIENTALMOTOR if (brand == BRAND.ORIENTALMOTOR) { if (!Motor.isRs485Ready) { EM_RES res = Init(); if (res != EM_RES.OK) { return(res); } } VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, String.Format("{0}下载配置", str_disc)); foreach (AXIS ax in AxList) { UInt32 temp = 0; UInt32 temp2 = 0; ushort[] dat; bool bres = true; ////(ZHOME)•运行速度 688/689 ////(ZHOME)•加减速 690/691 //temp = (ushort)(ax.home_spd * ax.pul_per_mm); //temp2 = (ushort)(ax.tacc / 0.001); //dat = new ushort[4] { (ushort)(temp >> 16), (ushort)(temp & 0XFFFF), (ushort)(temp2 >> 16), (ushort)(temp2 & 0XFFFF) }; //bres = ax.AzdMotor.WriteReg(688, dat); //if(!bres) //{ // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}设置运行速度/加速出错!",ax.disc)); // return EM_RES.ERR; //} ////SLN作为 原点/预置位置 908/909 //temp = (ushort)(ax.sln * ax.pul_per_mm); //dat = new ushort[2] { (ushort)(temp >> 16), (ushort)(temp & 0XFFFF) }; //bres = ax.AzdMotor.WriteReg(908, dat); //if (!bres) //{ // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}设置原点出错!", ax.disc)); // return EM_RES.ERR; //} //POS0点数据 1024/1025 //POS1点数据 1026/1027 temp = (ushort)(ax.pos0 * ax.pul_per_mm); temp2 = (ushort)(ax.pos1 * ax.pul_per_mm); dat = new ushort[4] { (ushort)(temp >> 16), (ushort)(temp & 0XFFFF), (ushort)(temp2 >> 16), (ushort)(temp2 & 0XFFFF) }; bres = ax.AzdMotor.WriteReg(1024, dat); if (!bres) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}设置POS0/POS1出错!", ax.disc)); return(EM_RES.ERR); } ////速度No.0 1152/1153 ////速度No.1 1154/1155 //temp = (ushort)(ax.spd_work * ax.pul_per_mm); //dat = new ushort[4] { (ushort)(temp >> 16), (ushort)(temp & 0XFFFF), (ushort)(temp >> 16), (ushort)(temp & 0XFFFF) }; //bres = ax.AzdMotor.WriteReg(1152,dat); //if (!bres) //{ // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}设置速度0/速度1出错!", ax.disc)); // return EM_RES.ERR; //} ////方式No.0 1280/1281 1-绝对定位 ////方式No.1 1282/1283 1-绝对定位 //dat = new ushort[4] { 0, 1, 0, 1 }; //bres = ax.AzdMotor.WriteReg(1280, dat); //if (!bres) //{ // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}设置定位方式0/1出错!", ax.disc)); // return EM_RES.ERR; //} ////加减速单位 654/655 0:•kHz/s• 1:•s• 2:•ms / kHz //dat = new ushort[2] { 0,1 }; //bres = ax.AzdMotor.WriteReg(654, dat); //if (!bres) //{ // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}设置加减速单位出错!", ax.disc)); // return EM_RES.ERR; //} ////起动/变速No.0 1536/1537 ////起动/变速No.1 1538/1539 //temp = (ushort)(ax.tacc/0.001); //dat = new ushort[4] { (ushort)(temp >> 16), (ushort)(temp & 0XFFFF), (ushort)(temp >> 16), (ushort)(temp & 0XFFFF) }; //bres = ax.AzdMotor.WriteReg(1536, dat); //if (!bres) //{ // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}设置加速度出错!", ax.disc)); // return EM_RES.ERR; //} ////停止No.0 1664/1665 ////停止No.1 1666/1667 //temp = (ushort)(ax.tdec / 0.001); //dat = new ushort[4] { (ushort)(temp >> 16), (ushort)(temp & 0XFFFF), (ushort)(temp >> 16), (ushort)(temp & 0XFFFF) }; //bres = ax.AzdMotor.WriteReg(1664, dat); //if (!bres) //{ // VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}设置减速度出错!", ax.disc)); // return EM_RES.ERR; //} return(EM_RES.OK); } } #endif return(EM_RES.OK); }
/// <summary> /// 初始化板卡。 /// 如有主次卡之分,请先初始化主卡。关闭则相反,先关从卡再关主卡。 /// </summary> /// <param name="id">卡ID</param> /// <param name="maincard_id">主卡ID</param> /// <param name="ip">卡IP</param> /// <param name="filename">配置文件路径</param> /// <returns></returns> public EM_RES Init(int card_id = -1, int maincard_id = -1, string ip = "", string filename = "") { if (isReady) { return(EM_RES.OK); } int ret = 0; EM_RES res = EM_RES.OK; //update id if (card_id >= 0) { this.card_id = card_id; } else { card_id = this.card_id; } //update ip if (ip.Length > 7) { this.ip = ip; } else { ip = this.ip; } //update maincard_id if (maincard_id >= 0) { this.maincard_id = maincard_id; } else { maincard_id = this.maincard_id; } #if LEADSHINE if (brand == BRAND.LEADSHINE) { if (type == TYPE.MOTION) { //init card ret = LTDMC.dmc_board_init(); if (ret < 0) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}ID有重复,请检查确认!0x{1:X8}", disc, ret)); return(EM_RES.ERR); } //get card list ushort cardnum = 0; ushort[] cardid = new ushort[64]; uint[] cardtype = new uint[64]; ret = LTDMC.dmc_get_CardInfList(ref cardnum, cardtype, cardid); if (ret != 0) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("获取{0}列表错误,0x{1:X8}", disc, ret)); return(EM_RES.ERR); } //search card list bool bfound = false; for (int n = 0; n < cardnum; n++) { if (card_id == cardid[n]) { bfound = true; break; } } if (!bfound) { isInit = false; VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}列表找不到ID为{1}的板卡!", disc, card_id)); return(EM_RES.ERR); } //download config res = DownLoadFile(filename); if (res != EM_RES.OK) { return(res); } isInit = true; handle = (IntPtr)1; VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, string.Format("{0}初始化成功!", disc)); return(EM_RES.OK); } else if (type == TYPE.CAN_IO) { //连接IO卡 ret = LTDMC.dmc_set_can_state((ushort)maincard_id, (ushort)card_id, 1, 0); if (ret != 0) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}连接失败,Err:0x{1:X8},重新连接...", disc, ret)); ret = LTDMC.dmc_set_can_state((ushort)maincard_id, (ushort)card_id, 1, 0); if (ret != 0) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}重新连接失败,请确认卡连接是否正确!Err:0x{1:X8}", disc, ret)); return(EM_RES.ERR); } } isInit = true; handle = (IntPtr)1; VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, string.Format("{0}初始化成功!", disc)); return(EM_RES.OK); } #if LEADSHINE_IO else if (type == TYPE.IO) { ret = IOC0640.ioc_board_init(); if (ret > 0) { isInit = true; handle = (IntPtr)1; VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, string.Format("{0}初始化成功!", disc)); return(EM_RES.OK); } else { IOC0640.ioc_board_close(); isInit = false; handle = (IntPtr)0; VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}初始化失败!Err:0x{1:X8}", disc, ret)); return(EM_RES.ERR); } } #endif } #endif #if ZMOTION if (brand == BRAND.ZMOTION) { //check ip if (ip.Length < 7) { isInit = false; handle = (IntPtr)0; VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, string.Format("{0} IP异常,{1}", disc, ip)); return(EM_RES.CAM_PARA_ERR); } VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, string.Format("{0} 连接...", disc)); ////search and open,多网卡时,搜索异常 //for (int n = 0; n < 10; n++) //{ // ret = zmcaux.ZAux_SearchEth(ip, 100); // if (ret == 0) break; // Application.DoEvents(); //} ret = 0; if (ret == 0) { ret = zmcaux.ZAux_OpenEth(ip, out handle); if (ret != 0) { isInit = false; handle = (IntPtr)0; VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}初始化失败,IP={1},Err:{2}", disc, ip, ret)); return(EM_RES.ERR); } else { //check param int ftemp = 0; bool bdownload = false; foreach (AXIS ax in AxList) { zmcaux.ZAux_Direct_GetMaxSpeed(handle, ax.num, ref ftemp); if (Math.Abs((ax.max_spd * ax.pul_per_mm) - ftemp) > 100) { bdownload = true; break; } } //download config if (bdownload) { res = DownLoadFile(filename); if (res != EM_RES.OK) { return(res); } } isInit = true; VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, string.Format("{0}初始化成功!", disc)); foreach (AXIS ax in AxList) { ax.Init(); } return(EM_RES.OK); } } else { isInit = false; handle = (IntPtr)0; VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("{0}找不到,IP={1}", disc, ip)); return(EM_RES.ERR); } } #endif #if ADVANTTECH if (brand == BRAND.ADVANTTECH) { isInit = false; VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, "研华库未添加!"); return(EM_RES.ERR); } #endif #if ORIENTALMOTOR if (brand == BRAND.ORIENTALMOTOR) { //get config if (filename.Length < 3) { filename = Path.GetFullPath("..") + "\\syscfg\\ORIENTALMOTOR.ini"; } if (File.Exists(filename)) { IniFile inf = new IniFile(filename); int temp = inf.ReadInteger("COM", "PORT", -1); if (temp >= 0 && temp < 100) { PortName = string.Format("COM{0}", temp); } temp = inf.ReadInteger("COM", "BAUD", -1); if (temp > 0) { Baudrate = temp; } } if (0 == AZD.Motor.InitRs485(PortName, Baudrate)) { isInit = true; handle = (IntPtr)1; VAR.msg.AddMsg(Msg.EM_MSGTYPE.SYS, string.Format("{0}初始化成功!", disc)); foreach (AXIS ax in AxList) { ax.Init(); } return(EM_RES.OK); } else { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("InitRs485异常,BRAND={0},TYPE={1},Port={2}/{3}", brand, type, PortName, Baudrate)); return(EM_RES.ERR); } } #endif VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, string.Format("未定义异常,BRAND={0},TYPE={1}", brand, type)); return(EM_RES.ERR); }
public static EM_RES Move(ref bool bquit, ref AXIS ax_x, double xpos, ref AXIS ax_y, double ypos, ref AXIS ax_z, double zpos, ref AXIS ax_r, double rpos, int time_out_ms = 10000, bool bdoevent = false) { EM_RES ret = EM_RES.OK; //start move if (ax_x != null) { ret = ax_x.MoveTo(ref bquit, xpos); if (ret != EM_RES.OK) { goto MOVE_END; } } if (ax_y != null) { ret = ax_y.MoveTo(ref bquit, ypos); if (ret != EM_RES.OK) { goto MOVE_END; } } if (ax_z != null) { ret = ax_z.MoveTo(ref bquit, zpos); if (ret != EM_RES.OK) { goto MOVE_END; } } if (ax_r != null) { ret = ax_r.MoveTo(ref bquit, rpos); if (ret != EM_RES.OK) { goto MOVE_END; } } //wait if (ax_x != null) { ret = ax_x.WaitForMoveDone(ref bquit, xpos, time_out_ms, bdoevent); if (ret != EM_RES.OK) { goto MOVE_END; } } if (ax_y != null) { ret = ax_y.WaitForMoveDone(ref bquit, ypos, time_out_ms, bdoevent); if (ret != EM_RES.OK) { goto MOVE_END; } } if (ax_z != null) { ret = ax_z.WaitForMoveDone(ref bquit, zpos, time_out_ms, bdoevent); if (ret != EM_RES.OK) { goto MOVE_END; } } if (ax_r != null) { ret = ax_r.WaitForMoveDone(ref bquit, rpos, time_out_ms, bdoevent); if (ret != EM_RES.OK) { goto MOVE_END; } } return(EM_RES.OK); MOVE_END: if (ax_x != null) { ax_x.Stop(); } if (ax_y != null) { ax_y.Stop(); } if (ax_z != null) { ax_z.Stop(); } if (ax_r != null) { ax_r.Stop(); } return(ret); }
/// <summary> /// 等待到OFF状态后立刻返回 /// </summary> /// <param name="bquit">取消控制</param> /// <param name="timeout_ms">超时控制</param> /// <param name="bshow_mgs">显示异常信息</param> /// <param name="bdoevnet">为True时,循环中处理其他系统信息,例如界面刷新等</param> /// <returns>在指时间内检查到OFF状态则返回EM_RES.OK</returns> public EM_RES WaitOFF(ref bool bquit, uint timeout_ms = 3000, bool bshow_mgs = true, bool bdoevnet = false) { res = WaitForSta(ref bquit, IO_STA.IN_OFF, timeout_ms, bshow_mgs, bdoevnet); return(res); }