211 lines
7.5 KiB
C#
211 lines
7.5 KiB
C#
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|