//using Bro.Common.PubSub; //using Broc.AOI.Entity; //using Broc.AOI.Manager; //using HalconDotNet; //using Lmi3d.GoSdk; //using Lmi3d.Zen; //using Lmi3d.Zen.Io; //using System; //using System.Collections.Generic; //using System.Configuration; //using System.Diagnostics; //using System.IO; //using System.Linq; //using System.Runtime.InteropServices; //using System.Threading; //using System.Threading.Tasks; //using static Broc.AOI.Manager.LogHelper; //namespace Bro.Device.GTSCard //{ // public class GtsCardManager // { // GtsMotionCard _gts = new GtsMotionCard(); // int pCount;//位置比较已输出次数 // bool canStop = false; // private static GtsIO curValueIo = new GtsIO(); // CancellationTokenSource cts = new CancellationTokenSource(); // private static int lastInputValue = Parameter.InDefaultValue; // int StopType = 0; //0:未收到手动停止信号 1:收到收到停止信号 2:收到急停信号 // public GtsCardManager(ProductManager productManager) // { // try // { // _product = productManager.GetProductList().Find(x => x.IsDefault); // Monitor(); // InitGocatorIO(); // PubSubCenter.GetInstance().RemoveSubscribers(MessageType.StopType.ToString()); // PubSubCenter.GetInstance().Subscribe(MessageType.StopType.ToString(), OnStopType); // gocatorRecord = new GocatorRecord(); // //gocatorRecord.OnDataDone = OnGocatorDataDone; // gocatorRecord.Connect(); // gocatorRecord.GocatorStop(); // } // catch (Exception ex) // { // Trace.TraceError(ex.ToString()); // } // } // private object OnStopType(ISubscriber arg1, object arg2, object arg3) // { // StopType = (int)arg2; // Trace.TraceInformation($"停止信号变更为:{StopType}"); // if (StopType > 0) // { // Trace.TraceError("停止后请重启软件"); // } // return null; // } // public void InitGocatorIO() // { // _gts.WriteOut(Parameter.cardn, Parameter.EXO_8, false); // _gts.WriteOut(Parameter.cardn, Parameter.EXO_16, false); // } // public void DoCompare(List pointList) // { // canStop = !canStop; // GTSCardAPI.T2DComparePrm prm; // short t; // short sRtn; // GTSCardAPI.T2DCompareData[] dataBuf = new GTSCardAPI.T2DCompareData[1]; // short pStatus, // pFifo,//当前空闲fifo // pFifoCount,//当前空闲fifo剩余空间 // pBufCount;//FPGA 中 FIFO 剩余空间, FPGA 的 FIFO 总大小为 512,启动位置比较之前,压入的数据先进入 FPGA 的 FIFO // sRtn = GTSCardAPI.GT_2DCompareClear(0, 0); // sRtn = GTSCardAPI.GT_2DCompareMode(0, 0, GTSCardAPI.COMPARE2D_MODE_2D); // prm.encx = Axisn.X; // X 轴为1轴 // prm.ency = Axisn.Y; // Y 轴为2轴 // prm.maxerr = 500; // 最大误差Pulse // prm.outputType = 0; // 输出类型 = 脉冲 // prm.source = 1; // 比较源0 :规划1:编码器 // prm.startLevel = 0; //起始电平方式0:位置比较输出引脚电平复位 1:位置比较输出引脚电平取反 // prm.threshold = 0; // 最优点计算阈值 // prm.time = 50; // 脉冲宽度 us // sRtn = GTSCardAPI.GT_2DCompareSetPrm(0, 0, ref prm); // sRtn = GTSCardAPI.GT_SetComparePort(0, GTSCardAPI.COMPARE_PORT_HSIO, 0, 1); // sRtn = GTSCardAPI.GT_2DCompareStart(0, 0); // foreach (var point in pointList) // { // dataBuf[0].px = point.X - (pointList[0].X + 2000); // dataBuf[0].py = point.Y - pointList[0].Y; // do // { // t = GTSCardAPI.GT_2DCompareStatus(0, 0, out pStatus, out pCount, out pFifo, out pFifoCount, out pBufCount); // t = GTSCardAPI.GT_2DCompareData(0, 0, 1, ref dataBuf[0], pFifo);//压入数据 // } while (t != 0); // } // } // public void ChaBu(List pointList) // { // short sRtn = -1; //Googol返回值查询 // GTSCardAPI.TCrdPrm crdPrm = new GTSCardAPI.TCrdPrm(); //坐标系参数结构体 // int[] posTest = new int[2]; // GTSCardAPI.TCrdData temp = new GTSCardAPI.TCrdData();//定义前瞻缓存区大小为200段 // GTSCardAPI.TCrdData[] crdData = new GTSCardAPI.TCrdData[400]; // int size = Marshal.SizeOf(temp) * 400; // IntPtr pCrdData = Marshal.AllocHGlobal(size); // //******第一步建二维立坐标系1轴X二轴Y,使用坐标系1的FIFO0压入数据。 // crdPrm.dimension = 3; // 建立三维的坐标系 // crdPrm.synVelMax = 500; // 坐标系的最大合成速度是: 500 pulse/ms // crdPrm.synAccMax = 5; // 坐标系的最大合成加速度是: 5 pulse/ms^2 // crdPrm.evenTime = 0; // 坐标系的最小匀速时间为0 // crdPrm.profile1 = 1; // 规划器1对应到X轴 // crdPrm.profile2 = 2; // 规划器2对应到Y轴 // crdPrm.profile3 = 3; // crdPrm.profile4 = 0; // crdPrm.profile5 = 0; // crdPrm.profile6 = 0; // crdPrm.profile7 = 0; // 若profile7 = 1,规划器7对应到X轴 // crdPrm.profile8 = 0; // crdPrm.setOriginFlag = 1; // 需要设置加工坐标系原点位置 // crdPrm.originPos1 = 0; // 加工坐标系原点位置在(0,0),即与机床坐标系原点重合 // crdPrm.originPos2 = 0; // crdPrm.originPos3 = 0; // crdPrm.originPos4 = 0; // crdPrm.originPos5 = 0; // crdPrm.originPos6 = 0; // crdPrm.originPos7 = 0; // crdPrm.originPos8 = 0; // sRtn = GTSCardAPI.GT_SetCrdPrm(0, 1, ref crdPrm); //必须在轴调用停止状态下 // sRtn = GTSCardAPI.GT_CrdClear(0, 1, 0);//清除坐标系1 FIFO1中的数据缓存 // // 初始化坐标系1的FIFO0的前瞻模块 // sRtn = GTSCardAPI.GT_InitLookAhead(Parameter.cardn, //卡号 // Parameter.crdn, //坐标系 // Parameter.fifo, //FIFO // 5, //拐角时间T // 5, //accMax // 200, //数据段N // pCrdData); //结构体crdData // //*******第二步压入数据,超过4096段循环压入。 // foreach (var point in pointList) // { // //sRtn = mc.GT_LnXY(Parameter.cardn, Parameter.crdn, point.X, point.Y, Parameter.speed, Parameter.synAcc, Parameter.velEnd, Parameter.fifo); // sRtn = GTSCardAPI.GT_LnXYZ(Parameter.cardn, Parameter.crdn, point.X, point.Y, point.Z.Value, Parameter.flySpeed, Parameter.flyAcc, Parameter.velEnd, Parameter.fifo); // } // sRtn = GTSCardAPI.GT_CrdData(Parameter.cardn, Parameter.crdn, System.IntPtr.Zero, Parameter.fifo); // GTSCardAPI.GT_CrdStart(0, 1, 0); // } // public void On() // { // for (int i = 1; i <= Axisn.Count; i++) // { // GTSCardAPI.GT_AxisOn(0, (short)i); // } // } // public void Off() // { // for (int i = 1; i <= Axisn.Count; i++) // { // GTSCardAPI.GT_AxisOff(0, (short)i); // } // } // public void GoHome() // { // try // { // //清除报警 // ClearGtsAlarm(); // Task.Run(() => // { // //关闭Gocator X Y // _gts.WriteOut(Parameter.cardn, Parameter.EXO_8, false); // _gts.WriteOut(Parameter.cardn, Parameter.EXO_16, false); // ////切换Gocator的Job为长边Job // //gocatorRecord.GocatorStop(); // //gocatorRecord.SwitchJob(_product.JobLong); // //Z轴回原点,返回电机方向,待结束后再动X、Y轴,避免碰撞 // _gts.GoHome(Parameter.cardn, Axisn.Z, GTSCardAPI.HOME_MODE_LIMIT_HOME, -1, 0); // //X轴回原点,远离电机 // _gts.GoHome(Parameter.cardn, Axisn.X, GTSCardAPI.HOME_MODE_LIMIT_HOME, 1, 0); // _gts.GoHome(Parameter.cardn, Axisn.Y, GTSCardAPI.HOME_MODE_LIMIT_HOME, 1, 0); // while (true) // { // Thread.Sleep(100); // if (_gts.IsStop(0, Axisn.X) && _gts.IsStop(0, Axisn.Y) && _gts.IsStop(0, Axisn.Z) && StopType == 0) // { // //前往上料点 // GoLoading(); // PubSubCenter.GetInstance().Publish(MessageType.IsHome.ToString(), null, null); // break; // } // } // }); // } // catch (Exception ex) // { // Trace.TraceError("GoHome异常:{0}", ex); // } // } // public void GoLoading() // { // try // { // while (true) // { // if (_gts.IsStop(0, Axisn.Y)) // { // _gts.P2P(Parameter.cardn, Axisn.Y, Parameter.loading, Parameter.freeSpeed); // break; // } // } // } // catch (Exception ex) // { // Trace.TraceError("GoLoading异常:{0}", ex); // } // } // public void ClearGtsAlarm() // { // int axis_sts; // uint clk; // GTSCardAPI.GT_ClrSts(Parameter.cardn, 1, Axisn.Count); // for (short i = Axisn.Count; i > 0; i--) // { // GTSCardAPI.GT_GetSts(Parameter.cardn, i, out axis_sts, 1, out clk); // if ((axis_sts & 0x200) == 0) // { // var rst = GTSCardAPI.GT_AxisOn(0, i); // } // // 正极限报警 // if ((axis_sts & 0x20) != 0) // { // // 位置请零 // GTSCardAPI.GT_ZeroPos(Parameter.cardn, 1, Axisn.Count); // // 负向移动 // _gts.P2P(Parameter.cardn, i, -50, Parameter.homeSpeed); // } // // 负极限报警 // if ((axis_sts & 0x40) != 0) // { // // 位置请零 // GTSCardAPI.GT_ZeroPos(Parameter.cardn, 1, Axisn.Count); // // 正向移动 // _gts.P2P(Parameter.cardn, i, 50, Parameter.homeSpeed); // } // } // // 清除状态 // GTSCardAPI.GT_ClrSts(Parameter.cardn, 1, Axisn.Count); // } // public void Stop(bool value) // { // Task.Run(() => // { // try // { // _gts.Stop(Parameter.cardn, Axisn.X, value); // _gts.Stop(Parameter.cardn, Axisn.Y, value); // _gts.Stop(Parameter.cardn, Axisn.Z, value); // } // catch (Exception ex) // { // } // }); // } // public void GoToFirst(ST_Point point) // { // _gts.P2P(Parameter.cardn, Axisn.X, point.X + 2000, Parameter.p2pSpeed); // _gts.P2P(Parameter.cardn, Axisn.Y, point.Y, Parameter.p2pSpeed); // _gts.P2P(Parameter.cardn, Axisn.Z, point.Z.Value, Parameter.p2pSpeed); // while (true) // { // if (_gts.IsStop(0, Axisn.X) && _gts.IsStop(0, Axisn.Y) && _gts.IsStop(0, Axisn.Z)) break; // } // } // //public void ExistSport(int checkId, string barcode, CameraManager cameraManager, List pointList, List checkItemExistList, string path) // //{ // // cameraManager.SetExposure(Parameter.existExposure); // // cameraManager.BeginAcquisition(); // // int speed = 0; // // int i = 1; // // foreach (var point in pointList) // // { // // //四个正面光:true表示熄灭、false表示亮起 // // if (!string.IsNullOrEmpty(point.Light) && point.Light.Contains(",")) // // { // // SetLightOn(point.Light); // // } // // speed = Parameter.p2pSpeed; // // _gts.P2P(Parameter.cardn, Axisn.X, point.X, speed); // // _gts.P2P(Parameter.cardn, Axisn.Y, point.Y, speed); // // _gts.P2P(Parameter.cardn, Axisn.Z, point.Z.Value, speed); // // while (true) // // { // // if (_gts.IsStop(0, Axisn.X) && _gts.IsStop(0, Axisn.Y) && _gts.IsStop(0, Axisn.Z) && StopType == 0) break; // // } // // cameraManager.ExistCheck(checkId, barcode, checkItemExistList, i, point, path); // // CheckProcess checkProcess = i == 1 ? CheckProcess.Begin : i == pointList.Count ? CheckProcess.CheckEnd : CheckProcess.In; // // i++; // // } // // //四个正面光:true表示熄灭、false表示亮起 // // SetLightOff(); // //} // public void Monitor() // { // lastInputValue = Parameter.InDefaultValue; // Task.Factory.StartNew(() => // { // while (!cts.IsCancellationRequested) // { // try // { // Thread.Sleep(100); // //mc.GT_GetDi(Parameter.cardn, mc.MC_LIMIT_POSITIVE, out curValueIo.Limpos); // //mc.GT_GetDi(Parameter.cardn, mc.MC_LIMIT_NEGATIVE, out curValueIo.Limneg); // //mc.GT_GetDi(Parameter.cardn, mc.MC_HOME, out curValueIo.Home); // //mc.GT_GetDi(Parameter.cardn, mc.MC_ALARM, out curValueIo.Alarm); // GTSCardAPI.GT_GetDi(Parameter.cardn, GTSCardAPI.MC_GPI, out curValueIo.Input); // //mc.GT_GetDo(Parameter.cardn, mc.MC_GPO, out curValueIo.Output); // //if (_gts.IsAlarm()) // //{ // // //急停 // // _gts.Stop(Parameter.cardn, true); // // // 开启提示红灯和声音 // // AlarmLight(AlarmType.Red); // //} // if (curValueIo.Input != lastInputValue) // { // OnMessageIO(); // lastInputValue = curValueIo.Input; // } // } // catch (Exception ex) // { // Trace.TraceError("Monitor: {0}", ex.Message); // } // } // }, cts.Token); // } // //private void OnMessageIO() // //{ // // try // // { // // //根据信号执行相应动作 // // for (var i = 0; i < 16; i++) // // { // // if ((lastInputValue & (1 << i)) != (curValueIo.Input & (1 << i))) // // { // // // 有变化在发布通知 InputBitIndex-Value(0/1) // // byte v = (byte)((curValueIo.Input & (1 << i)) >> i); // // PubSubCenter.GetInstance().Publish(MessageType.MessageIO.ToString(), i, v); // // } // // } // // } // // catch (Exception ex) // // { // // Trace.TraceError("OnServerMessage: {0}", ex.Message); // // } // //} // //private void SetLightOn(string lights) // //{ // // if (lights.Contains("1")) // // { // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_9, false); // // } // // else // // { // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_9, true); // // } // // if (lights.Contains("2")) // // { // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_10, false); // // } // // else // // { // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_10, true); // // } // // if (lights.Contains("3")) // // { // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_11, false); // // } // // else // // { // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_11, true); // // } // // if (lights.Contains("4")) // // { // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_12, false); // // } // // else // // { // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_12, true); // // } // //} // //private void SetLightOff() // //{ // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_10, true); // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_9, true); // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_11, true); // // _gts.WriteOut(Parameter.cardn, Parameter.EXO_12, true); // //} // } //}