This repository has been archived on 2024-01-02. You can view files and clone it, but cannot push or open issues or pull requests.
Sic06/FrameworkLocal/RTEquipmentLibrary/HardwareUnits/Vacuometer/VacuometerConnection.cs

174 lines
5.5 KiB
C#

using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using MECF.Framework.Common.Communications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Vacuometer
{
public class VacuometerMessage : BinaryMessage
{
public byte DeviceAddress { get; set; }
public byte FunctionCode { get; set; }
public byte Length { get; set; }
public byte[] Data { get; set; }
}
class VacuometerConnection : SerialPortConnectionBase
{
private List<byte> _lstCacheBuffer = new List<byte>();
public VacuometerConnection(string portName) : base(portName, 9600, 8, System.IO.Ports.Parity.None, System.IO.Ports.StopBits.One, "\n", false)
{
}
public override bool SendMessage(byte[] message)
{
_lstCacheBuffer.Clear();
return base.SendMessage(message);
}
protected override MessageBase ParseResponse(byte[] rawMessage)
{
_lstCacheBuffer.Clear();
_lstCacheBuffer.AddRange(rawMessage);
byte[] temps = _lstCacheBuffer.ToArray();
// EV.PostInfoLog("VCE","ARR1");
VacuometerMessage msg = new VacuometerMessage();
msg.IsResponse = false;
msg.IsAck = false;
msg.IsComplete = false;
msg.RawMessage = _lstCacheBuffer.ToArray();
if (temps.Length > 9)
{
for(int i= 0;i < temps.Length;i++)
{
if (i + 3 < temps.Length)
{
if (temps[i] == 0x07 && temps[i + 1] == 0x02 && temps[i + 2] == 0x10 && temps[i + 3] == 0x01)
{
temps = temps.Skip(i).Take(9).ToArray();//.Skip(9).ToArray();
break;
}
}
}
}
if(temps.Length<9) return msg;
if (temps[0] != 0x7) return msg;
if(temps[8]!= CheckSum(temps)) return msg;
//msg.DeviceAddress = temps[0];
//msg.FunctionCode = temps[1];
//msg.Length = temps[2];
// if (temps.Length < msg.Length + 5) return msg;
msg.Data = temps; //_lstCacheBuffer.ToArray(); //_lstCacheBuffer.Skip(3).Take(msg.Length).ToArray();
msg.IsResponse = true;
msg.IsAck = true;
msg.IsComplete = true;
return msg;
}
public byte CheckSum(byte[] buffer)
{
int Sum = 0;
var arry = buffer.ToList().Skip(1).Take(7).ToArray();
foreach (var data in arry)
{
Sum += data;
}
return Convert.ToByte(Sum & 0xff);
}
}
public abstract class VacuometerHandler : HandlerBase
{
public Vacuometer Device { get; }
protected VacuometerHandler(Vacuometer device, byte[] commandvalue)
: base(BuildMessage(commandvalue))
{
Device = device;
}
private static byte[] BuildMessage(byte[] commandvalue)
{
if (commandvalue == null) return null;
byte[] crc = ModRTU_CRC(commandvalue);
List<byte> result = commandvalue.ToList();
foreach (byte b in crc)
{
result.Add(b);
}
return result.ToArray();
}
public override bool HandleMessage(MessageBase msg, out bool handled)
{
var result = msg as VacuometerMessage;
ResponseMessage = msg;
handled = true;
return true;
}
private static byte[] ModRTU_CRC(byte[] buffer)
{
ushort crc = 0xFFFF;
// var buf = System.Text.Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, buffer));
var buf = buffer;
var len = buffer.Length;
for (var pos = 0; pos < len; pos++)
{
crc ^= buf[pos]; // XOR byte into least sig. byte of crc
for (var i = 8; i != 0; i--)
// Loop over each bit
if ((crc & 0x0001) != 0)
{
// If the LSB is set
crc >>= 1; // Shift right and XOR 0xA001
crc ^= 0xA001;
}
else // Else LSB is not set
{
crc >>= 1; // Just shift right
}
}
// Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
return BitConverter.GetBytes(crc);
}
}
public class VacuometerReciveHandler : VacuometerHandler
{
public VacuometerReciveHandler(Vacuometer device, string name)
: base(device,null)
{
Name = name;//"Query Temp";
}
public override bool HandleMessage(MessageBase msg, out bool handled)
{
var result = msg as VacuometerMessage;
handled = false;
if (!result.IsResponse) return true;
Device.ReadData(result.Data);
ResponseMessage = msg;
SetState(EnumHandlerState.Acked);
handled = true;
Thread.Sleep(10);
//EV.PostInfoLog("VCE", "ARR2");
return true;
}
}
}