| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- 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
- {
- /// <summary>
- /// C++ DLL结构体对应C#版本
- /// </summary>
- [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);
- // 存储回调引用以防止垃圾回收
- /// <summary>
- /// Feeder动作执行结果回调
- /// </summary>
- 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#代码传递回调数据
- /// <summary>
- /// 设置振动参数并执行动作后的回调事件
- /// </summary>
- public event Action<ST_APAFedColC> OnExecuteFeedervibration;
- /// <summary>
- /// 相机拍照获取物料位置回调事件
- /// </summary>
- /// <returns></returns>
- public delegate Tuple<bool, float, float> ExecutePhotoDelegate();
- public event ExecutePhotoDelegate OnExecutePhoto;
- /// <summary>
- /// 逻辑调整结束回调事件,0 :失败 1:运行中 3:完成调频 6:验证结束
- /// </summary>
- public event Action<int> OnExecuteResult;
- /// <summary>
- /// 初始化振动检测器
- /// </summary>
- /// <param name="fedType">Feeder类型</param>
- /// <param name="enAct">动作编号</param>
- /// <returns>初始化结果</returns>
- 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表示成功
- }
- /// <summary>
- /// 启动振动检测任务
- /// </summary>
- /// <returns>任务启动结果</returns>
- public bool StartTask()
- {
- int result = APATask();
- return result == 0; // 假设0表示成功
- }
- /// <summary>
- /// 设置逻辑参数
- /// </summary>
- /// <param name="minAmplitude">最小振幅</param>
- /// <param name="maxAmplitude">最大振幅</param>
- /// <param name="minFrequency">最小频率</param>
- /// <param name="maxFrequency">最大频率</param>
- /// <returns>设置结果</returns>
- 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表示成功
- }
- /// <summary>
- /// 获取逻辑参数
- /// </summary>
- /// <param name="minAmplitude">最小振幅</param>
- /// <param name="maxAmplitude">最大振幅</param>
- /// <param name="minFrequency">最小频率</param>
- /// <param name="maxFrequency">最大频率</param>
- /// <returns>获取结果</returns>
- public ST_APAParamRe GetLogicParameters()
- {
- ST_APAParamRe result = APALogicParamRe();
- return result;
- }
- /// <summary>
- /// 设置逻辑状态,0:停止 1 :启动 2:验证 3:结束
- /// </summary>
- /// <param name="state">状态值</param>
- /// <returns>设置结果</returns>
- public bool SetLogicState(int state)
- {
- int result = APALogicStaCol(state);
- return result == 0; // 假设0表示成功
- }
- /// <summary>
- /// 释放资源
- /// </summary>
- 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
- };
- }
- }
- }
|