//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<ST_Point> 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<ST_Point> 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<ST_Point> pointList, List<ST_CheckItem> 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);
|
// //}
|
// }
|
//}
|