ZmcauxClass.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. using cszmcaux;
  2. //using LogClass;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO.Ports;
  6. using System.Linq;
  7. using System.Runtime.InteropServices;
  8. using System.Runtime.Remoting.Contexts;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace CCDCount.DLL
  12. {
  13. public class ZmcauxClass
  14. {
  15. public IntPtr g_handle; //链接返回的句柄,可以作为卡号
  16. ConnectContext cc;
  17. public ZmcauxClass()
  18. {
  19. cc = new ConnectContext("LOCAL");
  20. //cc = new ConnectContext("PCI");
  21. }
  22. /// <summary>
  23. /// 打开轴卡
  24. /// </summary>
  25. public bool OpenZmcauxCard()
  26. {
  27. bool result = false;
  28. string Buffer;
  29. //Buffer = "PCI1";
  30. Buffer = "LOCAL1";
  31. int iresult = cc.OpenConnect(ref g_handle, Buffer);
  32. if (iresult != 0)
  33. {
  34. g_handle = (IntPtr)0;
  35. result = false;
  36. //LOG.log("轴卡连接失败");
  37. Console.WriteLine("轴卡连接失败:", iresult);
  38. //MessageBox.Show("链接失败");
  39. //this.Text = "未连接";
  40. return result;
  41. }
  42. else
  43. {
  44. result = true;
  45. //LOG.log("轴卡已连接");
  46. Console.WriteLine("轴卡已连接");
  47. return result;
  48. }
  49. }
  50. /// <summary>
  51. /// 关闭轴卡
  52. /// </summary>
  53. public void CloseZmcauxCard()
  54. {
  55. cc.CloseConnect(g_handle);
  56. g_handle = (IntPtr)0;
  57. //LOG.log("轴卡已断开");
  58. Console.WriteLine("轴卡已断开");
  59. }
  60. /// <summary>
  61. /// 设置轴卡变量
  62. /// </summary>
  63. /// <param name="varName">变量名</param>
  64. /// <param name="cmd">变量值</param>
  65. public int SetMessageTovar(string varName, float cmd)
  66. {
  67. int result = -1;
  68. if (g_handle != (IntPtr)0)
  69. {
  70. result = zmcaux.ZAux_Direct_SetUserVar(g_handle, varName, cmd);
  71. }
  72. return result;
  73. }
  74. /// <summary>
  75. /// 设置轴卡数组变量
  76. /// </summary>
  77. /// <param name="ArrayName">数组名</param>
  78. /// <param name="array">传入数组</param>
  79. /// <param name="start">传入起始点</param>
  80. /// <param name="length">传入数量</param>
  81. public void SetMessageToArray(string ArrayName, float[] array, int start, int length)
  82. {
  83. if (g_handle != (IntPtr)0)
  84. {
  85. zmcaux.ZAux_Direct_SetUserArray(g_handle, ArrayName, start, length, array);
  86. }
  87. }
  88. /// <summary>
  89. /// 读取轴卡变量
  90. /// </summary>
  91. /// <param name="ArrayName"></param>
  92. /// <param name="cmd"></param>
  93. public int GetMessageFromVar(string VarName, ref float cmd)
  94. {
  95. int result = -1;
  96. if (g_handle != (IntPtr)0)
  97. {
  98. result = zmcaux.ZAux_Direct_GetUserVar(g_handle, VarName, ref cmd);
  99. }
  100. return result;
  101. }
  102. /// <summary>
  103. /// 读取轴卡数组变量
  104. /// </summary>
  105. /// <param name="ArrayName"></param>
  106. /// <param name="array"></param>
  107. /// <param name="start"></param>
  108. /// <param name="length"></param>
  109. public void GetMessageFromArray(string ArrayName, ref float[] array, int start, int length)
  110. {
  111. if (g_handle != (IntPtr)0)
  112. {
  113. zmcaux.ZAux_Direct_GetUserArray(g_handle, ArrayName, start, length, array);
  114. }
  115. }
  116. /// <summary>
  117. /// 设置输出IO状态
  118. /// </summary>
  119. /// <param name="IOStata"></param>
  120. /// <param name="IOIndex"></param>
  121. public void SetIOState(bool IOStata, int IOIndex)
  122. {
  123. if (g_handle == (IntPtr)0)
  124. {
  125. Console.WriteLine("未链接到控制器!", "提示");
  126. return;
  127. }
  128. if (IOStata)
  129. {
  130. zmcaux.ZAux_Direct_SetOp(g_handle, IOIndex, 1);
  131. Console.WriteLine("out{0} 打开", IOIndex);
  132. }
  133. else
  134. {
  135. zmcaux.ZAux_Direct_SetOp(g_handle, IOIndex, 0);
  136. Console.WriteLine("out{0} 关闭", IOIndex);
  137. }
  138. }
  139. /// <summary>
  140. /// 设置轴类型
  141. /// </summary>
  142. /// <param name="nAxis">轴号</param>
  143. /// <param name="Atype">轴类型</param>
  144. public void SetDirectAtype(int nAxis, int Atype)
  145. {
  146. if (g_handle == (IntPtr)0)
  147. {
  148. Console.WriteLine("未链接到控制器!", "提示");
  149. return;
  150. }
  151. zmcaux.ZAux_Direct_SetAtype(g_handle, nAxis, 1);
  152. }
  153. /// <summary>
  154. /// 设置轴脉冲当量
  155. /// </summary>
  156. /// <param name="nAxis">轴号</param>
  157. /// <param name="Units">脉冲当量</param>
  158. public void SetDirectUnits(int nAxis, float Units)
  159. {
  160. if (g_handle == (IntPtr)0)
  161. {
  162. Console.WriteLine("未链接到控制器!", "提示");
  163. return;
  164. }
  165. zmcaux.ZAux_Direct_SetUnits(g_handle, nAxis, Units);
  166. }
  167. public void SetDirectLspeed(int nAxis, float Lspeed)
  168. {
  169. if (g_handle == (IntPtr)0)
  170. {
  171. Console.WriteLine("未链接到控制器!", "提示");
  172. return;
  173. }
  174. zmcaux.ZAux_Direct_SetLspeed(g_handle, nAxis, Lspeed);
  175. }
  176. /// <summary>
  177. /// 设置轴的运行速度
  178. /// </summary>
  179. /// <param name="nAxis">轴号</param>
  180. /// <param name="speed">运动速度值</param>
  181. public void SetDirectSpeed(int nAxis, float speed)
  182. {
  183. if (g_handle == (IntPtr)0)
  184. {
  185. Console.WriteLine("未链接到控制器!", "提示");
  186. return;
  187. }
  188. zmcaux.ZAux_Direct_SetSpeed(g_handle, nAxis, speed);
  189. }
  190. /// <summary>
  191. /// 设置轴加速度
  192. /// </summary>
  193. /// <param name="nAxis">轴号</param>
  194. /// <param name="accel">加速度值</param>
  195. public void SetDirectAccel(int nAxis, float accel)
  196. {
  197. if (g_handle == (IntPtr)0)
  198. {
  199. Console.WriteLine("未链接到控制器!", "提示");
  200. return;
  201. }
  202. zmcaux.ZAux_Direct_SetAccel(g_handle, nAxis, accel);
  203. }
  204. /// <summary>
  205. /// 设置轴减速度
  206. /// </summary>
  207. /// <param name="nAxis">轴号</param>
  208. /// <param name="decel">减速度值</param>
  209. public void SetDirectDecel(int nAxis, float decel)
  210. {
  211. if (g_handle == (IntPtr)0)
  212. {
  213. Console.WriteLine("未链接到控制器!", "提示");
  214. return;
  215. }
  216. zmcaux.ZAux_Direct_SetDecel(g_handle, nAxis, decel);
  217. }
  218. /// <summary>
  219. /// 设置轴S曲线加速度
  220. /// </summary>
  221. /// <param name="nAxis">轴号</param>
  222. /// <param name="Sramp">加速度值</param>
  223. public void SetDirectSramp(int nAxis, float Sramp)
  224. {
  225. if (g_handle == (IntPtr)0)
  226. {
  227. Console.WriteLine("未链接到控制器!", "提示");
  228. return;
  229. }
  230. zmcaux.ZAux_Direct_SetSramp(g_handle, nAxis, Sramp);
  231. }
  232. /// <summary>
  233. /// 轴连续运动
  234. /// </summary>
  235. /// <param name="nAxis">轴号</param>
  236. /// <param name="dir">运动方向,True为正,False为反</param>
  237. public void SetDirectSingleVmove(int nAxis, bool dir)
  238. {
  239. if (g_handle == (IntPtr)0)
  240. {
  241. Console.WriteLine("未链接到控制器!", "提示");
  242. return;
  243. }
  244. if (dir)
  245. {
  246. zmcaux.ZAux_Direct_Single_Vmove(g_handle, nAxis, 1);
  247. }
  248. else
  249. {
  250. zmcaux.ZAux_Direct_Single_Vmove(g_handle, nAxis, -1);
  251. }
  252. }
  253. /// <summary>
  254. /// 轴寸动
  255. /// </summary>
  256. /// <param name="nAxis">轴号</param>
  257. /// <param name="dir">运动方向,True为正,False为反</param>
  258. /// <param name="step">寸动距离</param>
  259. public void SetDirectSingleMove(int nAxis, bool dir, float step)
  260. {
  261. if (g_handle == (IntPtr)0)
  262. {
  263. Console.WriteLine("未链接到控制器!", "提示");
  264. return;
  265. }
  266. if (dir)
  267. {
  268. zmcaux.ZAux_Direct_Single_Move(g_handle, nAxis, step);
  269. }
  270. else
  271. {
  272. zmcaux.ZAux_Direct_Single_Move(g_handle, nAxis, -1 * step);
  273. }
  274. }
  275. /// <summary>
  276. /// 轴停止
  277. /// </summary>
  278. /// <param name="nAxis">轴号</param>
  279. public void SetDirectSingleCancel(int nAxis)
  280. {
  281. if (g_handle == (IntPtr)0)
  282. {
  283. Console.WriteLine("未链接到控制器!", "提示");
  284. return;
  285. }
  286. zmcaux.ZAux_Direct_Single_Cancel(g_handle, nAxis, 2);
  287. }
  288. }
  289. public class ConnectContext
  290. {
  291. private Connect cn = null;
  292. private int ctype = -1;
  293. public ConnectContext(string type)
  294. {
  295. switch (type)
  296. {
  297. case "网口":
  298. cn = new EthConnect();
  299. ctype = 2;
  300. break;
  301. case "串口":
  302. cn = new ComConnect();
  303. ctype = 1;
  304. break;
  305. case "PCI":
  306. cn = new PciConnect();
  307. ctype = 4;
  308. break;
  309. case "LOCAL":
  310. cn = new LocalConect();
  311. ctype = 5;
  312. break;
  313. }
  314. }
  315. public string[] ScanConnect()
  316. {
  317. return cn.scan();
  318. }
  319. public int OpenConnect(ref IntPtr g_handle, string Buffer)
  320. {
  321. if (g_handle != (IntPtr)0)
  322. {
  323. CloseConnect(g_handle);
  324. }
  325. return zmcaux.ZAux_FastOpen(ctype, Buffer, 1000, out g_handle);
  326. }
  327. public int CloseConnect(IntPtr g_handle)
  328. {
  329. return zmcaux.ZAux_Close(g_handle);
  330. }
  331. }
  332. public abstract class Connect
  333. {
  334. public abstract string[] scan();
  335. }
  336. class LocalConect : Connect
  337. {
  338. public override string[] scan()
  339. {
  340. string[] stringArray = new string[] { "LOCAL1" };
  341. return stringArray;
  342. }
  343. }
  344. class EthConnect : Connect
  345. {
  346. public override string[] scan()
  347. {
  348. int num;
  349. string[] sArray;
  350. StringBuilder buffer = new StringBuilder(10240);
  351. string buff = "";
  352. zmcaux.ZAux_SearchEthlist(buffer, 10230, 200);
  353. buff += buffer;
  354. sArray = buff.Split(' ');
  355. num = buff.Split(' ').Length;
  356. sArray = sArray.Take(num - 1).ToArray();
  357. return sArray;
  358. }
  359. }
  360. class ComConnect : Connect
  361. {
  362. public override string[] scan()
  363. {
  364. return SerialPort.GetPortNames();
  365. }
  366. }
  367. class PciConnect : Connect
  368. {
  369. public override string[] scan()
  370. {
  371. int Card;
  372. Card = zmcaux.ZAux_GetMaxPciCards();
  373. string[] tmpstr = new string[Card];
  374. for (int i = 0; i < Card; i++)
  375. {
  376. tmpstr[i] = string.Format("PCI{0:D}", i + 1);
  377. }
  378. return tmpstr;
  379. }
  380. }
  381. }