SA600Meas.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. //using System.Linq;
  5. using System.Text;
  6. using System.Net;
  7. using System.Net.Sockets;
  8. using Common;
  9. //using System.Windows.Forms;
  10. namespace BeltScaleSystem
  11. {
  12. public class SA600Meas
  13. {
  14. /******************* 网络 ***********************/
  15. TcpClient tcpClient; // TCP 类
  16. string ipAddr = "192.168.185.111"; // IP 地址
  17. Int32 port = 502; // 端口
  18. bool m_alive = false; // 会话状态
  19. NetworkStream m_stream = null; // 数据流
  20. IPAddress addr = null; // 端点
  21. /******************* 可变参数 ***********************/
  22. byte[] request = new byte[100]; // 请求指令
  23. byte[] requestz = new byte[100]; // 请求指令
  24. byte[] respons = new byte[100]; // 响应结果
  25. byte[] request1 = new byte[100]; // 请求指令//202103LIAO
  26. byte[] respons1 = new byte[100]; // 响应结果//202103LIAO
  27. int msgLen = 0;
  28. int msgLen1 = 0;//202103LIAO
  29. #region <属性>
  30. public float Flow; // 瞬时流量
  31. public float Total; // 总累计量
  32. public float BeltSpeed; // 皮带速度
  33. public float FieldTemp; // 现场温度
  34. public int Progress; // 定次进度
  35. public int ProgressTime; // 定次时间
  36. public float CalibrateValue; // 校零数值
  37. //public int StdValue; // 标定数值//20210201
  38. public float StdValue; // 标定数值 //20210201
  39. public bool CalibrateFlag = false;//校零完成标志
  40. public bool MeasStatus = false;//仪表计量状态 true校秤 false计量
  41. public bool IsConnect = true;//连接状态
  42. private int connectTimes = 0;//连接次数
  43. private const int maxConnectTimes = 10;//最大连接次数
  44. private Log l = Log.GetInstance(); //日志
  45. //public
  46. /// IP地址
  47. public string IP
  48. {
  49. get{
  50. return ipAddr;
  51. }
  52. set
  53. {
  54. ipAddr = value;
  55. connect();
  56. }
  57. }
  58. #endregion
  59. #region <构造函数>
  60. public SA600Meas()
  61. {
  62. initNet();
  63. }
  64. /// <summary>
  65. /// 构造函数
  66. /// </summary>
  67. /// <param name="addr">IP 地址</param>
  68. public SA600Meas(string addr)
  69. {
  70. ipAddr = addr;
  71. initNet();
  72. //initCommand();
  73. }
  74. #endregion
  75. void SwapByte(byte[] data, int startIndex, int endIndex)
  76. {
  77. byte temp = 0x00;
  78. for (int j = startIndex; j < endIndex; j = j + 4)
  79. {
  80. for(int i = 0; i < 4; i= i+2)
  81. {
  82. temp = data[i + j];
  83. data[i + j] = data[i + j + 1];
  84. data[i + j + 1] = temp;
  85. //Swap(ref data[i + j], ref data[i + j + 1]);
  86. }
  87. }
  88. }
  89. private string Byte2String(byte[] data)
  90. {
  91. string str = "";
  92. for (int i = 0; i < data.Length; i++)
  93. {
  94. str = str + data[i].ToString("X2") + " ";
  95. }
  96. return str;
  97. }
  98. public int ReadRing()
  99. {
  100. int ret = 0;
  101. string strCmd = "00 00 00 00 00 06 01 03 03 E8 00 16";//老的,读其它的正常的
  102. // string strCmd = "00 00 00 00 00 06 01 03 00 02 00 02"; //读标定系数
  103. string[] arrayHex = strCmd.Split(' ');
  104. int i = 0;
  105. int dataLen = 0;
  106. foreach (string hex in arrayHex)
  107. {
  108. int intValue = Convert.ToInt32(hex, 16);
  109. request[i] = Convert.ToByte(intValue);
  110. i++;
  111. }
  112. msgLen = i;
  113. dataLen = request[msgLen - 1];
  114. try {
  115. m_stream.Write(request, 0, msgLen);
  116. msgLen = 9 + request[msgLen - 1] * 2;
  117. ret = m_stream.Read(respons, 0, respons.Length);
  118. IsConnect = true;
  119. connectTimes = 0;
  120. }
  121. catch (Exception ex)
  122. {
  123. if(++connectTimes > maxConnectTimes)IsConnect = false;
  124. string msg_error = ex.Message;
  125. connect();
  126. }
  127. string strHex1 = Byte2String(respons);
  128. SwapByte(respons, 9, ret);
  129. string strHex2 = Byte2String(respons);
  130. //LogHelper.WriteLogs("sa600", strHex2);
  131. int startIndex = 9;
  132. byte[] bts = new byte[4];
  133. Array.Copy(respons,startIndex,bts,0,4);
  134. BitArray bits = new BitArray(bts);
  135. MeasStatus = bits[0];//仪表计量状态
  136. CalibrateFlag = bits[3];//校秤完成状态
  137. string str = bits.Length.ToString() + " ";
  138. for (int j = 0; j < bits.Length; j++)
  139. {
  140. str += bits[j].ToString() + ",";
  141. }
  142. startIndex += 4;
  143. startIndex += 4;
  144. startIndex += 4;
  145. Flow = (float)BitConverter.ToUInt32(respons, startIndex) / 100;
  146. startIndex = startIndex + 4;
  147. Total = (float)BitConverter.ToUInt32(respons, startIndex) / 1000;
  148. startIndex = startIndex + 4;
  149. BeltSpeed = (float)BitConverter.ToUInt32(respons, startIndex) / 100;
  150. startIndex = startIndex + 4;
  151. FieldTemp = (float)BitConverter.ToUInt32(respons, startIndex) / 100 - 100;
  152. startIndex = startIndex + 4;
  153. Progress = (int)BitConverter.ToUInt32(respons, startIndex);
  154. startIndex = startIndex + 4;
  155. ProgressTime = (int)BitConverter.ToUInt32(respons, startIndex);
  156. startIndex = startIndex + 4;
  157. CalibrateValue = (float)BitConverter.ToUInt32(respons, startIndex)/100000;
  158. //startIndex = startIndex + 4; //202103LIAO
  159. //StdValue = (int)BitConverter.ToUInt32(respons, startIndex);//202103LIAO
  160. return ret;
  161. }
  162. //20210301读标定系数
  163. public int ReadRingbt()
  164. {
  165. int ret1 = 0;
  166. //string strCmd = "00 00 00 00 00 06 01 03 03 E8 00 16";//老的,读其它的正常的
  167. string strCmd = "00 00 00 00 00 06 01 03 00 02 00 02"; //读标定系数
  168. string[] arrayHex = strCmd.Split(' ');
  169. int i = 0;
  170. int dataLen = 0;
  171. foreach (string hex in arrayHex)
  172. {
  173. int intValue = Convert.ToInt32(hex, 16);
  174. request1[i] = Convert.ToByte(intValue);
  175. i++;
  176. }
  177. msgLen1 = i;
  178. dataLen = request1[msgLen1 - 1];
  179. try
  180. {
  181. m_stream.Write(request1, 0, msgLen1);
  182. //msgLen = 9 + request[msgLen - 1] * 2;
  183. if (m_stream!=null) {
  184. ret1 = m_stream.Read(respons1, 0, respons1.Length);
  185. IsConnect = true;
  186. connectTimes = 0;
  187. }
  188. }
  189. catch (Exception ex)
  190. {
  191. if (++connectTimes > maxConnectTimes) IsConnect = false;
  192. string msg_error = ex.Message;
  193. connect();
  194. }
  195. string strHex1 = Byte2String(respons1);
  196. strHex1 = strHex1.Substring(27, 5);
  197. //strHex1 ="0x"+strHex1;
  198. strHex1 = strHex1.Replace(" ", "");
  199. int xx = Convert.ToInt32(strHex1,16);
  200. StdValue = (float)xx/10000;
  201. // strHex1 = (double)BitConverter.ToUInt32(strHex1,0);
  202. //startIndex = startIndex + 4;
  203. //StdValue = (double)BitConverter.ToUInt32(respons, startIndex);
  204. return ret1;
  205. }
  206. //20210301读标定系数
  207. void InitCmdBuf()
  208. {
  209. //文件头
  210. request[0] = 0x00;
  211. request[1] = 0x00;
  212. request[2] = 0x00;
  213. request[3] = 0x00;
  214. request[4] = 0x00;
  215. request[5] = 0x0B;
  216. //地址
  217. request[6] = 0x01;
  218. //功能号
  219. request[7] = 0x10;
  220. // 起始地址
  221. request[8] = 0x00;
  222. request[9] = 0x00;
  223. //寄存器数量
  224. request[10] = 0x00;
  225. request[11] = 0x02;
  226. //数据字节数
  227. request[12] = 0x04;
  228. //数据
  229. request[13] = 0x00;
  230. request[14] = 0x00;
  231. request[15] = 0x00;
  232. request[16] = 0x00;
  233. return ;
  234. }
  235. private int WriteRing(byte[] data)
  236. {
  237. int ret = -1;
  238. try
  239. {
  240. InitCmdBuf();
  241. if (data.Length == 1)
  242. {
  243. request[14] = data[0];
  244. }
  245. else
  246. {
  247. request[13] = data[0];
  248. request[14] = data[1];
  249. }
  250. msgLen = 17;
  251. m_stream.Write(request, 0, msgLen);
  252. msgLen = 8 + request[12];
  253. ret = m_stream.Read(respons, 0, respons.Length);
  254. ret = respons[msgLen - ret];
  255. byte[] bts = new byte[4];
  256. Array.Copy(respons, 9, bts, 0, 4);
  257. BitArray bits = new BitArray(bts);
  258. MeasStatus = bits[2];//仪表计量状态
  259. }
  260. catch(Exception ex)
  261. {
  262. connect(); // 重连
  263. string msg_error = ex.Message;
  264. }
  265. return ret;
  266. }
  267. // 累计量清零
  268. public int ClearTotal()
  269. {
  270. return WriteRing(new byte[] { 0x40 });
  271. }
  272. // 开始校零操作 读校零结果调用ReadRing
  273. public int StartCalibrateZero()
  274. {
  275. return WriteRing(new byte[] { 0x04 });
  276. }
  277. // 结束校零操作
  278. public int StopCalibrateZero()
  279. {
  280. int ret = WriteRing(new byte[] { 0x08 });
  281. CalibrateFlag = false;
  282. return ret;
  283. }
  284. // 保存校零结果
  285. public int SaveCalibrateValue()
  286. {
  287. int ret = WriteRing(new byte[] { 0x01, 0x00 });
  288. CalibrateFlag = false;
  289. return ret;
  290. }
  291. // 保存标定值
  292. public int SaveBaseValue(byte[] byteArray)
  293. {
  294. // return WriteRing(byteArray);
  295. return WriteRing2(byteArray);
  296. }
  297. void InitCmdBuf2()
  298. {
  299. //0x00 0x00 0x00 0x00 0x00 0x0B 0x01 0x10 0x00 0x02 0x00 0x02 0x04 0x79 0x18 0x00 0x00
  300. //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  301. //文件头
  302. requestz[0] = 0x00;
  303. requestz[1] = 0x00;
  304. requestz[2] = 0x00;
  305. requestz[3] = 0x00;
  306. requestz[4] = 0x00;
  307. requestz[5] = 0x0B;
  308. //地址
  309. requestz[6] = 0x01;
  310. //功能号
  311. requestz[7] = 0x10;
  312. // 起始地址
  313. requestz[8] = 0x00;
  314. requestz[9] = 0x02;
  315. //寄存器数量
  316. requestz[10] = 0x00;
  317. requestz[11] = 0x02;
  318. //数据字节数
  319. requestz[12] = 0x04;
  320. //数据
  321. requestz[13] = 0x79;
  322. requestz[14] = 0x18;
  323. requestz[15] = 0x00;
  324. requestz[16] = 0x00;
  325. return;
  326. }
  327. private int WriteRing2(byte[] data)
  328. {
  329. int ret = -1;
  330. try
  331. {
  332. InitCmdBuf2();
  333. if (data.Length == 1)
  334. {
  335. requestz[14] = data[0];
  336. }
  337. else
  338. {
  339. requestz[13] = data[0];
  340. requestz[14] = data[1];
  341. }
  342. msgLen = 17;
  343. m_stream.Write(requestz, 0, msgLen);
  344. msgLen = 8 + requestz[12];
  345. ret = m_stream.Read(respons, 0, respons.Length);
  346. ret = respons[msgLen - ret];
  347. byte[] bts = new byte[4];
  348. Array.Copy(respons, 9, bts, 0, 4);
  349. BitArray bits = new BitArray(bts);
  350. MeasStatus = bits[2];//仪表计量状态
  351. }
  352. catch (Exception ex)
  353. {
  354. connect(); // 重连
  355. string msg_error = ex.Message;
  356. l.WriteLog(22, "皮带秤写物料参数" + msg_error);
  357. }
  358. return ret;
  359. }
  360. // 重置仪表
  361. public int Reset()
  362. {
  363. return WriteRing(new byte[] { 0x80});
  364. }
  365. /// <summary>
  366. /// 端口
  367. /// </summary>
  368. public Int32 Port
  369. {
  370. get
  371. {
  372. return port;
  373. }
  374. set
  375. {
  376. port = value;
  377. }
  378. }
  379. /// <summary>
  380. /// 初始化网络设置
  381. /// </summary>
  382. protected void initNet()
  383. {
  384. tcpClient = new TcpClient();
  385. port = 502;
  386. m_alive = false;
  387. addr = IPAddress.Parse(ipAddr);
  388. // thread = new Thread(sendHeart);
  389. }
  390. /// <summary>
  391. /// 连接
  392. /// </summary>
  393. /// <returns>连接状态</returns>
  394. public void connect()
  395. {
  396. try
  397. {
  398. if (m_stream != null)
  399. m_stream.Close();
  400. if (tcpClient != null)
  401. tcpClient.Close();
  402. tcpClient = new TcpClient();
  403. addr = IPAddress.Parse(ipAddr);
  404. tcpClient.Connect(addr, port);
  405. m_stream = tcpClient.GetStream();
  406. //m_stream.ReadTimeout = 1000;
  407. //m_stream.WriteTimeout = 1000;
  408. m_alive = true;
  409. }
  410. catch (Exception ex)
  411. {
  412. string error = ex.Message;
  413. m_alive = false;
  414. throw new Exception("连接仪表失败!"+ex.Message);
  415. }
  416. }
  417. // 发送指令给打印机
  418. public void sendMessage(byte[] data)
  419. {
  420. if (!alive()) throw new Exception("发送失败,请检查仪表连接!",null);
  421. //connect();
  422. try
  423. {
  424. if (alive())
  425. {
  426. m_stream.Write(data, 0, data.Length);
  427. }
  428. }
  429. catch (Exception ex)
  430. {
  431. string error = ex.Message;
  432. //m_alive = false;
  433. throw new Exception("数据发送失败"+ ex.Message); //showErrorMessage("数据发送失败!" + ex.Message);
  434. }
  435. }
  436. // 判断连接状态
  437. protected bool alive()
  438. {
  439. return m_alive;
  440. }
  441. protected void sendCommand(string strCmd)
  442. {
  443. sendMessage(Encoding.Default.GetBytes(strCmd));
  444. }
  445. }
  446. }