using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace Team.FFFeederService { public class VibrationFrequencyDetector : IDisposable { /// /// C++ DLL结构体对应C#版本 /// [StructLayout(LayoutKind.Sequential)] public struct ST_APAFedColC { public int inFedAct; public UInt16 u16VoiMot0; public UInt16 u16VoiMot1; public UInt16 u16VoiMot2; public UInt16 u16VoiMot3; public UInt16 u16VoiMot4; public UInt16 u16VoiMot5; public UInt16 u16VoiMot6; public UInt16 u16VoiMot7; public UInt16 u16VoiMot8; public UInt16 u16VoiMot9; public UInt16 u16VoiMotA; public UInt16 u16VoiMotB; public UInt16 u16VoiMotC; public UInt16 u16VoiMotD; public UInt16 u16VoiMotE; public UInt16 u16VoiMotF; public UInt16 u16DuartTim; } [StructLayout(LayoutKind.Sequential)] public struct ST_APAMateInf { public float fMatePosX; public float fMatePosY; public int Sta; } [StructLayout(LayoutKind.Sequential)] public struct ST_APAParamRe { public int Sta; public UInt16 u16MinAmp; public UInt16 u16MaxAmp; public UInt16 u16MinFre; public UInt16 u16MaxFre; public UInt16 u16Tim; } // 委托定义 - 对应C++回调函数 public delegate int APAFedColCallback(ST_APAFedColC stFecColC); public delegate ST_APAMateInf APACoordReCallback(); public delegate int APALogicAdjEndCallback(int enAdjSta); // 存储回调引用以防止垃圾回收 /// /// Feeder动作执行结果回调 /// private APAFedColCallback _fedColCallback; private APACoordReCallback _coordReCallback; private APALogicAdjEndCallback _logicAdjEndCallback; // DLL导入 private const string DllName = "AutoParaADJ.dll"; [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] private static extern int APATask(); [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] private static extern int APAInit( APACoordReCallback VisCoor_cb, APAFedColCallback FedCol_cb, APALogicAdjEndCallback LogEnd_cb, int FedType, int enAct); [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] private static extern int APALogicStaCol(int Sta); [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] private static extern int APALogicParamSet( ushort u16MinAmp, ushort u16MaxAmp, ushort u16MinFre, ushort u16MaxFre, ushort u16Tim); [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] private static extern ST_APAParamRe APALogicParamRe(); // 事件 - 用于向C#代码传递回调数据 /// /// 设置振动参数并执行动作后的回调事件 /// public event Action OnExecuteFeedervibration; /// /// 相机拍照获取物料位置回调事件 /// /// public delegate Tuple ExecutePhotoDelegate(); public event ExecutePhotoDelegate OnExecutePhoto; /// /// 逻辑调整结束回调事件,0 :失败 1:运行中 3:完成调频 6:验证结束 /// public event Action OnExecuteResult; /// /// 初始化振动检测器 /// /// Feeder类型 /// 动作编号 /// 初始化结果 public bool Initialize(int fedType, int enAct) { // 创建并保存回调委托实例 _coordReCallback = onExecutePhoto; _fedColCallback = (ST_APAFedColC stFecColC) => { OnExecuteFeedervibration?.Invoke(stFecColC); return 1; // 返回成功 }; _logicAdjEndCallback = (int enAdjSta) => { OnExecuteResult?.Invoke(enAdjSta); return 1; // 返回成功 }; // 调用DLL初始化函数 int result = APAInit(_coordReCallback, _fedColCallback, _logicAdjEndCallback, fedType, enAct); return result == 1; // 假设0表示成功 } /// /// 启动振动检测任务 /// /// 任务启动结果 public bool StartTask() { int result = APATask(); return result == 0; // 假设0表示成功 } /// /// 设置逻辑参数 /// /// 最小振幅 /// 最大振幅 /// 最小频率 /// 最大频率 /// 设置结果 public bool SetLogicParameters(ushort minAmplitude, ushort maxAmplitude, ushort minFrequency, ushort maxFrequency, ushort durationValue) { int result = APALogicParamSet(minAmplitude, maxAmplitude, minFrequency, maxFrequency, durationValue); return result == 0; // 假设0表示成功 } /// /// 获取逻辑参数 /// /// 最小振幅 /// 最大振幅 /// 最小频率 /// 最大频率 /// 获取结果 public ST_APAParamRe GetLogicParameters() { ST_APAParamRe result = APALogicParamRe(); return result; } /// /// 设置逻辑状态,0:停止 1 :启动 2:验证 3:结束 /// /// 状态值 /// 设置结果 public bool SetLogicState(int state) { int result = APALogicStaCol(state); return result == 0; // 假设0表示成功 } /// /// 释放资源 /// public void Dispose() { // 清理回调引用 _fedColCallback = null; _coordReCallback = null; _logicAdjEndCallback = null; // 其他清理工作... } private ST_APAMateInf onExecutePhoto() { var res = OnExecutePhoto?.Invoke(); return new ST_APAMateInf { fMatePosX = res.Item2, fMatePosY = res.Item3, Sta = res.Item1 ? 1 : 0 }; } } }