diff --git a/Cs_HMI/AGVCSharp.sln b/Cs_HMI/AGVCSharp.sln
index 249c9b9..354b1e3 100644
--- a/Cs_HMI/AGVCSharp.sln
+++ b/Cs_HMI/AGVCSharp.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Express 15 for Windows Desktop
-VisualStudioVersion = 15.0.36324.19
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.36310.24
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sub", "Sub", "{C423C39A-44E7-4F09-B2F7-7943975FF948}"
EndProject
@@ -9,8 +9,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StateMachine", "StateMachin
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "agvControl", "SubProject\AGVControl\agvControl.csproj", "{8CB883C0-99C3-4DD4-B017-F9B92010A806}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BMS", "SubProject\BMS\BMS.csproj", "{7A94C30C-6772-4F71-BF9C-0DF071A1BC70}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SWPatch", "SubProject\Patch\SWPatch.csproj", "{37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NARUMI", "SubProject\AGV\NARUMI.csproj", "{8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}"
@@ -38,6 +36,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGVMapEditor", "AGVLogic\AG
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGVSimulator", "AGVLogic\AGVSimulator\AGVSimulator.csproj", "{B2C3D4E5-0000-0000-0000-000000000000}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{C8D5274F-AC00-46C7-1F8D-E88E81087A52}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_BMS", "TestProject\Test_BMS\Test_BMS.csproj", "{CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -72,18 +74,6 @@ Global
{8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|x64.Build.0 = Release|Any CPU
{8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|x86.ActiveCfg = Release|Any CPU
{8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|x86.Build.0 = Release|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x64.Build.0 = Debug|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x86.Build.0 = Debug|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|Any CPU.Build.0 = Release|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|x64.ActiveCfg = Release|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|x64.Build.0 = Release|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|x86.ActiveCfg = Release|Any CPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|x86.Build.0 = Release|Any CPU
{37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -180,19 +170,31 @@ Global
{B2C3D4E5-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU
{B2C3D4E5-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU
{B2C3D4E5-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x64.Build.0 = Debug|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x86.Build.0 = Debug|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x64.ActiveCfg = Release|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x64.Build.0 = Release|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x86.ActiveCfg = Release|Any CPU
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{8CB883C0-99C3-4DD4-B017-F9B92010A806} = {C423C39A-44E7-4F09-B2F7-7943975FF948}
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70} = {C423C39A-44E7-4F09-B2F7-7943975FF948}
{8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7} = {C423C39A-44E7-4F09-B2F7-7943975FF948}
{14E8C9A5-013E-49BA-B435-EFEFC77DD623} = {C423C39A-44E7-4F09-B2F7-7943975FF948}
{9365803B-933D-4237-93C7-B502C855A71C} = {C423C39A-44E7-4F09-B2F7-7943975FF948}
{C5F7A8B2-8D3E-4A1B-9C6E-7F4D5E2A9B1C} = {E5C75D32-5AD6-44DD-8F27-E32023206EBB}
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890} = {E5C75D32-5AD6-44DD-8F27-E32023206EBB}
{B2C3D4E5-0000-0000-0000-000000000000} = {E5C75D32-5AD6-44DD-8F27-E32023206EBB}
+ {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E} = {C8D5274F-AC00-46C7-1F8D-E88E81087A52}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B5B1FD72-356F-4840-83E8-B070AC21C8D9}
diff --git a/Cs_HMI/Project/AGV4.csproj b/Cs_HMI/Project/AGV4.csproj
index 212b142..08abccd 100644
--- a/Cs_HMI/Project/AGV4.csproj
+++ b/Cs_HMI/Project/AGV4.csproj
@@ -184,6 +184,8 @@
True
DataSet1.xsd
+
+
@@ -545,10 +547,6 @@
{8bae0eac-3d25-402f-9a65-2ba1ecfe28b7}
NARUMI
-
- {7a94c30c-6772-4f71-bf9c-0df071a1bc70}
- BMS
-
{14e8c9a5-013e-49ba-b435-efefc77dd623}
CommData
diff --git a/Cs_HMI/SubProject/BMS/BMS.cs b/Cs_HMI/Project/Device/BMS.cs
similarity index 97%
rename from Cs_HMI/SubProject/BMS/BMS.cs
rename to Cs_HMI/Project/Device/BMS.cs
index 0305002..921d3fc 100644
--- a/Cs_HMI/SubProject/BMS/BMS.cs
+++ b/Cs_HMI/Project/Device/BMS.cs
@@ -1,424 +1,426 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.ComponentModel;
-using System.Threading;
-using System.Threading.Tasks;
-using System.CodeDom;
-
-namespace arDev
-{
- public class BMS : arRS232
- {
- public BMS()
- {
-
- MinRecvLength = 34;
- }
-
- ///
- /// 시리얼포트의 핀 상태값이 변경될 때 발생합니다.
- ///
- public event EventHandler BMSDataReceive;
- public event EventHandler BMSCellDataReceive;
-
- protected override bool CustomParser(byte[] buf, out byte[] remainBuffer)
- {
- List remain = new List();
-
- //데이터는 총 34byt 이며 , DD~77로 구성됨
- Boolean bComplete = false;
- for (int i = 0; i < buf.Length; i++)
- {
- var incomByte = buf[i];
- if (bComplete == true)
- {
- remain.Add(incomByte);
- }
- else
- {
- if (findSTX == false)
- {
- if (incomByte != 0xDD)
- {
- //버리는데이터
- }
- else
- {
- findSTX = true;
- tempBuffer.Clear();
- tempBuffer.Add(incomByte);
- }
- }
- else
- {
- tempBuffer.Add(incomByte);
-
- var queylen = QueryIndex == 0 ? 34 : 23;
- if (tempBuffer.Count == queylen)
- {
- if (incomByte != 0x77)
- {
- //종단기호가 맞지 않다. 이자료는 폐기한다.
- tempBuffer.Clear();
- }
- else
- {
- //데이터가 맞게 수신됨
- LastReceiveBuffer = tempBuffer.ToArray();
- bComplete = true;
- }
- findSTX = false;
- }
- else
- {
- //아직 모자르므로 대기한다
- }
- }
- }
- }
-
- remainBuffer = remain.ToArray();
- return bComplete;
- }
-
- bool Recv0 = false;
- bool Recv1 = false;
- public event EventHandler ChargeDetect;
- public override bool ProcessRecvData(byte[] data)
- {
- //LastReceiveBuffer
- if (data == null)
- {
- RaiseMessage(MessageType.Error, "수신 데이터가 없습니다");
- return false;
- }
-
- var datalne = QueryIndex == 0 ? 34 : 23;
- if (data.Length != datalne)
- {
- RaiseMessage(MessageType.Error, $"데이터의 길이가 {MinRecvLength}가 아닙니다 길이={data.Length}");
- return false;
- }
-
- if (QueryIndex == 0)
- {
- return ParseBMSInfo();
- }
- else
- {
- return ParseBMSCellVoltage();
- }
-
-
- }
- bool ParseBMSCellVoltage()
- {
- //var i = 0;
- var BatteryCell_Checksum = 0xffff;// - (LastReceiveBuffer[i + 3] + LastReceiveBuffer[i + 4] + LastReceiveBuffer[i + 5] + LastReceiveBuffer[i + 6] + LastReceiveBuffer[i + 7] + LastReceiveBuffer[i + 8] + LastReceiveBuffer[i + 9] + LastReceiveBuffer[i + 10] + LastReceiveBuffer[i + 11] + LastReceiveBuffer[i + 12] + LastReceiveBuffer[i + 13] + LastReceiveBuffer[i + 14] + LastReceiveBuffer[i + 15] + LastReceiveBuffer[i + 16] + LastReceiveBuffer[i + 17] + LastReceiveBuffer[i + 18] + LastReceiveBuffer[i + 19])) + 1;
- for (int i = 3; i < 20; i++)
- {
- BatteryCell_Checksum -= LastReceiveBuffer[i];// + LastReceiveBuffer[i + 4] + LastReceiveBuffer[i + 5] + LastReceiveBuffer[i + 6] + LastReceiveBuffer[i + 7] + LastReceiveBuffer[i + 8] + LastReceiveBuffer[i + 9] + LastReceiveBuffer[i + 10] + LastReceiveBuffer[i + 11] + LastReceiveBuffer[i + 12] + LastReceiveBuffer[i + 13] + LastReceiveBuffer[i + 14] + LastReceiveBuffer[i + 15] + LastReceiveBuffer[i + 16] + LastReceiveBuffer[i + 17] + LastReceiveBuffer[i + 18] + LastReceiveBuffer[i + 19])) + 1;
- }
-
- BatteryCell_Checksum += 1;
- var recvchecksum = BitConverter.ToUInt16(LastReceiveBuffer.Skip(20).Take(2).Reverse().ToArray(), 0);
- if (recvchecksum == BatteryCell_Checksum)
- {
- var v1 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(4).Take(2).Reverse().ToArray(), 0) / 1000.0;
- var v2 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(6).Take(2).Reverse().ToArray(), 0) / 1000.0;
- var v3 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(8).Take(2).Reverse().ToArray(), 0) / 1000.0;
- var v4 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(10).Take(2).Reverse().ToArray(), 0) / 1000.0;
- var v5 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(12).Take(2).Reverse().ToArray(), 0) / 1000.0;
- var v6 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(14).Take(2).Reverse().ToArray(), 0) / 1000.0;
- var v7 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(16).Take(2).Reverse().ToArray(), 0) / 1000.0;
- var v8 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(18).Take(2).Reverse().ToArray(), 0) / 1000.0;
-
- var idx = 0;
- CellVoltage[idx++] = v1;
- CellVoltage[idx++] = v2;
- CellVoltage[idx++] = v3;
- CellVoltage[idx++] = v4;
- CellVoltage[idx++] = v5;
- CellVoltage[idx++] = v6;
- CellVoltage[idx++] = v7;
- CellVoltage[idx++] = v8;
-
- Recv1 = true;
-
- try
- {
- BMSCellDataReceive?.Invoke(this, new BMSCelvoltageEventArgs(v1, v2, v3, v4, v5, v6, v7, v8));
- Current_CellTime = DateTime.Now;
- return true;
- }
- catch (Exception ex)
- {
- RaiseMessage(MessageType.Error, ex.Message);
- return false;
- }
- }
- else return false;
-
-
- }
- bool ParseBMSInfo()
- {
- //전압확인
- UInt16 batH = (UInt16)LastReceiveBuffer[4];
- UInt16 batL = (UInt16)LastReceiveBuffer[5];
- batH = (UInt16)(batH << 8);
- batH = (UInt16)(batH | batL);
- Current_Volt = (float)(batH / 100.0);
-
- //잔량확인
- batH = (UInt16)LastReceiveBuffer[8];
- batL = (UInt16)LastReceiveBuffer[9];
- batH = (UInt16)(batH << 8);
- batH = (UInt16)(batH | batL);
- var newamp = (int)batH;
- var Changed = newamp != Current_Amp;
- Current_Amp = newamp;
-
- //총량확인
- batH = (UInt16)LastReceiveBuffer[10];
- batL = (UInt16)LastReceiveBuffer[11];
- batH = (UInt16)(batH << 8);
- batH = (UInt16)(batH | batL);
- Current_MaxAmp = (int)batH;
-
- //남은 % 계산
- float levraw = (float)(Current_Amp / (Current_MaxAmp * 1.0));
- Current_Level = (float)(levraw * 100.0);// (float)(map(remain, 0, total, 0, 100));
- Current_LevelA = LastReceiveBuffer[23]; //<- 23번자료는 byte이므로 소수점이잇는 데이터로 직접 계산한다
-
-
- //250620 jwlee 추가
- int temp1 = (LastReceiveBuffer[27] << 8) | LastReceiveBuffer[28];
- int temp2 = (LastReceiveBuffer[29] << 8) | LastReceiveBuffer[30];
-
- Current_temp1 = (temp1 - 2731) / 10f;
- Current_temp2 = (temp2 - 2731) / 10f;
-
- CheckManualCharge();
-
- Recv0 = true;
-
- try
- {
- BMSDataReceive?.Invoke(this, new BMSInformationEventArgs(Current_Volt, Current_Amp, Current_MaxAmp, Current_Level, Changed));
- Current_DataTime = DateTime.Now;
- return true;
- }
- catch (Exception ex)
- {
- RaiseMessage(MessageType.Error, ex.Message);
- 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;
- //}
-
- void CheckManualCharge()
- {
- if (AutoCharge)
- {
- if (chk_timee.Year != 1982)
- {
- chk_timee = new DateTime(1982, 11, 23);
- chk_valuee = 999f;
- }
- if (chk_times.Year != 1982)
- {
- 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)
- {
- if ((Current_Level - chk_values) >= 0.1)
- {
- //충전중이다
- 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);
- }
- else
- {
- //아직 변화가 없으니 종료일을 기록하지 않는다
- }
- }
- 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);
- public DateTime chk_timee { get; set; } = new DateTime(1982, 11, 23);
- public float chk_values { get; set; } = 0f;
- public float chk_valuee { get; set; } = 0f;
-
- ///
- /// 전압
- ///
- public float Current_Volt { get; set; }
- ///
- /// 남은 잔량(%)
- ///
- public float Current_Level { get; set; }
- public double[] CellVoltage = new double[] { 0, 0, 0, 0, 0, 0, 0, 0 };
-
- public float Current_LevelA { get; set; }
-
- ///
- /// 남은 전류량
- ///
- public int Current_Amp { get; set; }
-
- ///
- /// BMS 온도값1
- ///
- public double Current_temp1 { get; set; }
-
- ///
- /// BMS 온도값2
- ///
- public double Current_temp2 { get; set; }
-
- ///
- /// 총 전류량
- ///
- public int Current_MaxAmp { get; set; }
-
- public DateTime Current_DataTime = DateTime.Parse("1982-11-23");
- public DateTime Current_CellTime = DateTime.Parse("1982-11-23");
-
- public int QueryIndex { get; set; } = 0;
-
- ///
- /// 상태읽기와 전압읽기명령을 반복합니다
- ///
- ///
- public Boolean SendQuery()
- {
- if (QueryIndex == 0)
- {
- if (Recv0 == true)
- {
- QueryIndex = 1;
- Recv1 = false;
- return true;
- }
- else
- {
- return SendQuery_ReadStatue();
- }
- }
- else
- {
- if (Recv1 == true)
- {
- QueryIndex = 0;
- Recv0 = false;
- return true;
- }
- else
- {
- return SendQuery_ReadCellvoltage();
- }
- }
- }
-
- public Boolean SendQuery_ReadStatue()
- {
- Recv0 = false;
- var cmd = new List();
- cmd.Add(0xDD);
- cmd.Add(0xA5);
- cmd.Add(0x03);
- cmd.Add(0x00);
- cmd.Add(0xFF);
- cmd.Add(0xFD);
- cmd.Add(0x77);
- cmd.Add(0x0D);
- return WriteData(cmd.ToArray());
- }
-
-
- public Boolean SendQuery_ReadCellvoltage()
- {
- Recv1 = false;
- var cmd = new List();
- cmd.Add(0xDD);
- cmd.Add(0xA5);
- cmd.Add(0x04);
- cmd.Add(0x00);
- cmd.Add(0xFF);
- cmd.Add(0xFC);
- cmd.Add(0x77);
- cmd.Add(0x0D);
- return WriteData(cmd.ToArray());
- }
-
- }
-}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.ComponentModel;
+using System.Threading;
+using System.Threading.Tasks;
+using System.CodeDom;
+
+namespace arDev
+{
+ public class BMS : arRS232
+ {
+ public BMS()
+ {
+
+ MinRecvLength = 34;
+ }
+
+ ///
+ /// 시리얼포트의 핀 상태값이 변경될 때 발생합니다.
+ ///
+ public event EventHandler BMSDataReceive;
+ public event EventHandler BMSCellDataReceive;
+
+ protected override bool CustomParser(byte[] buf, out byte[] remainBuffer)
+ {
+ List remain = new List();
+
+ //데이터는 총 34byt 이며 , DD~77로 구성됨
+ Boolean bComplete = false;
+ for (int i = 0; i < buf.Length; i++)
+ {
+ var incomByte = buf[i];
+ if (bComplete == true)
+ {
+ remain.Add(incomByte);
+ }
+ else
+ {
+ if (findSTX == false)
+ {
+ if (incomByte != 0xDD)
+ {
+ //버리는데이터
+ }
+ else
+ {
+ findSTX = true;
+ tempBuffer.Clear();
+ tempBuffer.Add(incomByte);
+ }
+ }
+ else
+ {
+ tempBuffer.Add(incomByte);
+
+ 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
+ {
+ //아직 모자르므로 대기한다
+ }
+ }
+ }
+ }
+
+ remainBuffer = remain.ToArray();
+ return bComplete;
+ }
+
+ bool Recv0 = false;
+ bool Recv1 = false;
+ public event EventHandler ChargeDetect;
+ public override bool ProcessRecvData(byte[] data)
+ {
+ //LastReceiveBuffer
+ if (data == null)
+ {
+ RaiseMessage(MessageType.Error, "수신 데이터가 없습니다");
+ return false;
+ }
+
+ var datalne = QueryIndex == 0 ? 34 : 23;
+ if (data.Length != datalne)
+ {
+ RaiseMessage(MessageType.Error, $"데이터의 길이가 {MinRecvLength}가 아닙니다 길이={data.Length}");
+ return false;
+ }
+
+ if (QueryIndex == 0)
+ {
+ return ParseBMSInfo();
+ }
+ else
+ {
+ return ParseBMSCellVoltage();
+ }
+
+
+ }
+ bool ParseBMSCellVoltage()
+ {
+ //var i = 0;
+ var BatteryCell_Checksum = 0xffff;// - (LastReceiveBuffer[i + 3] + LastReceiveBuffer[i + 4] + LastReceiveBuffer[i + 5] + LastReceiveBuffer[i + 6] + LastReceiveBuffer[i + 7] + LastReceiveBuffer[i + 8] + LastReceiveBuffer[i + 9] + LastReceiveBuffer[i + 10] + LastReceiveBuffer[i + 11] + LastReceiveBuffer[i + 12] + LastReceiveBuffer[i + 13] + LastReceiveBuffer[i + 14] + LastReceiveBuffer[i + 15] + LastReceiveBuffer[i + 16] + LastReceiveBuffer[i + 17] + LastReceiveBuffer[i + 18] + LastReceiveBuffer[i + 19])) + 1;
+ for (int i = 3; i < 20; i++)
+ {
+ BatteryCell_Checksum -= LastReceiveBuffer[i];// + LastReceiveBuffer[i + 4] + LastReceiveBuffer[i + 5] + LastReceiveBuffer[i + 6] + LastReceiveBuffer[i + 7] + LastReceiveBuffer[i + 8] + LastReceiveBuffer[i + 9] + LastReceiveBuffer[i + 10] + LastReceiveBuffer[i + 11] + LastReceiveBuffer[i + 12] + LastReceiveBuffer[i + 13] + LastReceiveBuffer[i + 14] + LastReceiveBuffer[i + 15] + LastReceiveBuffer[i + 16] + LastReceiveBuffer[i + 17] + LastReceiveBuffer[i + 18] + LastReceiveBuffer[i + 19])) + 1;
+ }
+
+ BatteryCell_Checksum += 1;
+ var recvchecksum = BitConverter.ToUInt16(LastReceiveBuffer.Skip(20).Take(2).Reverse().ToArray(), 0);
+ if (recvchecksum == BatteryCell_Checksum)
+ {
+ var v1 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(4).Take(2).Reverse().ToArray(), 0) / 1000.0;
+ var v2 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(6).Take(2).Reverse().ToArray(), 0) / 1000.0;
+ var v3 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(8).Take(2).Reverse().ToArray(), 0) / 1000.0;
+ var v4 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(10).Take(2).Reverse().ToArray(), 0) / 1000.0;
+ var v5 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(12).Take(2).Reverse().ToArray(), 0) / 1000.0;
+ var v6 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(14).Take(2).Reverse().ToArray(), 0) / 1000.0;
+ var v7 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(16).Take(2).Reverse().ToArray(), 0) / 1000.0;
+ var v8 = BitConverter.ToUInt16(LastReceiveBuffer.Skip(18).Take(2).Reverse().ToArray(), 0) / 1000.0;
+
+ var idx = 0;
+ CellVoltage[idx++] = v1;
+ CellVoltage[idx++] = v2;
+ CellVoltage[idx++] = v3;
+ CellVoltage[idx++] = v4;
+ CellVoltage[idx++] = v5;
+ CellVoltage[idx++] = v6;
+ CellVoltage[idx++] = v7;
+ CellVoltage[idx++] = v8;
+
+ Recv1 = true;
+
+ try
+ {
+ BMSCellDataReceive?.Invoke(this, new BMSCelvoltageEventArgs(v1, v2, v3, v4, v5, v6, v7, v8));
+ Current_CellTime = DateTime.Now;
+ return true;
+ }
+ catch (Exception ex)
+ {
+ RaiseMessage(MessageType.Error, ex.Message);
+ return false;
+ }
+ }
+ else return false;
+
+
+ }
+ bool ParseBMSInfo()
+ {
+ //전압확인
+ UInt16 batH = (UInt16)LastReceiveBuffer[4];
+ UInt16 batL = (UInt16)LastReceiveBuffer[5];
+ batH = (UInt16)(batH << 8);
+ batH = (UInt16)(batH | batL);
+ Current_Volt = (float)(batH / 100.0);
+
+ //잔량확인
+ batH = (UInt16)LastReceiveBuffer[8];
+ batL = (UInt16)LastReceiveBuffer[9];
+ batH = (UInt16)(batH << 8);
+ batH = (UInt16)(batH | batL);
+ var newamp = (int)batH;
+ var Changed = newamp != Current_Amp;
+ Current_Amp = newamp;
+
+ //총량확인
+ batH = (UInt16)LastReceiveBuffer[10];
+ batL = (UInt16)LastReceiveBuffer[11];
+ batH = (UInt16)(batH << 8);
+ batH = (UInt16)(batH | batL);
+ Current_MaxAmp = (int)batH;
+
+ //남은 % 계산
+ float levraw = (float)(Current_Amp / (Current_MaxAmp * 1.0));
+ Current_Level = (float)(levraw * 100.0);// (float)(map(remain, 0, total, 0, 100));
+ Current_LevelA = LastReceiveBuffer[23]; //<- 23번자료는 byte이므로 소수점이잇는 데이터로 직접 계산한다
+
+
+ //250620 jwlee 추가
+ int temp1 = (LastReceiveBuffer[27] << 8) | LastReceiveBuffer[28];
+ int temp2 = (LastReceiveBuffer[29] << 8) | LastReceiveBuffer[30];
+
+ Current_temp1 = (temp1 - 2731) / 10f;
+ Current_temp2 = (temp2 - 2731) / 10f;
+
+ CheckManualCharge();
+
+ Recv0 = true;
+
+ try
+ {
+ BMSDataReceive?.Invoke(this, new BMSInformationEventArgs(Current_Volt, Current_Amp, Current_MaxAmp, Current_Level, Changed));
+ Current_DataTime = DateTime.Now;
+ return true;
+ }
+ catch (Exception ex)
+ {
+ RaiseMessage(MessageType.Error, ex.Message);
+ 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;
+ //}
+
+ void CheckManualCharge()
+ {
+ if (AutoCharge)
+ {
+ if (chk_timee.Year != 1982)
+ {
+ chk_timee = new DateTime(1982, 11, 23);
+ chk_valuee = 999f;
+ }
+ if (chk_times.Year != 1982)
+ {
+ 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)
+ {
+ if ((Current_Level - chk_values) >= 0.1)
+ {
+ //충전중이다
+ 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);
+ }
+ else
+ {
+ //아직 변화가 없으니 종료일을 기록하지 않는다
+ }
+ }
+ 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);
+ public DateTime chk_timee { get; set; } = new DateTime(1982, 11, 23);
+ public float chk_values { get; set; } = 0f;
+ public float chk_valuee { get; set; } = 0f;
+
+ ///
+ /// 전압
+ ///
+ public float Current_Volt { get; set; }
+ ///
+ /// 남은 잔량(%)
+ ///
+ public float Current_Level { get; set; }
+ public double[] CellVoltage = new double[] { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ public float Current_LevelA { get; set; }
+
+ ///
+ /// 남은 전류량
+ ///
+ public int Current_Amp { get; set; }
+
+ ///
+ /// BMS 온도값1
+ ///
+ public double Current_temp1 { get; set; }
+
+ ///
+ /// BMS 온도값2
+ ///
+ public double Current_temp2 { get; set; }
+
+ ///
+ /// 총 전류량
+ ///
+ public int Current_MaxAmp { get; set; }
+
+ public DateTime Current_DataTime = DateTime.Parse("1982-11-23");
+ public DateTime Current_CellTime = DateTime.Parse("1982-11-23");
+
+ public int QueryIndex { get; set; } = 0;
+
+ ///
+ /// 상태읽기와 전압읽기명령을 반복합니다
+ ///
+ ///
+ public Boolean SendQuery()
+ {
+ if (QueryIndex == 0)
+ {
+ if (Recv0 == true)
+ {
+ QueryIndex = 1;
+ Recv1 = false;
+ return true;
+ }
+ else
+ {
+ return SendQuery_ReadStatue();
+ }
+ }
+ else
+ {
+ if (Recv1 == true)
+ {
+ QueryIndex = 0;
+ Recv0 = false;
+ return true;
+ }
+ else
+ {
+ return SendQuery_ReadCellvoltage();
+ }
+ }
+ }
+
+ public Boolean SendQuery_ReadStatue()
+ {
+ Recv0 = false;
+ var cmd = new List();
+ cmd.Add(0xDD);
+ cmd.Add(0xA5);
+ cmd.Add(0x03);
+ cmd.Add(0x00);
+ cmd.Add(0xFF);
+ cmd.Add(0xFD);
+ cmd.Add(0x77);
+ cmd.Add(0x0D);
+ return WriteData(cmd.ToArray());
+ }
+
+
+ public Boolean SendQuery_ReadCellvoltage()
+ {
+ Recv1 = false;
+ var cmd = new List();
+ cmd.Add(0xDD);
+ cmd.Add(0xA5);
+ cmd.Add(0x04);
+ cmd.Add(0x00);
+ cmd.Add(0xFF);
+ cmd.Add(0xFC);
+ cmd.Add(0x77);
+ cmd.Add(0x0D);
+ return WriteData(cmd.ToArray());
+ }
+
+ }
+}
diff --git a/Cs_HMI/SubProject/BMS/BMSInformationEventArgs.cs b/Cs_HMI/Project/Device/BMSInformationEventArgs.cs
similarity index 96%
rename from Cs_HMI/SubProject/BMS/BMSInformationEventArgs.cs
rename to Cs_HMI/Project/Device/BMSInformationEventArgs.cs
index 73dffe9..d4a3636 100644
--- a/Cs_HMI/SubProject/BMS/BMSInformationEventArgs.cs
+++ b/Cs_HMI/Project/Device/BMSInformationEventArgs.cs
@@ -1,44 +1,44 @@
-using System;
-
-namespace arDev
-{
- public class ChargetDetectArgs : EventArgs
- {
- public DateTime times { get; set; }
- public DateTime timee { get; set; }
- public float values { get; set; }
- public float valuee { get; set; }
- public ChargetDetectArgs(DateTime times, float values, DateTime timee, float valuee)
- {
- this.times = times;
- this.times = timee;
- this.values = values;
- this.valuee = valuee;
- }
- }
- public class BMSInformationEventArgs : EventArgs
- {
- public float Volt { get; set; }
- public int CurAmp { get; set; }
- public int MaxAmp { get; set; }
- public float Level { get; set; }
- public bool Changed { get; set; }
- public BMSInformationEventArgs(float _volt, int _curamp, int _maxamp, float _level, bool _changed)
- {
- this.Volt = _volt;
- this.CurAmp = _curamp;
- this.MaxAmp = _maxamp;
- this.Level = _level;
- this.Changed = _changed;
- }
- }
-
- public class BMSCelvoltageEventArgs : EventArgs
- {
- public double[] voltage;
- public BMSCelvoltageEventArgs(double v1, double v2, double v3, double v4, double v5, double v6, double v7, double v8)
- {
- voltage = new double[] { v1, v2, v3, v4, v5, v6, v7, v8 };
- }
- }
-}
+using System;
+
+namespace arDev
+{
+ public class ChargetDetectArgs : EventArgs
+ {
+ public DateTime times { get; set; }
+ public DateTime timee { get; set; }
+ public float values { get; set; }
+ public float valuee { get; set; }
+ public ChargetDetectArgs(DateTime times, float values, DateTime timee, float valuee)
+ {
+ this.times = times;
+ this.times = timee;
+ this.values = values;
+ this.valuee = valuee;
+ }
+ }
+ public class BMSInformationEventArgs : EventArgs
+ {
+ public float Volt { get; set; }
+ public int CurAmp { get; set; }
+ public int MaxAmp { get; set; }
+ public float Level { get; set; }
+ public bool Changed { get; set; }
+ public BMSInformationEventArgs(float _volt, int _curamp, int _maxamp, float _level, bool _changed)
+ {
+ this.Volt = _volt;
+ this.CurAmp = _curamp;
+ this.MaxAmp = _maxamp;
+ this.Level = _level;
+ this.Changed = _changed;
+ }
+ }
+
+ public class BMSCelvoltageEventArgs : EventArgs
+ {
+ public double[] voltage;
+ public BMSCelvoltageEventArgs(double v1, double v2, double v3, double v4, double v5, double v6, double v7, double v8)
+ {
+ voltage = new double[] { v1, v2, v3, v4, v5, v6, v7, v8 };
+ }
+ }
+}
diff --git a/Cs_HMI/Project/fMain.cs b/Cs_HMI/Project/fMain.cs
index 53bd424..27a4550 100644
--- a/Cs_HMI/Project/fMain.cs
+++ b/Cs_HMI/Project/fMain.cs
@@ -53,21 +53,6 @@ namespace Project
// F11: 모든 스레드 상태 덤프
DumpAllThreadsState();
}
- else if (e1.KeyCode == Keys.F12 && System.Diagnostics.Debugger.IsAttached)
- {
- // F12: 다음 sm_Running 호출시 디버거 중단
- RequestDebugBreak = true;
- var lastCall = DateTime.Now - lastSmRunningTime;
- PUB.log.Add("DEBUG", $"F12 pressed - 마지막 sm_Running 호출: {lastCall.TotalSeconds:F1}초 전, IsThreadRun: {PUB.sm.IsThreadRun}");
- System.Windows.Forms.MessageBox.Show(
- $"다음 sm_Running 호출시 디버거가 중단됩니다.\n\n" +
- $"마지막 호출: {lastCall.TotalSeconds:F1}초 전\n" +
- $"IsThreadRun: {PUB.sm.IsThreadRun}\n" +
- $"Current Step: {PUB.sm.Step}",
- "디버그 모드",
- System.Windows.Forms.MessageBoxButtons.OK,
- System.Windows.Forms.MessageBoxIcon.Information);
- }
if (DateTime.Now > PUB.LastInputTime) PUB.LastInputTime = DateTime.Now;
};
@@ -1094,8 +1079,8 @@ namespace Project
var sb = new System.Text.StringBuilder();
sb.AppendLine("===== 스레드 상태 덤프 =====");
sb.AppendLine($"시간: {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}");
- sb.AppendLine($"마지막 sm_Running 호출: {(DateTime.Now - lastSmRunningTime).TotalSeconds:F1}초 전");
- sb.AppendLine($"sm_Running 호출 횟수: {sm_Running_CallCount}");
+ //sb.AppendLine($"마지막 sm_Running 호출: {(DateTime.Now - lastSmRunningTime).TotalSeconds:F1}초 전");
+ //sb.AppendLine($"sm_Running 호출 횟수: {sm_Running_CallCount}");
sb.AppendLine($"IsThreadRun: {PUB.sm.IsThreadRun}");
sb.AppendLine($"Current Step: {PUB.sm.Step}");
sb.AppendLine($"Current RunStep: {PUB.sm.RunStep}");
@@ -1123,7 +1108,7 @@ namespace Project
MessageBox.Show(
$"스레드 덤프 완료\n로그 파일에 저장되었습니다.\n\n" +
- $"마지막 sm_Running: {(DateTime.Now - lastSmRunningTime).TotalSeconds:F1}초 전\n" +
+ //$"마지막 sm_Running: {(DateTime.Now - lastSmRunningTime).TotalSeconds:F1}초 전\n" +
$"IsThreadRun: {PUB.sm.IsThreadRun}",
"스레드 덤프",
MessageBoxButtons.OK,
diff --git a/Cs_HMI/SubProject/BMS/.gitignore b/Cs_HMI/SubProject/BMS/.gitignore
deleted file mode 100644
index 553bd67..0000000
--- a/Cs_HMI/SubProject/BMS/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-*.suo
-*.user
-*.pdb
-bin
-obj
-desktop.ini
-.vs
-.git
-packages
-*.patch
-/Project/SourceSetup.exe
-*.zip
diff --git a/Cs_HMI/SubProject/BMS/BMS.csproj b/Cs_HMI/SubProject/BMS/BMS.csproj
deleted file mode 100644
index e8ca0f5..0000000
--- a/Cs_HMI/SubProject/BMS/BMS.csproj
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}
- Library
- Properties
- arDevice
- BMS
- v4.8
- 512
- true
-
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
- false
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {14e8c9a5-013e-49ba-b435-efefc77dd623}
- CommData
-
-
-
-
\ No newline at end of file
diff --git a/Cs_HMI/SubProject/BMS/Properties/AssemblyInfo.cs b/Cs_HMI/SubProject/BMS/Properties/AssemblyInfo.cs
deleted file mode 100644
index dafbac1..0000000
--- a/Cs_HMI/SubProject/BMS/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
-// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
-// 이러한 특성 값을 변경하세요.
-[assembly: AssemblyTitle("BMS Commnunication Module")]
-[assembly: AssemblyDescription("BMS Commnunication Module")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("ATK4")]
-[assembly: AssemblyProduct("BMS Commnunication Module")]
-[assembly: AssemblyCopyright("Copyright ©ATK4 2020")]
-[assembly: AssemblyTrademark("ATK4")]
-[assembly: AssemblyCulture("")]
-
-// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
-// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
-// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
-[assembly: ComVisible(false)]
-
-// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
-[assembly: Guid("7a94c30c-6772-4f71-bf9c-0df071a1bc70")]
-
-// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
-//
-// 주 버전
-// 부 버전
-// 빌드 번호
-// 수정 버전
-//
-// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
-// 기본값으로 할 수 있습니다.
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("20.03.09.0000")]
-[assembly: AssemblyFileVersion("20.03.09.0000")]
diff --git a/Cs_HMI/SubProject/BMS/RS232.cs b/Cs_HMI/SubProject/BMS/RS232.cs
deleted file mode 100644
index e12bbd9..0000000
--- a/Cs_HMI/SubProject/BMS/RS232.cs
+++ /dev/null
@@ -1,495 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading;
-
-
-public abstract partial class arRS232 : IDisposable
-{
- protected System.IO.Ports.SerialPort _device;
- protected ManualResetEvent _mre;
- protected byte[] LastReceiveBuffer = new byte[] { };
- ///
- /// 최종 전송 메세지
- ///
- public byte[] lastSendBuffer = new byte[] { };
- //public int ValidCheckTimeMSec { get; set; } = 5000;
- protected List tempBuffer = new List();
- protected Boolean findSTX = false;
- public string errorMessage { get; set; }
- public DateTime LastConnTime { get; set; }
- public DateTime LastConnTryTime { get; set; }
- public DateTime lastSendTime;
- ///
- /// 메세지 수신시 사용하는 내부버퍼
- ///
- protected List _buffer = new List();
- ///
- /// 데이터조회간격(초)
- ///
- public float ScanInterval { get; set; }
-
- // public byte[] LastRecvData;
- public string LastRecvString
- {
- get
- {
- if (LastReceiveBuffer == null) return String.Empty;
- else return System.Text.Encoding.Default.GetString(LastReceiveBuffer);
- }
- }
- ///
- /// 마지막으로 데이터를 받은 시간
- ///
- public DateTime lastRecvTime;
-
-
- public int WriteError = 0;
- public string WriteErrorMessage = string.Empty;
- public int WaitTimeout { get; set; } = 1000;
- public int MinRecvLength { get; set; } = 1;
- ///
- /// 포트이름
- ///
- [Description("시리얼 포트 이름")]
- [Category("설정"), DisplayName("Port Name")]
- public string PortName
- {
- get
- {
- if (_device == null) return string.Empty;
- else return _device.PortName;
- }
- set
- {
- if (this.IsOpen)
- {
- Message?.Invoke(this, new MessageEventArgs("포트가 열려있어 포트이름을 변경할 수 없습니다", true));
- }
- else if (String.IsNullOrEmpty(value) == false)
- _device.PortName = value;
- else
- {
- Message?.Invoke(this, new MessageEventArgs("No PortName", true));
- }
- }
- }
-
- public int BaudRate
- {
- get
- {
- if (_device == null) return 0;
- else return _device.BaudRate;
- }
- set
- {
- if (this.IsOpen)
- {
- Message?.Invoke(this, new MessageEventArgs("포트가 열려있어 BaudRate(를) 변경할 수 없습니다", true));
- }
- else if (value != 0)
- _device.BaudRate = value;
- else Message?.Invoke(this, new MessageEventArgs("No baud rate", true));
- }
- }
-
-
- public arRS232()
- {
- _device = new System.IO.Ports.SerialPort();
- this.BaudRate = 9600;
- ScanInterval = 10;
- _device.DataReceived += barcode_DataReceived;
- _device.ErrorReceived += this.barcode_ErrorReceived;
- _device.WriteTimeout = 5000;
- _device.ReadTimeout = 5000;
- // _device.DtrEnable = false;
- _device.ReadBufferSize = 8192;
- _device.WriteBufferSize = 8192;
-
- errorMessage = string.Empty;
- lastRecvTime = DateTime.Parse("1982-11-23");
- LastConnTime = DateTime.Parse("1982-11-23");
- LastConnTryTime = DateTime.Parse("1982-11-23");
- lastRecvTime = DateTime.Parse("1982-11-23");
- this._mre = new ManualResetEvent(true);
- }
-
- ~arRS232()
- {
- Dispose(false);
- }
-
-
- // Flag: Has Dispose already been called?
- bool disposed = false;
-
- // Public implementation of Dispose pattern callable by consumers.
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- // Protected implementation of Dispose pattern.
- protected virtual void Dispose(bool disposing)
- {
- if (disposed)
- return;
-
- if (disposing)
- {
- // Free any other managed objects here.
- //
- }
-
- _device.DataReceived -= barcode_DataReceived;
- _device.ErrorReceived -= this.barcode_ErrorReceived;
-
- // Free any unmanaged objects here.
- //
- disposed = true;
- }
-
- public Boolean Open()
- {
- try
- {
- _device.Open();
- return IsOpen;
- }
- catch (Exception ex)
- {
- errorMessage = ex.Message;
- Message.Invoke(this, new MessageEventArgs(ex.Message, true));
- return false;
- }
- }
- public string GetHexString(Byte[] input)
- {
- System.Text.StringBuilder sb = new System.Text.StringBuilder();
- foreach (byte b in input)
- sb.Append(" " + b.ToString("X2"));
- return sb.ToString();
- }
-
- ///
- /// 포트가 열려있는지 확인
- ///
- [Description("현재 시리얼포트가 열려있는지 확인합니다")]
- [Category("정보"), DisplayName("Port Open")]
- public Boolean IsOpen
- {
- get
- {
- if (_device == null) return false;
- return _device.IsOpen;
- }
- }
-
- public virtual void Close(Boolean PortClose = true)
- {
- if (_device != null && _device.IsOpen)
- {
- _device.DiscardInBuffer();
- _device.DiscardOutBuffer();
- if (PortClose) _device.Close(); //dispose에서는 포트를 직접 클리어하지 않게 해뒀다.
- }
- }
- protected Boolean RaiseRecvData()
- {
- return RaiseRecvData(LastReceiveBuffer.ToArray(), false);
- }
- ///
- /// 수신받은 메세지를 발생 시킵니다
- ///
- ///
- ///
- public virtual Boolean RaiseRecvData(byte[] Data, bool udpatelastbuffer)
- {
- //181206 - 최종수신 메세지 기록
- lastRecvTime = DateTime.Now;
- if (udpatelastbuffer && Data != null)
- {
- if (LastReceiveBuffer == null || LastReceiveBuffer.Length != Data.Length)
- {
- LastReceiveBuffer = new byte[Data.Length];
- Array.Copy(Data, LastReceiveBuffer, Data.Length);
- }
- }
-
- try
- {
- Message?.Invoke(this, new MessageEventArgs(Data, true)); //recvmessage
- if (ProcessRecvData(Data) == false)
- {
- //Message?.Invoke(this, new MessageEventArgs(Data, true)); //recvmessage
- Message?.Invoke(this, new MessageEventArgs(this.errorMessage, true)); //errormessage
- return false;
- }
- else
- {
-
- return true;
- }
- }
- catch (Exception ex)
- {
- this.errorMessage = ex.Message;
- this.Message?.Invoke(this, new MessageEventArgs(ex.Message, true));
- return false;
- }
- }
-
- ///
- /// 수신받은 자료를 처리한다
- ///
- ///
- ///
- public abstract bool ProcessRecvData(byte[] data);
-
- #region "Internal Events"
-
- void barcode_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
- {
- Message?.Invoke(this, new MessageEventArgs(e.ToString(), true));
- }
-
- byte[] buffer = new byte[] { };
- void barcode_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
- {
-
- try
- {
- int ReadCount = _device.BytesToRead;
-
- buffer = new byte[ReadCount];
- _device.Read(buffer, 0, buffer.Length);
-
- System.Text.StringBuilder LogMsg = new StringBuilder();
-
- byte[] remainBuffer;
- Repeat:
- if (CustomParser(buffer, out remainBuffer))
- {
- //분석완료이므로 받은 데이터를 버퍼에 기록한다
- if (LastReceiveBuffer == null || (LastReceiveBuffer.Length != tempBuffer.Count))
- Array.Resize(ref LastReceiveBuffer, tempBuffer.Count);
- Array.Copy(tempBuffer.ToArray(), LastReceiveBuffer, tempBuffer.Count);
- tempBuffer.Clear();
-
- //수신메세지발생
- RaiseRecvData();
- if (remainBuffer != null && remainBuffer.Length > 0)
- {
- //버퍼를 변경해서 다시 전송을 해준다.
- Array.Resize(ref buffer, remainBuffer.Length);
- Array.Copy(remainBuffer, buffer, remainBuffer.Length);
- goto Repeat; //남은 버퍼가 있다면 진행을 해준다.
- }
- }
-
- }
- catch (Exception ex)
- {
- //if (IsOpen)
- //{
- // //_device.DiscardInBuffer();
- // //_device.DiscardOutBuffer();
- //}
- errorMessage = ex.Message;
- this.Message?.Invoke(this, new MessageEventArgs(ex.Message, true));
- }
-
- }
-
-
- #endregion
-
- #region "External Events"
-
-
- ///
- /// 오류 및 기타 일반 메세지
- ///
- public event EventHandler Message;
-
- #endregion
-
- #region "Event Args"
-
- ///
- /// 데이터를 수신할떄 사용함(RAW 포함)
- ///
- public class ReceiveDataEventArgs : EventArgs
- {
- private byte[] _buffer = null;
-
- ///
- /// 바이트배열의 버퍼값
- ///
- public byte[] Value { get { return _buffer; } }
-
- ///
- /// 버퍼(바이트배열)의 데이터를 문자로 반환합니다.
- ///
- public string StrValue
- {
- get
- {
- //return string.Empty;
-
- if (_buffer == null || _buffer.Length < 1) return string.Empty;
- else return System.Text.Encoding.Default.GetString(_buffer);
- }
- }
- public ReceiveDataEventArgs(byte[] buffer)
- {
- _buffer = buffer;
- }
- }
-
- ///
- /// 메세지를 강제 발생
- ///
- ///
- ///
- protected virtual void RaiseMessage(MessageType mt, string message)
- {
- this.Message?.Invoke(this, new MessageEventArgs(mt, message));
- }
- public enum MessageType
- {
- Normal,
- Error,
- Send,
- Recv,
- }
-
- public class MessageEventArgs : EventArgs
- {
- public MessageType MsgType { get; set; }
- private string _message = string.Empty;
-
- ///
- /// Recv,Send,Normal,Error 모두 지원
- ///
- public string Message { get { return _message; } }
-
- private byte[] _data = null;
-
- ///
- /// Recv,Send에서만 값이 존재 합니다
- ///
- public byte[] Data { get { return _data; } }
- public MessageEventArgs(string Message, bool isError = false)
- {
- if (isError) MsgType = MessageType.Error;
- else MsgType = MessageType.Normal;
- _message = Message;
- }
- public MessageEventArgs(MessageType msgtype, string Message)
- {
- MsgType = msgtype;
- _message = Message;
- _data = System.Text.Encoding.Default.GetBytes(Message);
- }
-
- public MessageEventArgs(byte[] buffer, bool isRecv = true)
- {
- if (isRecv) MsgType = MessageType.Recv;
- else MsgType = MessageType.Send;
- _data = new byte[buffer.Length];
- Array.Copy(buffer, _data, Data.Length);
- _message = System.Text.Encoding.Default.GetString(_data);
- }
-
- }
-
- #endregion
-
-
-
- protected abstract bool CustomParser(byte[] buf, out byte[] remainBuffer);
-
- ///
- /// 포트가 열려있거나 데이터 수신시간이 없는경우 false를 반환합니다
- ///
- public Boolean IsValid
- {
- get
- {
- if (IsOpen == false) return false;
- if (lastRecvTime.Year == 1982) return false;
- var ts = DateTime.Now - lastRecvTime;
- if (ts.TotalSeconds > (this.ScanInterval * 2.5)) return false;
- return true;
- }
- }
-
- protected string ByteListToHexString(List src)
- {
- return string.Join(" ", src.Select(t => t.ToString("X2")));
- }
-
- protected bool WriteData(string cmd)
- {
- return WriteData(System.Text.Encoding.Default.GetBytes(cmd));
- }
- ///
- /// 포트에 쓰기(barcode_DataReceived 이벤트로 메세지수신)
- ///
- protected Boolean WriteData(byte[] data)
- {
- Boolean bRet = false;
-
- //171205 : 타임아웃시간추가
- if (!_mre.WaitOne(WaitTimeout))
- {
- errorMessage = $"WriteData:MRE:WaitOne:TimeOut {WaitTimeout}ms";
- this.Message?.Invoke(this, new MessageEventArgs(errorMessage, true));
- return false;
- }
-
- _mre.Reset();
-
- //Array.Resize(ref data, data.Length + 2);
-
- try
- {
- lastSendTime = DateTime.Now;
- if (lastSendBuffer == null) lastSendBuffer = new byte[data.Length]; //171113
- else Array.Resize(ref lastSendBuffer, data.Length);
- Array.Copy(data, lastSendBuffer, data.Length);
-
- for (int i = 0; i < data.Length; i++)
- _device.Write(data, i, 1);
-
- //_device.Write(data, 0, data.Length);
-
- //171113
- this.Message?.Invoke(this, new MessageEventArgs(data, false));
-
- bRet = true;
- WriteError = 0;
- WriteErrorMessage = string.Empty;
- }
- catch (Exception ex)
- {
- // this.isinit = false;
- this.Message?.Invoke(this, new MessageEventArgs(ex.Message, true));
- bRet = false;
- WriteError += 1; //연속쓰기오류횟수
- WriteErrorMessage = ex.Message;
- }
- finally
- {
- _mre.Set();
- }
- return bRet;
- }
-}
-
diff --git a/Cs_HMI/SubProject/EnigProtocol b/Cs_HMI/SubProject/EnigProtocol
index 4f360f3..8877cb1 160000
--- a/Cs_HMI/SubProject/EnigProtocol
+++ b/Cs_HMI/SubProject/EnigProtocol
@@ -1 +1 @@
-Subproject commit 4f360f33a7abbd77c517ca2492ccbde53e687099
+Subproject commit 8877cb1a9dbf97228ebb3fd57ca0004fef77fe24
diff --git a/Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs b/Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs
index eddee98..d8beccf 100644
--- a/Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs
+++ b/Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs
@@ -36,6 +36,8 @@
this.label2 = new System.Windows.Forms.Label();
this.logTextBox1 = new arCtl.LogTextBox();
this.button3 = new System.Windows.Forms.Button();
+ this.button4 = new System.Windows.Forms.Button();
+ this.button5 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// comboBox1
@@ -123,17 +125,39 @@
//
this.button3.Location = new System.Drawing.Point(301, 61);
this.button3.Name = "button3";
- this.button3.Size = new System.Drawing.Size(220, 20);
+ this.button3.Size = new System.Drawing.Size(140, 20);
this.button3.TabIndex = 5;
this.button3.Text = "send query";
this.button3.UseVisualStyleBackColor = true;
this.button3.Click += new System.EventHandler(this.button3_Click);
//
+ // button4
+ //
+ this.button4.Location = new System.Drawing.Point(447, 60);
+ this.button4.Name = "button4";
+ this.button4.Size = new System.Drawing.Size(140, 20);
+ this.button4.TabIndex = 6;
+ this.button4.Text = "send query";
+ this.button4.UseVisualStyleBackColor = true;
+ this.button4.Click += new System.EventHandler(this.button4_Click);
+ //
+ // button5
+ //
+ this.button5.Location = new System.Drawing.Point(155, 61);
+ this.button5.Name = "button5";
+ this.button5.Size = new System.Drawing.Size(140, 20);
+ this.button5.TabIndex = 7;
+ this.button5.Text = "send query";
+ this.button5.UseVisualStyleBackColor = true;
+ this.button5.Click += new System.EventHandler(this.button5_Click);
+ //
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(574, 450);
+ this.Controls.Add(this.button5);
+ this.Controls.Add(this.button4);
this.Controls.Add(this.button3);
this.Controls.Add(this.logTextBox1);
this.Controls.Add(this.label2);
@@ -161,6 +185,8 @@
private System.Windows.Forms.Label label2;
private arCtl.LogTextBox logTextBox1;
private System.Windows.Forms.Button button3;
+ private System.Windows.Forms.Button button4;
+ private System.Windows.Forms.Button button5;
}
}
diff --git a/Cs_HMI/TestProject/Test_BMS/Form1.cs b/Cs_HMI/TestProject/Test_BMS/Form1.cs
index dbcb383..5b215d5 100644
--- a/Cs_HMI/TestProject/Test_BMS/Form1.cs
+++ b/Cs_HMI/TestProject/Test_BMS/Form1.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
+using System.Diagnostics.Eventing.Reader;
using System.Drawing;
using System.Linq;
using System.Text;
@@ -17,10 +18,10 @@ namespace Test_BMS
InitializeComponent();
bms = new arDev.BMS();
bms.BMSDataReceive += Bms_BMSDataReceive;
- //bms.Message += Bms_Message;
+ bms.Message += Bms_Message;
}
- private void Bms_Message(object sender, arDev.arRS232.MessageEventArgs e)
+ private void Bms_Message(object sender, arRS232.MessageEventArgs e)
{
var sb = new System.Text.StringBuilder();
if (e.Data != null)
@@ -29,7 +30,10 @@ namespace Test_BMS
sb.Append(" " + b.ToString("X2"));
}
else sb.Append(e.Message);
- addmsg($"{e.MsgType}:{sb}");
+ if (e.MsgType == arRS232.MessageType.Error)
+ addmsg(e.Message);
+ else
+ addmsg($"{e.MsgType}:{sb}");
}
private void Bms_BMSDataReceive(object sender, EventArgs e)
@@ -54,10 +58,6 @@ namespace Test_BMS
}
}
- private void Bms_RxData(object sender, arDev.BMS.ReceiveDataEventArgs e)
- {
- addmsg("Rx:" + e.StrValue);
- }
private void Form1_Load(object sender, EventArgs e)
{
@@ -81,12 +81,22 @@ namespace Test_BMS
private void button3_Click(object sender, EventArgs e)
{
- bms.SendQuery();
+ bms.SendQuery_ReadStatue();
}
private void label1_Click(object sender, EventArgs e)
{
comboBox1.Text = "COM41";
}
+
+ private void button4_Click(object sender, EventArgs e)
+ {
+ bms.SendQuery_ReadCellvoltage();
+ }
+
+ private void button5_Click(object sender, EventArgs e)
+ {
+ bms.SendQuery();
+ }
}
}
diff --git a/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj b/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj
index 4e4c7e4..f109c0c 100644
--- a/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj
+++ b/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj
@@ -83,10 +83,6 @@
-
- {7a94c30c-6772-4f71-bf9c-0df071a1bc70}
- BMS
-
{14e8c9a5-013e-49ba-b435-efefc77dd623}
CommData