BMS 를 RS232 클래스에서 폴링방식 전용 클래스로 변경
BMS 정보중 현재 사용 전류와 와트를 표시함 사용전류를 통해서 충전여부를 자동 판다시키고, 해당 값은 Manual Charge 플래그에 설정함.
This commit is contained in:
@@ -9,12 +9,12 @@ using System.CodeDom;
|
||||
|
||||
namespace arDev
|
||||
{
|
||||
public class BMS : arRS232
|
||||
public class BMS : BMSSerialComm
|
||||
{
|
||||
public BMS()
|
||||
{
|
||||
|
||||
MinRecvLength = 34;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -55,28 +55,60 @@ namespace arDev
|
||||
{
|
||||
tempBuffer.Add(incomByte);
|
||||
|
||||
var queylen = QueryIndex == 0 ? 34 : 23;
|
||||
if (tempBuffer.Count == queylen)
|
||||
if (tempBuffer.Count > 7)
|
||||
{
|
||||
if (incomByte != 0x77)
|
||||
byte len = tempBuffer[3];
|
||||
if (tempBuffer.Count >= 4 + len + 3) // Start+Reg+Status+Len + Data + Chk(2) + End
|
||||
{
|
||||
//종단기호가 맞지 않다. 이자료는 폐기한다.
|
||||
var hexstr = string.Join(" ", tempBuffer.Select(t => t.ToString("X2")));
|
||||
RaiseMessage(MessageType.Error, $"discard : {hexstr}");
|
||||
tempBuffer.Clear();
|
||||
if (tempBuffer.Last() == 0x77)
|
||||
{
|
||||
//데이터가 맞게 수신됨
|
||||
LastReceiveBuffer = tempBuffer.ToArray();
|
||||
bComplete = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
//종단기호가 맞지 않다. 이자료는 폐기한다.
|
||||
var hexstr = string.Join(" ", tempBuffer.Select(t => t.ToString("X2")));
|
||||
RaiseMessage(MessageType.Error, $"discard : {hexstr}");
|
||||
tempBuffer.Clear();
|
||||
}
|
||||
findSTX = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//데이터가 맞게 수신됨
|
||||
LastReceiveBuffer = tempBuffer.ToArray();
|
||||
bComplete = true;
|
||||
}
|
||||
findSTX = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//아직 모자르므로 대기한다
|
||||
}
|
||||
|
||||
// [22 - 12 - 27 14:32:49] open: True
|
||||
//[22 - 12 - 27 14:32:49] Send: DD A5 03 00 FF FD 77 0D
|
||||
//[22 - 12 - 27 14:32:50] Send: DD A5 03 00 FF FD 77 0D
|
||||
//[22 - 12 - 27 14:32:50] Recv: 26.61v,81.4 %
|
||||
//[22 - 12 - 27 14:32:50] Recv: DD 03 00 1B 0A 65 00 00 21 63 29 04 00 00 2C 92 00 00 00 00 00 00 28 51 03 08 02 0B 69 0B 66 FC 9C 77
|
||||
//[22 - 12 - 27 14:32:50] Send: DD A5 03 00 FF FD 77 0D
|
||||
//[22 - 12 - 27 14:32:51] Recv: 26.61v,81.4 %
|
||||
//[22 - 12 - 27 14:32:51] Recv: DD 03 00 1B 0A 65 00 00 21 63 29 04 00 00 2C 92 00 00 00 00 00 00 28 51 03 08 02 0B 69 0B 66 FC 9C 77
|
||||
|
||||
|
||||
//var queylen = QueryIndex == 0 ? 34 : 23;
|
||||
//if (tempBuffer.Count == queylen)
|
||||
//{
|
||||
// if (incomByte != 0x77)
|
||||
// {
|
||||
// //종단기호가 맞지 않다. 이자료는 폐기한다.
|
||||
// var hexstr = string.Join(" ", tempBuffer.Select(t => t.ToString("X2")));
|
||||
// RaiseMessage(MessageType.Error, $"discard : {hexstr}");
|
||||
// tempBuffer.Clear();
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //데이터가 맞게 수신됨
|
||||
// LastReceiveBuffer = tempBuffer.ToArray();
|
||||
// bComplete = true;
|
||||
// }
|
||||
// findSTX = false;
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// //아직 모자르므로 대기한다
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -106,7 +138,7 @@ namespace arDev
|
||||
else
|
||||
{
|
||||
var rxstr = string.Join(" ", data.Select(t => t.ToString("X2")));
|
||||
RaiseMessage(MessageType.Recv, $"Querh:{QueryIndex},Data:{rxstr}");
|
||||
RaiseMessage(MessageType.Recv, rxstr);
|
||||
}
|
||||
|
||||
if (QueryIndex == 0)
|
||||
@@ -231,98 +263,65 @@ namespace arDev
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private bool _autocharge = false;
|
||||
public Boolean AutoCharge
|
||||
{
|
||||
get { return _autocharge; }
|
||||
set { _autocharge = false; }
|
||||
}
|
||||
|
||||
//public void ClearManualChargeCheckValue()
|
||||
//{
|
||||
// chk_timee = new DateTime(1982, 11, 23);
|
||||
// chk_times = new DateTime(1982, 11, 23);
|
||||
// chk_valuee = 0f;
|
||||
// chk_values = 0f;
|
||||
//}
|
||||
|
||||
/// <summary>
|
||||
/// 현재 충전중인지?
|
||||
/// </summary>
|
||||
public bool IsCharging { get; private set; }
|
||||
DateTime ChargeStart = DateTime.Now;
|
||||
DateTime ChargeEnd = DateTime.Now;
|
||||
void CheckManualCharge()
|
||||
{
|
||||
if (AutoCharge)
|
||||
//충방전전력이 1보다 크면 충전으로 한다.
|
||||
if (Charge_Amp > 0.1)
|
||||
{
|
||||
if (chk_timee.Year != 1982)
|
||||
//기존에 충전상태가 OFF였다면 충전중으로 알려준다
|
||||
if (IsCharging == false)
|
||||
{
|
||||
chk_timee = new DateTime(1982, 11, 23);
|
||||
chk_valuee = 999f;
|
||||
IsCharging = true;
|
||||
ChargeStart = DateTime.Now;
|
||||
ChargeEnd = new DateTime(1982, 11, 23);
|
||||
try
|
||||
{
|
||||
ChargeDetect?.Invoke(this, new ChargetDetectArgs(ChargeStart, true, Current_Level));
|
||||
}
|
||||
catch (Exception ex) { RaiseMessage(MessageType.Error, ex.Message); }
|
||||
}
|
||||
if (chk_times.Year != 1982)
|
||||
else
|
||||
{
|
||||
chk_times = new DateTime(1982, 11, 23);
|
||||
chk_values = 999f;
|
||||
//충전상태가 유지되고 있다.
|
||||
}
|
||||
}
|
||||
if (chk_times.Year == 1982)
|
||||
{
|
||||
chk_times = DateTime.Now;
|
||||
chk_values = Current_Level;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (chk_timee.Year == 1982)
|
||||
//충전이해제되었다.. 단 바로 해제하지않고 1초정도 텀을 주고 OFF한다.
|
||||
if (IsCharging)
|
||||
{
|
||||
if ((Current_Level - chk_values) >= 0.1)
|
||||
if (ChargeEnd.Year == 1982)
|
||||
{
|
||||
//충전중이다
|
||||
chk_timee = DateTime.Now;
|
||||
chk_valuee = Current_Level;
|
||||
try
|
||||
{
|
||||
ChargeDetect?.Invoke(this, new ChargetDetectArgs(chk_times, chk_values, chk_timee, chk_valuee));
|
||||
}
|
||||
catch (Exception ex) { RaiseMessage(MessageType.Error, ex.Message); }
|
||||
|
||||
}
|
||||
else if ((Current_Level - chk_values) <= -0.1)
|
||||
{
|
||||
//방전중이다
|
||||
if (chk_times.Year != 1982) chk_times = new DateTime(1982, 11, 23);
|
||||
if (chk_timee.Year != 1982) chk_timee = new DateTime(1982, 11, 23);
|
||||
ChargeEnd = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
//아직 변화가 없으니 종료일을 기록하지 않는다
|
||||
var ts = DateTime.Now - ChargeEnd;
|
||||
if (ts.TotalSeconds > 2) //충전종료시그널후 2초후에 충전off를 알린다.
|
||||
{
|
||||
ChargeEnd = DateTime.Now;
|
||||
IsCharging = false;
|
||||
try
|
||||
{
|
||||
ChargeDetect?.Invoke(this, new ChargetDetectArgs(ChargeEnd, false, Current_Level));
|
||||
}
|
||||
catch (Exception ex) { RaiseMessage(MessageType.Error, ex.Message); }
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//이미 종료일이 셋팅된 상태이다
|
||||
if ((Current_Level - chk_valuee) >= 0.1)
|
||||
{
|
||||
//종료시간을 시작값에 넣는다
|
||||
chk_times = chk_timee;
|
||||
chk_values = chk_valuee;
|
||||
|
||||
chk_timee = DateTime.Now;
|
||||
chk_valuee = Current_Level;
|
||||
try
|
||||
{
|
||||
ChargeDetect?.Invoke(this, new ChargetDetectArgs(chk_times, chk_values, chk_timee, chk_valuee));
|
||||
}
|
||||
catch (Exception ex) { RaiseMessage(MessageType.Error, ex.Message); }
|
||||
}
|
||||
else if ((Current_Level - chk_valuee) <= -0.1)
|
||||
{
|
||||
//방전중이다
|
||||
if (chk_times.Year != 1982) chk_times = new DateTime(1982, 11, 23);
|
||||
if (chk_timee.Year != 1982) chk_timee = new DateTime(1982, 11, 23);
|
||||
}
|
||||
else
|
||||
{
|
||||
//아직 변화가 없으니 종료일을 기록하지 않는다
|
||||
}
|
||||
//방전상태가 유지되고 있다.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public DateTime chk_times { get; set; } = new DateTime(1982, 11, 23);
|
||||
@@ -335,7 +334,7 @@ namespace arDev
|
||||
{
|
||||
get
|
||||
{
|
||||
return (Int16)((Charge_Amp ) * Current_Volt);
|
||||
return (Int16)((Charge_Amp) * Current_Volt);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
@@ -421,6 +420,7 @@ namespace arDev
|
||||
cmd.Add(0xFD);
|
||||
cmd.Add(0x77);
|
||||
//cmd.Add(0x0D);
|
||||
//_device.DiscardInBuffer();
|
||||
return WriteData(cmd.ToArray());
|
||||
}
|
||||
|
||||
@@ -437,6 +437,7 @@ namespace arDev
|
||||
cmd.Add(0xFC);
|
||||
cmd.Add(0x77);
|
||||
//cmd.Add(0x0D);
|
||||
//_device.DiscardInBuffer();
|
||||
return WriteData(cmd.ToArray());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user