protected override void RunLoopInWork() { int errCode = 0; //bool isHomeDone = false; //errCode = _md.IsHomeDone(_ci.ChannelIndex, out isHomeDone); //if (errCode != 0) //{ // ActionErrorInfo = "获取HomeDone状态失败!" + _md.GetErrorInfo(errCode); // ExitWork(WorkExitCode.Error, "获取HomeDone 状态失败!"); //} //if (isHomeDone) //{ // ActionErrorInfo = "Success"; // ExitWork(WorkExitCode.Normal, "Success"); //} // 其他状态检查 bool[] axisStatus; errCode = _md.GetMotionStatus(_ci.ChannelIndex, out axisStatus); if (errCode != 0) { ActionErrorInfo = "获取轴状态失败!" + _md.GetErrorInfo(errCode); ExitWork(WorkExitCode.Error, "获取轴状态失败!"); } if (axisStatus[_md.MSID_ALM]) { ActionErrorInfo = "轴已报警!"; ExitWork(WorkExitCode.Error, "轴已报警!"); } if (axisStatus[_md.MSID_EMG]) { ActionErrorInfo = "轴已急停!"; ExitWork(WorkExitCode.Error, "轴已急停!"); } if (axisStatus[_md.MSID_SVO]) { ActionErrorInfo = "轴伺服已断电!"; ExitWork(WorkExitCode.Error, "轴伺服已断电!"); } if (axisStatus[_md.MSID_MDN]) //等待归零完成,这一句去掉 { ActionErrorInfo = "Success"; ExitWork(WorkExitCode.Normal, "Success"); } if (TimeoutMilliSeconds >= 0) { TimeSpan ts = DateTime.Now - _startTime; if (ts.TotalMilliseconds >= TimeoutMilliSeconds) { ActionErrorInfo = "超时"; ExitWork(WorkExitCode.Error, "超时"); } } }
/// <summary> /// 检查轴是否满足运动条件 /// </summary> /// <param name="axisID"></param> /// <returns></returns> bool _IsAxisCanMove(int axisID) { if (null == _module) { MessageBox.Show("操作失败,运动模块未设置/空值"); return(false); } if (!_module.IsOpen) { MessageBox.Show("操作失败,运动模块未开启"); return(false); } if (axisID >= _module.AxisCount) { MessageBox.Show("操作失败,轴序号 = " + axisID + " 超出限制:0~" + (_module.AxisCount - 1)); return(false); } bool[] motionStatus; int err = _module.GetMotionStatus(axisID, out motionStatus); if (err != 0) { MessageBox.Show("操作失败,轴序号:" + axisID + " 状态未知!"); return(false); } if (!motionStatus[_module.MSID_SVO]) { MessageBox.Show("操作失败,轴序号:" + axisID + " 伺服未使能!"); return(false); } if (motionStatus[_module.MSID_ALM]) { MessageBox.Show("操作失败,轴序号:" + axisID + " 伺服已报警!"); return(false); } if (_module.MSID_MDN >= 0) { if (!motionStatus[_module.MSID_MDN]) { MessageBox.Show("操作失败,轴序号:" + axisID + " 运动未完成!"); return(false); } } return(true); }
protected override bool ActionGenuine(out string errorInfo) { _isRunning = true; string axisID = GetMethodInputValue(PN_AxisID) as string; if (!JFHubCenter.Instance.MDCellNameMgr.ContainAxisName(axisID)) { errorInfo = "参数项:\"轴ID\" = " + axisID + " 在设备名称表中不存在"; _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } int timeoutMilSeconds = (int)GetMethodInputValue(PN_TimeoutMilliSeconds); int cycleMilliSeconds = (int)GetInitParamValue(PN_CycleMilliSeconds);; JFDevChannel axisChn = new JFDevChannel(JFDevCellType.Axis, axisID); if (!axisChn.CheckAvalid(out errorInfo)) { _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } IJFDevice_MotionDaq _dev = null; IJFModule_Motion _md = null; JFDevCellInfo _ci = null; _dev = axisChn.Device() as IJFDevice_MotionDaq; _ci = axisChn.CellInfo(); _md = _dev.GetMc(_ci.ModuleIndex); DateTime startTime = DateTime.Now; while (true) { if (0 == _workCmd) //正常工作 { int errCode = 0; bool[] axisStatus; errCode = _md.GetMotionStatus(_ci.ChannelIndex, out axisStatus); if (errCode != 0) { errorInfo = "获取轴状态失败!" + _md.GetErrorInfo(errCode); _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } if (axisStatus[_md.MSID_ALM]) { errorInfo = "轴已报警!"; _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } if (_md.MSID_EMG > -1 && axisStatus[_md.MSID_EMG]) { errorInfo = "轴已急停!"; _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } if (!axisStatus[_md.MSID_SVO]) { errorInfo = "轴伺服已断电!"; _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } if (axisStatus[_md.MSID_MDN]) { ActionErrorInfo = "Success"; _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.Success); return(true); } if (timeoutMilSeconds >= 0) { TimeSpan ts = DateTime.Now - startTime; if (ts.TotalMilliseconds >= timeoutMilSeconds) { errorInfo = "超时未等到轴:\" " + axisID + "\"归零完成 "; _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.Timeout); return(true); } } Thread.Sleep(cycleMilliSeconds); } else if (1 == _workCmd)//当前为暂停状态 { int errCode = 0; errCode = _md.StopAxis(_ci.ChannelIndex); if (0 != errCode) { errorInfo = "停止轴归零运动失败:" + _md.GetErrorInfo(errCode); _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } _workCmd = 0; continue; } else if (2 == _workCmd)//当前为恢复状态 { double tgtPos = 0; int errCode = _md.GetCmdPos(_ci.ChannelIndex, out tgtPos); if (0 != errCode) { errorInfo = "恢复运行时获取目标位置失败:" + _md.GetErrorInfo(errCode); _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } errCode = _md.AbsMove(_ci.ChannelIndex, tgtPos); if (0 != errCode) { errorInfo = "恢复轴P2P运动失败:" + _md.GetErrorInfo(errCode); _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } _workCmd = 0; continue; } else if (-1 == _workCmd)//指令退出 { int errCode = 0; errCode = _md.StopAxis(_ci.ChannelIndex); if (0 != errCode) { errorInfo = "停止轴归零运动失败:" + _md.GetErrorInfo(errCode); _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } errorInfo = "收到退出指令"; _workCmd = 0; _isRunning = false; SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); return(false); } else { Thread.Sleep(cycleMilliSeconds); continue; } } }
protected override bool ActionGenuine(out string errorInfo) { IJFInitializable dev = null; JFDevCellInfo ci = null; string axisID = GetInitParamValue("轴ID") as string; if (!JFHubCenter.Instance.MDCellNameMgr.ContainAxisName(axisID)) { errorInfo = "参数:\"轴ID\" = " + axisID + " 在设备名称表中不存在"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (!JFCMFunction.CheckDevCellName(JFCMFunction.Axis, axisID, out dev, out ci, out errorInfo)) { SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } IJFModule_Motion md = (dev as IJFDevice_MotionDaq).GetMc(ci.ModuleIndex); bool[] AxisStatus = null; int err = md.GetMotionStatus(ci.ChannelIndex, out AxisStatus); if (err != 0) { errorInfo = "开始运动前检测轴状态失败:" + md.GetErrorInfo(err); SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } //if(md.IsSVO) if (!AxisStatus[md.MSID_SVO]) { errorInfo = "轴伺服未上电"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (AxisStatus[md.MSID_ALM]) { errorInfo = "轴伺服已报警"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (!AxisStatus[md.MSID_MDN]) { errorInfo = "轴当前运动未完成"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } double dPos = Convert.ToDouble(GetInitParamValue("目标位置")); bool IsAbsMove = Convert.ToBoolean(GetInitParamValue("绝对位置模式")); if (IsAbsMove) { err = md.AbsMove(ci.ChannelIndex, dPos); } else { err = md.RelMove(ci.ChannelIndex, dPos); } if (err != 0) { errorInfo = (IsAbsMove?"绝对":"相对") + "位置运动失败:" + md.GetErrorInfo(err); SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } errorInfo = "Success"; SetOutputParamValue("执行结果", JFWorkCmdResult.Success); return(true); }
protected override bool ActionGenuine(out string errorInfo) { IJFInitializable dev = null; JFDevCellInfo ci = null; string axisID = GetInitParamValue("轴ID") as string; if (!JFHubCenter.Instance.MDCellNameMgr.ContainAxisName(axisID)) { errorInfo = "参数项:\"轴ID\" = " + axisID + " 在设备名称表中不存在"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (!JFCMFunction.CheckDevCellName(JFCMFunction.Axis, axisID, out dev, out ci, out errorInfo)) { SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } bool isPositive = (bool)GetInitParamValue("正向移动"); double velocity = Convert.ToDouble(GetInitParamValue("移动速度")); IJFModule_Motion md = (dev as IJFDevice_MotionDaq).GetMc(ci.ModuleIndex); bool[] AxisStatus = null; int err = md.GetMotionStatus(ci.ChannelIndex, out AxisStatus); if (err != 0) { errorInfo = "开始运动前检测轴状态失败:" + md.GetErrorInfo(err); SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } //if(md.IsSVO) if (!AxisStatus[md.MSID_SVO]) { errorInfo = "轴伺服未上电"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (AxisStatus[md.MSID_ALM]) { errorInfo = "轴伺服已报警"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (!AxisStatus[md.MSID_MDN]) { errorInfo = "轴当前运动未完成"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } int errCode = md.VelMove(ci.ChannelIndex, velocity, isPositive); if (errCode < 0) { errorInfo = "SDK调用出错:" + md.GetErrorInfo(errCode); SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } errorInfo = "Success"; SetOutputParamValue("执行结果", JFWorkCmdResult.Success); return(true); }
protected override bool ActionGenuine(out string errorInfo) { string[] axisIDList = GetInitParamValue("轴ID列表") as string[]; double[] dPosList = GetMethodInputValue("目标位置列表") as double[]; bool IsAbsMove = (bool)GetMethodInputValue("绝对位置模式"); if (axisIDList == null || dPosList == null) { errorInfo = "轴ID列表长度或者目标位置列表长度为空"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } int[] iaxisIDList = new int[axisIDList.Length]; if (axisIDList.Length <= 0) { errorInfo = "轴ID列表长度<=0"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (dPosList.Length <= 0) { errorInfo = "目标位置列表<=0"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (axisIDList.Length != dPosList.Length) { errorInfo = "轴ID列表长度为" + axisIDList.ToString() + "与目标列表长度" + dPosList.Length.ToString() + "不一致。"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } IJFInitializable dev = null; IJFInitializable devbuff = null; JFDevCellInfo ci = null; List <JFDevCellInfo> cibuffList = new List <JFDevCellInfo>(); for (int m = 0; m < axisIDList.Length; m++) { if (!JFHubCenter.Instance.MDCellNameMgr.ContainAxisName(axisIDList[m])) { errorInfo = "参数项:\"轴ID\" = " + axisIDList[m] + " 在设备名称表中不存在"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (!JFCMFunction.CheckDevCellName(JFCMFunction.Axis, axisIDList[m], out dev, out ci, out errorInfo)) { SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } iaxisIDList[m] = ci.ChannelIndex; if (devbuff != null) { if (devbuff != dev) { errorInfo = "轴ID列表中的所有轴并不来源于同一个设备"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } } devbuff = dev; if (cibuffList.Contains(ci)) { errorInfo = "轴ID列表中存在重复的轴名称"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } cibuffList.Add(ci); } IJFModule_Motion md = (dev as IJFDevice_MotionDaq).GetMc(ci.ModuleIndex); bool[] AxisStatus = null; int err = md.GetMotionStatus(ci.ChannelIndex, out AxisStatus); if (err != 0) { errorInfo = "开始运动前检测轴状态失败:" + md.GetErrorInfo(err); SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } //if(md.IsSVO) if (!AxisStatus[md.MSID_SVO]) { errorInfo = "轴伺服未上电"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (AxisStatus[md.MSID_ALM]) { errorInfo = "轴伺服已报警"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (!AxisStatus[md.MSID_MDN]) { errorInfo = "轴当前运动未完成"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (IsAbsMove) { err = md.AbsLine(iaxisIDList, dPosList); } else { err = md.RelLine(iaxisIDList, dPosList); } if (err != 0) { errorInfo = (IsAbsMove ? "绝对" : "相对") + "直线插补运动失败:" + md.GetErrorInfo(err); SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } errorInfo = "Success"; SetOutputParamValue("执行结果", JFWorkCmdResult.Success); return(true); }
protected bool JFMotionDone(string AxisName, out string errorInfo, int delaytime) { errorInfo = ""; JFDevChannel axisChn = new JFDevChannel(JFDevCellType.Axis, AxisName); if (!axisChn.CheckAvalid(out errorInfo)) { _workCmd = 0; _isRunning = false; return(false); } IJFDevice_MotionDaq _dev = null; IJFModule_Motion _md = null; JFDevCellInfo _ci = null; _dev = axisChn.Device() as IJFDevice_MotionDaq; _ci = axisChn.CellInfo(); _md = _dev.GetMc(_ci.ModuleIndex); DateTime startTime = DateTime.Now; while (true) { if (0 == _workCmd) //正常工作 { int errCode = 0; bool[] axisStatus; errCode = _md.GetMotionStatus(_ci.ChannelIndex, out axisStatus); if (errCode != 0) { errorInfo = "获取轴状态失败!" + _md.GetErrorInfo(errCode); _workCmd = 0; _isRunning = false; return(false); } if (axisStatus[_md.MSID_ALM]) { errorInfo = "轴已报警!"; _workCmd = 0; _isRunning = false; return(false); } if (_md.MSID_EMG > -1 && axisStatus[_md.MSID_EMG]) { errorInfo = "轴已急停!"; _workCmd = 0; _isRunning = false; return(false); } //if (!axisStatus[_md.MSID_SVO]) //{ // errorInfo = "轴伺服已断电!"; // _workCmd = 0; // _isRunning = false; // SetOutputParamValue(ON_Result, JFWorkCmdResult.ActionError); // return false; //} if (axisStatus[_md.MSID_MDN]) { ActionErrorInfo = "Success"; _workCmd = 0; _isRunning = false; return(true); } TimeSpan ts = DateTime.Now - startTime; if (ts.TotalMilliseconds >= delaytime) { errorInfo = "超时未等到轴:\" " + AxisName + "\"动作完成 "; _workCmd = 0; _isRunning = false; return(false); } Thread.Sleep(10); } else if (1 == _workCmd)//当前为暂停状态 { _station.StopAxis(LeftClampName); _station.StopAxis(LeftPushName); _isRunning = false; _workCmd = 0; continue; } else if (2 == _workCmd)//当前为恢复状态 { _workCmd = 0; continue; } else if (-1 == _workCmd)//指令退出 { _station.StopAxis(LeftClampName); _station.StopAxis(LeftPushName); errorInfo = "收到退出指令"; _workCmd = 0; _isRunning = false; return(false); } else { Thread.Sleep(10); continue; } } }
protected override bool ActionGenuine(out string errorInfo) { IJFInitializable dev = null; JFDevCellInfo ci = null; string axisID = GetInitParamValue("轴ID") as string; if (!JFHubCenter.Instance.MDCellNameMgr.ContainAxisName(axisID)) { errorInfo = "参数项:\"轴ID\"的值:\"" + axisID + "\"在设备名称表中不存在"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (!JFCMFunction.CheckDevCellName(JFCMFunction.Axis, axisID, out dev, out ci, out errorInfo)) { SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } IJFModule_Motion md = (dev as IJFDevice_MotionDaq).GetMc(ci.ModuleIndex); bool[] AxisStatus = null; int err = md.GetMotionStatus(ci.ChannelIndex, out AxisStatus); if (err != 0) { errorInfo = "归0前获取轴状态失败:" + md.GetErrorInfo(err); SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } //if(md.IsSVO) if (!AxisStatus[md.MSID_SVO]) { errorInfo = "轴伺服未上电"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } if (AxisStatus[md.MSID_ALM]) { errorInfo = "轴伺服已报警"; SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } //if (!AxisStatus[md.MSID_MDN]) //{ // errorInfo = "轴当前运动未完成"; // SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); // return false; //} err = md.Home(ci.ChannelIndex); if (err != 0) { errorInfo = "调用SDK失败:" + md.GetErrorInfo(err); SetOutputParamValue("执行结果", JFWorkCmdResult.ActionError); return(false); } errorInfo = "Success"; SetOutputParamValue("执行结果", JFWorkCmdResult.Success); return(true); }