using cszmcaux; //using LogClass; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Runtime.InteropServices; using System.Runtime.Remoting.Contexts; using System.Text; using System.Threading.Tasks; namespace CCDCount.DLL { public class ZmcauxClass { public IntPtr g_handle; //链接返回的句柄,可以作为卡号 ConnectContext cc; public ZmcauxClass() { cc = new ConnectContext("LOCAL"); //cc = new ConnectContext("PCI"); } /// /// 打开轴卡 /// public bool OpenZmcauxCard() { bool result = false; string Buffer; //Buffer = "PCI1"; Buffer = "LOCAL1"; int iresult = cc.OpenConnect(ref g_handle, Buffer); if (iresult != 0) { g_handle = (IntPtr)0; result = false; //LOG.log("轴卡连接失败"); Console.WriteLine("轴卡连接失败:", iresult); //MessageBox.Show("链接失败"); //this.Text = "未连接"; return result; } else { result = true; //LOG.log("轴卡已连接"); Console.WriteLine("轴卡已连接"); return result; } } /// /// 关闭轴卡 /// public void CloseZmcauxCard() { cc.CloseConnect(g_handle); g_handle = (IntPtr)0; //LOG.log("轴卡已断开"); Console.WriteLine("轴卡已断开"); } /// /// 设置轴卡变量 /// /// 变量名 /// 变量值 public int SetMessageTovar(string varName, float cmd) { int result = -1; if (g_handle != (IntPtr)0) { result = zmcaux.ZAux_Direct_SetUserVar(g_handle, varName, cmd); } return result; } /// /// 设置轴卡数组变量 /// /// 数组名 /// 传入数组 /// 传入起始点 /// 传入数量 public void SetMessageToArray(string ArrayName, float[] array, int start, int length) { if (g_handle != (IntPtr)0) { zmcaux.ZAux_Direct_SetUserArray(g_handle, ArrayName, start, length, array); } } /// /// 读取轴卡变量 /// /// /// public int GetMessageFromVar(string VarName, ref float cmd) { int result = -1; if (g_handle != (IntPtr)0) { result = zmcaux.ZAux_Direct_GetUserVar(g_handle, VarName, ref cmd); } return result; } /// /// 读取轴卡数组变量 /// /// /// /// /// public void GetMessageFromArray(string ArrayName, ref float[] array, int start, int length) { if (g_handle != (IntPtr)0) { zmcaux.ZAux_Direct_GetUserArray(g_handle, ArrayName, start, length, array); } } /// /// 设置输出IO状态 /// /// /// public void SetIOState(bool IOStata, int IOIndex) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } if (IOStata) { zmcaux.ZAux_Direct_SetOp(g_handle, IOIndex, 1); Console.WriteLine("out{0} 打开", IOIndex); } else { zmcaux.ZAux_Direct_SetOp(g_handle, IOIndex, 0); Console.WriteLine("out{0} 关闭", IOIndex); } } /// /// 设置轴类型 /// /// 轴号 /// 轴类型 public void SetDirectAtype(int nAxis, int Atype) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } zmcaux.ZAux_Direct_SetAtype(g_handle, nAxis, 1); } /// /// 设置轴脉冲当量 /// /// 轴号 /// 脉冲当量 public void SetDirectUnits(int nAxis, float Units) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } zmcaux.ZAux_Direct_SetUnits(g_handle, nAxis, Units); } public void SetDirectLspeed(int nAxis, float Lspeed) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } zmcaux.ZAux_Direct_SetLspeed(g_handle, nAxis, Lspeed); } /// /// 设置轴的运行速度 /// /// 轴号 /// 运动速度值 public void SetDirectSpeed(int nAxis, float speed) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } zmcaux.ZAux_Direct_SetSpeed(g_handle, nAxis, speed); } /// /// 设置轴加速度 /// /// 轴号 /// 加速度值 public void SetDirectAccel(int nAxis, float accel) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } zmcaux.ZAux_Direct_SetAccel(g_handle, nAxis, accel); } /// /// 设置轴减速度 /// /// 轴号 /// 减速度值 public void SetDirectDecel(int nAxis, float decel) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } zmcaux.ZAux_Direct_SetDecel(g_handle, nAxis, decel); } /// /// 设置轴S曲线加速度 /// /// 轴号 /// 加速度值 public void SetDirectSramp(int nAxis, float Sramp) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } zmcaux.ZAux_Direct_SetSramp(g_handle, nAxis, Sramp); } /// /// 轴连续运动 /// /// 轴号 /// 运动方向,True为正,False为反 public void SetDirectSingleVmove(int nAxis, bool dir) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } if (dir) { zmcaux.ZAux_Direct_Single_Vmove(g_handle, nAxis, 1); } else { zmcaux.ZAux_Direct_Single_Vmove(g_handle, nAxis, -1); } } /// /// 轴寸动 /// /// 轴号 /// 运动方向,True为正,False为反 /// 寸动距离 public void SetDirectSingleMove(int nAxis, bool dir, float step) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } if (dir) { zmcaux.ZAux_Direct_Single_Move(g_handle, nAxis, step); } else { zmcaux.ZAux_Direct_Single_Move(g_handle, nAxis, -1 * step); } } /// /// 轴停止 /// /// 轴号 public void SetDirectSingleCancel(int nAxis) { if (g_handle == (IntPtr)0) { Console.WriteLine("未链接到控制器!", "提示"); return; } zmcaux.ZAux_Direct_Single_Cancel(g_handle, nAxis, 2); } } public class ConnectContext { private Connect cn = null; private int ctype = -1; public ConnectContext(string type) { switch (type) { case "网口": cn = new EthConnect(); ctype = 2; break; case "串口": cn = new ComConnect(); ctype = 1; break; case "PCI": cn = new PciConnect(); ctype = 4; break; case "LOCAL": cn = new LocalConect(); ctype = 5; break; } } public string[] ScanConnect() { return cn.scan(); } public int OpenConnect(ref IntPtr g_handle, string Buffer) { if (g_handle != (IntPtr)0) { CloseConnect(g_handle); } return zmcaux.ZAux_FastOpen(ctype, Buffer, 1000, out g_handle); } public int CloseConnect(IntPtr g_handle) { return zmcaux.ZAux_Close(g_handle); } } public abstract class Connect { public abstract string[] scan(); } class LocalConect : Connect { public override string[] scan() { string[] stringArray = new string[] { "LOCAL1" }; return stringArray; } } class EthConnect : Connect { public override string[] scan() { int num; string[] sArray; StringBuilder buffer = new StringBuilder(10240); string buff = ""; zmcaux.ZAux_SearchEthlist(buffer, 10230, 200); buff += buffer; sArray = buff.Split(' '); num = buff.Split(' ').Length; sArray = sArray.Take(num - 1).ToArray(); return sArray; } } class ComConnect : Connect { public override string[] scan() { return SerialPort.GetPortNames(); } } class PciConnect : Connect { public override string[] scan() { int Card; Card = zmcaux.ZAux_GetMaxPciCards(); string[] tmpstr = new string[Card]; for (int i = 0; i < Card; i++) { tmpstr[i] = string.Format("PCI{0:D}", i + 1); } return tmpstr; } } }