banboshi_V1/halftoneproject-master/Code/Device/SmallAxis.cs
2023-10-31 13:19:29 +08:00

219 lines
7.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Web.UI.WebControls.WebParts;
using ProductionControl.Utils;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Rebar;
namespace ProductionControl.Device
{
internal class SmallAxis
{
#region C函数
#if (!DEBUG)
const string dllName = "PMSOpticalDll.dll";
#else
const string dllName = "PMSOpticalDlld.dll";
#endif
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_OpenSocket", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr PMSOptical_OpenSocket(string ip, int nPort);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_OpenComm", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr PMSOptical_OpenComm(string comname, int nBaud);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_IsOpened", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_IsOpened(IntPtr ptr, ref bool bIsOpened);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_Close", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_Close(ref IntPtr ptr);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_GoHome", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_GoHome(IntPtr ptr);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_IsHomed", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_IsHomed(IntPtr ptr, ref bool bIsHomed);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_MoveTo", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_MoveTo(IntPtr ptr, int nPulse);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_Stop", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_Stop(IntPtr ptr);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_JogStart", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_JogStart(IntPtr ptr, int nJogSpeed);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_JogStop", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_JogStop(IntPtr ptr);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_GetPos", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_GetPos(IntPtr ptr, ref int nCurPluse);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_GetMaxPos", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_GetMaxPos(IntPtr ptr, ref int nMaxPluse);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_GetStatus", CallingConvention = CallingConvention.Cdecl)]
public static extern bool PMSOptical_GetStatus(IntPtr ptr, ref int nStatus);
[DllImport(dllName, CharSet = CharSet.Ansi, EntryPoint = "PMSOptical_WaitForOpticalFinished", CallingConvention = CallingConvention.Cdecl)]
public static extern void PMSOptical_WaitForOpticalFinished(IntPtr ptr, int nTimeOut);
#endregion
public Action<int, string> log;
public Action<int, int> PPUChangeEvent;
public Action<bool> StateChangeEvent;
/// <summary>
/// 最大倍数总的脉冲数
/// </summary>
public int MaxPPU { get; private set; }
/// <summary>
/// 是否打开设备成功
/// </summary>
public bool IsInit
{
get
{
if (pHandle == IntPtr.Zero)
return false;
bool bIsOpened = false;
PMSOptical_IsOpened(pHandle, ref bIsOpened);
return bIsOpened;
}
}
private System.Timers.Timer timer = new System.Timers.Timer();
private IntPtr pHandle;
private int prePPU;
private bool preState;
public SmallAxis(string comName,int baud)
{
pHandle = PMSOptical_OpenComm(comName, baud);
}
public void start()
{
//获取回零状态并状态栏显示
bool bIsHomed = false;
PMSOptical_IsHomed(pHandle, ref bIsHomed);
if (!bIsHomed)
{
Thread.Sleep(100);
PMSOptical_WaitForOpticalFinished(pHandle, 10000);
PMSOptical_IsHomed(pHandle, ref bIsHomed);
if (!bIsHomed)
throw new Exception("镜头电机复位失败!");
}
prePPU = 0;
preState= false;
this.getCurrPPU();
this.isMoving();
//
timer.Elapsed += Timer_Elapsed;
timer.Interval = 1000;
timer.Enabled = true;
}
public void stop()
{
if (IsInit) return;
timer.Elapsed -= Timer_Elapsed;
Thread.Sleep(200);
PMSOptical_Close(ref pHandle);
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (!IsInit) return;
getCurrPPU();
isMoving();
}
public bool home(bool await=false)
{
if (!IsInit) return false;
PMSOptical_GoHome(pHandle);
if (await)
{
PMSOptical_WaitForOpticalFinished(pHandle, 10000);
//判断是否回零并设置按钮状态
bool bIsHomed = false;
PMSOptical_IsHomed(pHandle, ref bIsHomed);
if (!bIsHomed)
return false;
getCurrPPU();
}
return true;
}
public void gotoPos(int ppu,bool await=true)
{
if (!IsInit) return;
PMSOptical_MoveTo(pHandle, ppu);
if (await)
{
PMSOptical_WaitForOpticalFinished(pHandle, 10000);
getCurrPPU();
}
}
public bool isMoving()
{
if (!IsInit)
return false;
int nStatus = 1; //注意这里建议nStatus初始化为1 //返回0为运动状态1为停止状态2为初始化失败
Thread.Sleep(20);
//获取状态并刷新界面
PMSOptical_GetStatus(pHandle, ref nStatus);
bool state = 0 == nStatus;
if (preState != state)
{
StateChangeEvent?.Invoke(state);
preState = state;
}
return state;
}
//获取最大脉冲
public int getMaxPPU()
{
if (!IsInit)
return -1;
int nMaxPos = 0;
PMSOptical_GetMaxPos(pHandle, ref nMaxPos);
return nMaxPos;
}
//获取当前脉冲
public int getCurrPPU()
{
if (!IsInit)
return -1;
int nCurPos = 0;
PMSOptical_GetPos(pHandle, ref nCurPos);
if (prePPU != nCurPos)
{
PPUChangeEvent?.Invoke(prePPU, nCurPos);
prePPU = nCurPos;
}
return nCurPos;
}
private byte[] subBuff(byte[] buff, int start, int length)
{
byte[] res = new byte[length];
for (int i = start; i < buff.Length && i < start + length; i++)
res[i - start] = buff[i];
return res;
}
}
}