banboshi_V1/halftoneproject-master/Code/Device/TensionDev.cs
2023-10-31 13:19:29 +08:00

211 lines
7.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<WarningEnum, string> WarningEvent;
/// <summary>
/// 值<值,单位>
/// </summary>
public Action<double,string> TensionEvent;
/// <summary>
/// 是否打开设备成功
/// </summary>
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<long> 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<byte[]> { 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<byte[]> { 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<byte[]> { 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();
}
}
}