DioControlClass.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO.Ports;
  7. using System.Threading;
  8. using System.Windows.Forms;
  9. namespace Tps_LQ_Transmitter.com
  10. {
  11. /// <summary>
  12. /// DIO控制板与JSY电压电流模拟量采集模块 控制类。
  13. /// [DIO控制板与JSY模块都是RS485通信共用计算机的串口COM6]。
  14. /// </summary>
  15. public class DioControlClass:MySerial
  16. {
  17. SerialPort serial = null;
  18. public enum State {ON,OFF};
  19. public DioControlClass()
  20. {
  21. serial = new SerialPort();
  22. serial.PortName = "COM6"; //DIO控制板与JSY模块都是RS485通信共用计算机的串口COM6
  23. serial.BaudRate = 9600;
  24. serial.DataBits = 8;
  25. serial.StopBits = StopBits.One;//停止位设置为com_stop的值
  26. serial.Parity = Parity.None;//获取奇偶校验选项的值
  27. serial.ReadTimeout = 1000; //读取等待时间1000
  28. serial.RtsEnable = true;
  29. if (!serial.IsOpen)
  30. {
  31. serial.Open();
  32. Thread.Sleep(50);
  33. }
  34. }
  35. public override void portClose()
  36. {
  37. serial.Close();
  38. }
  39. #region DIO
  40. /// <summary>
  41. /// DIO输出控制
  42. /// </summary>
  43. /// <param name="ch">控制通道号0-16</param>
  44. /// <param name="st">控制状态ON/OFF</param>
  45. public void DioOutput(int ch, State st)
  46. {
  47. byte[] byCh = { 0x7E, 0x7E, 0x01, 0x01, 0x00, 0x01, 0x0D, 0x0A };
  48. byCh[4] = (byte)ch;
  49. if (st== State.ON)
  50. {
  51. byCh[5] = 0x01;
  52. }
  53. else
  54. {
  55. byCh[5] = 0x00;
  56. }
  57. if (serial.IsOpen==true)
  58. {
  59. serial.Write(byCh, 0, byCh.Length);
  60. Thread.Sleep(50);
  61. }
  62. }
  63. /// <summary>
  64. /// 供电开关
  65. /// </summary>
  66. /// <param name="ch">通道号(从1开始)</param>
  67. /// <param name="st">ON/off</param>
  68. public void SupplySwitch(int ch, State st)
  69. {
  70. if (ch>=1&&ch<=8)
  71. {
  72. ch = ch - 1;
  73. DioOutput(ch, st);
  74. }
  75. else
  76. {
  77. MessageBox.Show("超出通道号范围", "提示");
  78. }
  79. }
  80. /// <summary>
  81. /// 一分八射频开关控制
  82. /// </summary>
  83. /// <param name="ch"></param>
  84. /// <param name="st"></param>
  85. public void OneToEight(int ch,State st)
  86. {
  87. int chPlay = 16;
  88. switch (ch)
  89. {
  90. case 1:
  91. chPlay = 16;
  92. break;
  93. case 2:
  94. chPlay = 17;
  95. break;
  96. case 3:
  97. chPlay = 18;
  98. break;
  99. case 4:
  100. chPlay = 19;
  101. break;
  102. case 5:
  103. chPlay = 20;
  104. break;
  105. case 6:
  106. chPlay = 21;
  107. break;
  108. case 7:
  109. chPlay = 22;
  110. break;
  111. case 8:
  112. chPlay = 23;
  113. break;
  114. default:
  115. break;
  116. }
  117. for (int i = 0; i < 8; i++)
  118. {
  119. DioOutput(16+i, State.OFF);
  120. Thread.Sleep(5);
  121. }
  122. DioOutput(chPlay, st);
  123. }
  124. /// <summary>
  125. /// 一分四射频开关控制
  126. /// </summary>
  127. /// <param name="ch"></param>
  128. /// <param name="st"></param>
  129. public void OneToFour(int ch, State st)
  130. {
  131. int chPlay = 11;
  132. switch (ch)
  133. {
  134. case 1:
  135. chPlay = 11;
  136. break;
  137. case 2:
  138. chPlay = 12;
  139. break;
  140. case 3:
  141. chPlay = 13;
  142. break;
  143. case 4:
  144. chPlay = 14;
  145. break;
  146. default:
  147. break;
  148. }
  149. for (int i = 0; i < 4; i++)
  150. {
  151. DioOutput(11 + i, State.OFF);
  152. Thread.Sleep(5);
  153. }
  154. DioOutput(chPlay, st);
  155. }
  156. /// <summary>
  157. /// 仪器接入(一分四射频开关控制)
  158. /// </summary>
  159. /// <param name="str"></param>
  160. public void RfSwitchX(string str)
  161. {
  162. if (str=="功率计")
  163. {
  164. OneToFour(1,State.ON);
  165. }
  166. else if (str == "频谱仪")
  167. {
  168. OneToFour(2, State.ON);
  169. }
  170. else if (str == "解调入")
  171. {
  172. OneToFour(3, State.ON);
  173. }
  174. else
  175. {
  176. OneToFour(4, State.OFF);
  177. }
  178. }
  179. /// <summary>
  180. /// 一分二射频开关控制(多模解调模块切换)
  181. /// </summary>
  182. /// <param name="st"></param>
  183. public void OneToTwo( State st)
  184. {
  185. int chPlay = 15;
  186. DioOutput(chPlay, st);
  187. }
  188. #endregion
  189. #region JSY
  190. /// <summary>
  191. /// JSY电压电流模拟量采集查询
  192. /// </summary>
  193. /// <param name="data"></param>
  194. /// <returns>采集数据byte[]</returns>
  195. public byte[] QueryJSY(byte[] data,int delay=150)
  196. {
  197. if (data == null)
  198. return null;
  199. //先读空
  200. if (serial.BytesToRead > 0)
  201. serial.DiscardInBuffer();
  202. byte[] crc = crc16(data);
  203. byte[] newarray = new byte[data.Length + 2];
  204. Array.Copy(data, newarray, data.Length);
  205. newarray[data.Length] = crc[0];
  206. newarray[data.Length + 1] = crc[1];
  207. serial.Write(newarray, 0, newarray.Length);
  208. Thread.Sleep(delay);
  209. if (serial.BytesToRead > 0)
  210. {
  211. byte[] dat = new byte[serial.BytesToRead];
  212. serial.Read(dat, 0, dat.Length);
  213. return dat;
  214. }
  215. else
  216. {
  217. return null;
  218. }
  219. }
  220. /// <summary>
  221. /// JSY模块单通道电压(V)读取
  222. /// </summary>
  223. /// <param name="ch">通道号(从1开始)</param>
  224. /// <returns>电压值</returns>
  225. public double ReadVolt(int ch)
  226. {
  227. double volt=0;
  228. byte[] command = {0x01,0x03,0x00,0x70,0x00,0x01};
  229. byte[] rddat = new byte[7];
  230. byte[] dat = new byte[5];
  231. switch (ch)
  232. {
  233. case 1:
  234. command[3] = 0x70;
  235. break;
  236. case 2:
  237. command[3] = 0x71;
  238. break;
  239. case 3:
  240. command[3] = 0x72;
  241. break;
  242. case 4:
  243. command[3] = 0x73;
  244. break;
  245. case 5:
  246. command[3] = 0x74;
  247. break;
  248. case 6:
  249. command[3] = 0x75;
  250. break;
  251. case 7:
  252. command[3] = 0x76;
  253. break;
  254. case 8:
  255. command[3] = 0x77;
  256. break;
  257. default:
  258. command[3] = 0x70;
  259. break;
  260. }
  261. rddat = QueryJSY(command);
  262. for (int i = 0; i < 5; i++)
  263. {
  264. dat[i] = rddat[i];
  265. }
  266. byte[] crcval=crc16(dat);
  267. if (rddat[5]== crcval[0] && rddat[6] == crcval[1])
  268. {
  269. ushort dat1=(ushort)((rddat[3] << 8) + rddat[4]);
  270. volt = dat1 / 100.0;
  271. }
  272. return volt;
  273. }
  274. /// <summary>
  275. /// JSY模块8个通道电压(V)同时读取
  276. /// </summary>
  277. /// <returns>电压值数组double[]</returns>
  278. public double[] ReadAllVolt()
  279. {
  280. double[] volt = new double[8];
  281. byte[] command = { 0x01, 0x03, 0x00, 0x70, 0x00, 0x08 };
  282. byte[] rddat = new byte[21];
  283. byte[] dat = new byte[19];
  284. rddat = QueryJSY(command);
  285. for (int i = 0; i < 19; i++)
  286. {
  287. dat[i] = rddat[i];
  288. }
  289. byte[] crcval = crc16(dat);
  290. if (rddat[19] == crcval[0] && rddat[20] == crcval[1])
  291. {
  292. for (int i = 0; i < 8; i++)
  293. {
  294. ushort dat1 = (ushort)((rddat[3 + 2 * i] << 8) + rddat[4 + 2 * i]);
  295. volt[i] = dat1 / 100.0;
  296. }
  297. }
  298. return volt;
  299. }
  300. /// <summary>
  301. /// JSY模块单通道电流(A)读取
  302. /// </summary>
  303. /// <param name="ch">通道号(从1开始)</param>
  304. /// <returns>电流值</returns>
  305. public double ReadCurr(int ch)
  306. {
  307. double curr = 0;
  308. byte[] command = { 0x01, 0x03, 0x00, 0x78, 0x00, 0x01 };
  309. byte[] rddat = new byte[7];
  310. byte[] dat = new byte[5];
  311. switch (ch)
  312. {
  313. case 1:
  314. command[3] = 0x78;
  315. break;
  316. case 2:
  317. command[3] = 0x79;
  318. break;
  319. case 3:
  320. command[3] = 0x7A;
  321. break;
  322. case 4:
  323. command[3] = 0x7B;
  324. break;
  325. case 5:
  326. command[3] = 0x7C;
  327. break;
  328. case 6:
  329. command[3] = 0x7D;
  330. break;
  331. case 7:
  332. command[3] = 0x7E;
  333. break;
  334. case 8:
  335. command[3] = 0x7F;
  336. break;
  337. default:
  338. command[3] = 0x78;
  339. break;
  340. }
  341. rddat = QueryJSY(command);
  342. for (int i = 0; i < 5; i++)
  343. {
  344. dat[i] = rddat[i];
  345. }
  346. byte[] crcval = crc16(dat);
  347. if (rddat[5] == crcval[0] && rddat[6] == crcval[1])
  348. {
  349. ushort dat1 = (ushort)((rddat[3] << 8) + rddat[4]);
  350. curr = dat1 / 1000.0;
  351. }
  352. return curr;
  353. }
  354. /// <summary>
  355. /// JSY模块8个通道电流(A)同时读取
  356. /// </summary>
  357. /// <returns>电流值数组double[]</returns>
  358. public double[] ReadAllCurr()
  359. {
  360. double[] curr = new double[8];
  361. byte[] command = { 0x01, 0x03, 0x00, 0x78, 0x00, 0x08 };
  362. byte[] rddat = new byte[21];
  363. byte[] dat = new byte[19];
  364. rddat = QueryJSY(command);
  365. for (int i = 0; i < 19; i++)
  366. {
  367. dat[i] = rddat[i];
  368. }
  369. byte[] crcval = crc16(dat);
  370. if (rddat[19] == crcval[0] && rddat[20] == crcval[1])
  371. {
  372. for (int i = 0; i < 8; i++)
  373. {
  374. ushort dat1 = (ushort)((rddat[3 + 2 * i] << 8) + rddat[4 + 2 * i]);
  375. curr[i] = dat1 / 1000.0;
  376. }
  377. }
  378. return curr;
  379. }
  380. /// <summary>
  381. /// JSY模块单通道供电功率(W)读取
  382. /// </summary>
  383. /// <param name="ch">通道号</param>
  384. /// <returns>电流值</returns>
  385. public double ReadPower(int ch)
  386. {
  387. double power = 0;
  388. byte[] command = { 0x01, 0x03, 0x00, 0x80, 0x00, 0x01 };
  389. byte[] rddat = new byte[7];
  390. byte[] dat = new byte[5];
  391. switch (ch)
  392. {
  393. case 1:
  394. command[3] = 0x80;
  395. break;
  396. case 2:
  397. command[3] = 0x81;
  398. break;
  399. case 3:
  400. command[3] = 0x82;
  401. break;
  402. case 4:
  403. command[3] = 0x83;
  404. break;
  405. case 5:
  406. command[3] = 0x84;
  407. break;
  408. case 6:
  409. command[3] = 0x85;
  410. break;
  411. case 7:
  412. command[3] = 0x86;
  413. break;
  414. case 8:
  415. command[3] = 0x87;
  416. break;
  417. default:
  418. command[3] = 0x80;
  419. break;
  420. }
  421. rddat = QueryJSY(command);
  422. for (int i = 0; i < 5; i++)
  423. {
  424. dat[i] = rddat[i];
  425. }
  426. byte[] crcval = crc16(dat);
  427. if (rddat[5] == crcval[0] && rddat[6] == crcval[1])
  428. {
  429. ushort dat1 = (ushort)((rddat[3] << 8) + rddat[4]);
  430. power = dat1 / 1.0;
  431. }
  432. return power;
  433. }
  434. /// <summary>
  435. /// JSY模块8个通道的供电功率(W)同时读取
  436. /// </summary>
  437. /// <returns>电流值数组double[]</returns>
  438. public double[] ReadAllPower()
  439. {
  440. double[] power = new double[8];
  441. byte[] command = { 0x01, 0x03, 0x00, 0x80, 0x00, 0x08 };
  442. byte[] rddat = new byte[21];
  443. byte[] dat = new byte[19];
  444. rddat = QueryJSY(command);
  445. for (int i = 0; i < 19; i++)
  446. {
  447. dat[i] = rddat[i];
  448. }
  449. byte[] crcval = crc16(dat);
  450. if (rddat[19] == crcval[0] && rddat[20] == crcval[1])
  451. {
  452. for (int i = 0; i < 8; i++)
  453. {
  454. ushort dat1 = (ushort)((rddat[3 + 2 * i] << 8) + rddat[4 + 2 * i]);
  455. power[i] = dat1 / 1.0;
  456. }
  457. }
  458. return power;
  459. }
  460. #endregion
  461. }
  462. }