/// <summary> /// 等待输入口稳定到指定状态 /// </summary> /// <param name="pbquit">取消控制</param> /// <param name="sta_wait_for">指定状态</param> /// <param name="cnt">检查次数</param> /// <param name="delay">检查间隔</param> /// <param name="bdoevnet">为True时,循环中处理其他系统信息,例如界面刷新等</param> /// <returns></returns> public bool WaitForStable(ref bool pbquit, IO_STA sta_wait_for = IO_STA.IN_ON, int cnt = 3, int delay = 10, bool bdoevnet = true) { int n = 0; for (int i = 0; i < cnt; i++) { if (sta_wait_for == Status) { n++; } Thread.Sleep(delay); if (bdoevnet) { Application.DoEvents(); } if (pbquit) { break; } } if (n >= (cnt / 2 + 1)) { return(true); } else { return(false); } }
/// <summary> /// IO翻转 /// </summary> /// <returns></returns> public EM_RES Invert() { if (Status == IO_STA.OUT_ON) { Status = IO_STA.OUT_OFF; } else { Status = IO_STA.OUT_ON; } return(res); }
/// <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 GPIO(ushort io_num, AXIS ax, IO_DIR dir, IO_TYPE type, string disc, IO_STA default_sta = IO_STA.NULL, bool binvert = false) { this.bInvert = binvert; axis = ax; card = ax.card; if (card != null) { m_id = (int)(card.id << 8) + (int)(io_num & 0xFF); } else { m_id = -1; } num = io_num; this.dir = dir; this.type = type; str_disc = disc; this.default_sta = default_sta; //check num if (num < 0 || ((int)type == (int)IO_TYPE.VIRTUAL_ELN && (int)type == (int)IO_TYPE.VIRTUAL_ORG) && num >= card.ax_num) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, String.Format("{0} io_num {1} 超范围[{2},{3})", disc, num, 0, card.ax_num)); } else { if (dir == IO_DIR.IN && (type == IO_TYPE.MT_CARD && num >= card.input_num) || (type == IO_TYPE.IO_CARD && num > card.input_num)) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, String.Format("{0} io_num {1} 超范围[{2},{3}]", disc, num, 0, card.input_num)); } if (dir == IO_DIR.OUT && (type == IO_TYPE.MT_CARD && num >= card.output_num) || (type == IO_TYPE.IO_CARD && num > card.output_num)) { VAR.msg.AddMsg(Msg.EM_MSGTYPE.ERR, String.Format("{0} io_num {1} 超范围[{2},{3}]", disc, num, 0, card.output_num)); } } ChkSafe = null; if (card != null) { card.GPIOList.Add(this); } }
/// <summary> /// 关闭IO /// </summary> /// <returns></returns> public EM_RES SetOff() { Status = IO_STA.OUT_OFF; return(res); }
/// <summary> /// 打开IO /// </summary> /// <returns></returns> public EM_RES SetOn() { Status = IO_STA.OUT_ON; return(res); }