using ProductionControl.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; namespace ProductionControl.Device { public class TensionDev : IDisposable { public double TensionValue { private set; get; } public string Unit { get; private set; } public Action WarningEvent; /// /// 值<值,单位> /// public Action TensionEvent; /// /// 是否打开设备成功 /// public bool IsInit { get; private set; } = false; private System.Timers.Timer timer = new System.Timers.Timer(); private SSerialPort sSerialPort; private bool _isDebug=false; public TensionDev(bool isDebug) { _isDebug= isDebug; } public TensionDev() { } public bool start(int comNum) { try { sSerialPort = new SSerialPort("COM" + comNum, 2400, 1); IsInit = true; if (_isDebug) { timer.Elapsed += Timer_Elapsed; timer.Interval = 300; timer.Start(); } return true; } catch (Exception ex) { WarningEvent?.Invoke(WarningEnum.High, ex.Message); try { sSerialPort.close(); } catch { } return false; } } public void stop() { if (!IsInit) return; IsInit = false; if (_isDebug) { timer.Elapsed -= Timer_Elapsed; timer.Stop(); } sSerialPort.close(); } private bool reading=false; private void Timer_Elapsed(object sender, ElapsedEventArgs e) { if (!IsInit || reading) return; API.OutputDebugString($"Timer_Elapsed:{reading}"); reading = true; getValue(); reading = false; } private readonly byte[] HEAD = { 0x10,0x08,0x19 }; private readonly byte[] EOT = { 0x0D, 0x0A }; public double getValue() { try { if (!IsInit) return -1; //接收 int readTimeout = 3000; byte[] recv, data=null; IEnumerable indexList; //找HEAD do { recv = sSerialPort.getMessage(readTimeout); if (recv == null || recv.Length < 1) throw new Exception("无数据或接收超时(HEAD)!"); API.OutputDebugString($"RECV HEAD:{HexUtil.toHexString(recv)}"); //合并后的 if (data == null || data.Length < 1) data = recv; else data = HexUtil.joinByteList(new List { data, recv }); indexList = Utils.HexUtil.IndexOf(data, 0, HEAD); } while (indexList.Count() == 0); data = HexUtil.subBytes(data, (int)indexList.Last()); API.OutputDebugString($"HEAD:{HexUtil.toHexString(data)}"); //找EOT //indexList = Utils.HexUtil.IndexOf(data, 0, EOT); //while (indexList.Count() == 0) //{ // recv = comPortJDJ.getMessage(readTimeout); // if (recv == null || recv.Length < 1) // throw new Exception("无数据或接收超时(EOT)!"); // //AddTextEvent("焦度计", $"读取数据:{HexUtil.toHexString(recv)}"); // //合并后的 // data = HexUtil.joinByteList(new List { data, recv }); // indexList = Utils.HexUtil.IndexOf(data, 0, JDJ_EOT); //} //data = HexUtil.subBytes(data, 0, (int)indexList.First() + JDJ_EOT.Length); // byte长度 总报文11byte-3head=8 while (data.Length<11) { recv = sSerialPort.getMessage(readTimeout); if (recv == null || recv.Length < 1) throw new Exception("无数据或接收超时(EOT)!"); API.OutputDebugString($"RECV EOT:{HexUtil.toHexString(recv)}"); //合并后的 data = HexUtil.joinByteList(new List { data, recv }); } data = HexUtil.subBytes(data, 0, 11); API.OutputDebugString($"RECV DATA:{HexUtil.toHexString(data)}"); var buff = data; //if (buff.Length % 11 != 0) // throw new Exception("Tension数据错误!"); //if (buff.Length > 11) // buff = subBuff(buff, buff.Length - 11, 11); //if (buff[0] != 0x10) // throw new Exception("Tension数据0错误!"); int add = 0; for (int i = 1; i < 10; i++) add += (int)buff[i]; if (add != buff[10]) throw new Exception("Tension数据ADD错误!"); string unit = buff[3] == 0x10 ? "N/cm" : "Kgf/cm"; string szData = ""; int zf = 1; for (int i = 4; i <= 8; i++) { if (buff[i] == 0x0a) continue; if (buff[i] == 0x0b) zf = -1; if (buff[i] < 0x0a) szData += (int)buff[i]; } double ldNum = Convert.ToDouble(szData) * zf; if (buff[9] > 0) ldNum /= Math.Pow(10, buff[9]); // //int add = 0; //for (int i = 1; i < HEAD.Length; i++) // add += (int)HEAD[i]; //for (int i = 0; i < buff.Length-1; i++) // add += (int)buff[i]; //if (add != buff[buff.Length - 1]) // throw new Exception("Tension数据ADD错误!"); //string unit = buff[0] == 0x10 ? "N/cm" : "Kgf/cm"; //string szData = ""; //int zf = 1; //for (int i = 1; i <= 5; i++) //{ // if (buff[i] == 0x0a) continue; // if (buff[i] == 0x0b) zf = -1; // if (buff[i] < 0x0a) // szData += (int)buff[i]; //} //double ldNum = Convert.ToDouble(szData) * zf; //if (buff[6] > 0) ldNum /= Math.Pow(10, buff[6]); // TensionValue = ldNum; Unit = unit; TensionEvent?.Invoke(ldNum, unit); return ldNum; } catch (Exception ex) { API.OutputDebugString($"ERR:{ex.Message}"); WarningEvent?.Invoke(WarningEnum.Low,ex.Message); return -1; } } 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; } public void Dispose() { stop(); } } }