init commit
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
using SimpleLite.RCS;
|
||||
using SimpleLite.RCS.CarTypes;
|
||||
using SimpleCore;
|
||||
using SimpleCore.Library;
|
||||
using SimpleCore.PropType;
|
||||
using StandardScene.Charge;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.Contracts;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using static SimpleCore.Traffic.TrafficControl;
|
||||
|
||||
namespace StandardScene.ChargeStationType
|
||||
{
|
||||
public class PCBChargeStation : AbstractChargeStation
|
||||
{
|
||||
private int _index = 0;
|
||||
|
||||
public int IndexReceive;
|
||||
private IPEndPoint _endPoint;
|
||||
|
||||
public override void OnUdpMessage(byte[] message)
|
||||
{
|
||||
if (message != null && message.Length > 1)
|
||||
IndexReceive = message[1];
|
||||
}
|
||||
|
||||
public override void CreateCommunication(IPAddress ip, int port)
|
||||
{
|
||||
_endPoint = new IPEndPoint(ip, port);
|
||||
}
|
||||
public override void SendToChargeStation(int isCharge, Car car,Site site)
|
||||
{
|
||||
var messageService = CommunicationMessageService.Instance;
|
||||
using (UdpClient udpClient = new UdpClient())
|
||||
{
|
||||
//float soc = 0f, voltage = 0, electricCurrent = 0, chargeTimeSpan = 30f;
|
||||
|
||||
float setVoltage = 29.2f;
|
||||
float setElectricCurrent = 40.0f;
|
||||
float soc = 0f, voltage = 0, electricCurrent = 0, chargeTimeSpan = 30f;
|
||||
int carId = 0;
|
||||
//Site site = null;
|
||||
if (car != null)
|
||||
{
|
||||
carId = car.id;
|
||||
soc = (float)Commons.CarValue(car, "Soc");
|
||||
voltage = (float)Commons.CarValue(car, "Voltage");
|
||||
electricCurrent = (float)Commons.CarValue(car, "ElectricCurrent");
|
||||
//site = SimpleLib.GetSite(car.status.holdingLocks.FirstOrDefault());
|
||||
|
||||
}
|
||||
if (site != null && site.fields.ContainsKey("setVoltage") && site.fields.ContainsKey("setElectricCurrent"))
|
||||
{
|
||||
setVoltage = float.Parse(site.fields["setVoltage"]);
|
||||
setElectricCurrent = float.Parse(site.fields["setElectricCurrent"]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
var msg = GetSendBytes((byte)isCharge, setVoltage, setElectricCurrent, chargeTimeSpan,
|
||||
carId, soc, electricCurrent, voltage);
|
||||
messageService.AddSendMessage(_endPoint.Address.ToString(), _endPoint.Port, BitConverter.ToString(msg).Replace("-", " "), "FRLDShort", site?.name);
|
||||
Diagnosis.Log($"ChargeStation ADD:[{BitConverter.ToString(msg).Replace("-", " ")}]", "UDP发送报文信息", true);
|
||||
udpClient.SendAsync(msg, msg.Length, _endPoint);
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] GetSendBytes(byte startCharge, float chargeVoltage, float chargeElectricCurrent, float chargeTimeSpan, int carId, float carSoc, float carElectricCurrent, float carVoltage)
|
||||
{
|
||||
var sendBytes = new byte[32];
|
||||
var indexNo = (byte)GetIndexNo();
|
||||
try
|
||||
{
|
||||
sendBytes = new byte[3] { 0xBB, indexNo, startCharge }
|
||||
.Concat(BitConverter.GetBytes((int)chargeElectricCurrent * 10).AsEnumerable().Reverse())
|
||||
.Concat(BitConverter.GetBytes((int)chargeVoltage * 10).AsEnumerable().Reverse())
|
||||
.Concat(BitConverter.GetBytes((ushort)chargeTimeSpan).AsEnumerable().Reverse())
|
||||
.Concat(BitConverter.GetBytes((ushort)carId).AsEnumerable().Reverse())
|
||||
.Concat([(byte)carSoc])
|
||||
.Concat(BitConverter.GetBytes((int)(carElectricCurrent * 10)).AsEnumerable().Reverse())
|
||||
.Concat(BitConverter.GetBytes((int)(carVoltage * 10)).AsEnumerable().Reverse())
|
||||
.Concat(new byte[] { 00, 00, 00, 00, 00, 00, 00, 0xEE }).ToArray();
|
||||
var crcCode = GetCRC(sendBytes.Skip(1).Take(28).ToArray()).AsEnumerable().Reverse().ToArray();
|
||||
sendBytes[29] = crcCode[0];
|
||||
sendBytes[30] = crcCode[1];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Diagnosis.Log($"充电报文组包异常 ex => {ex.Message}", "充电", true);
|
||||
}
|
||||
return sendBytes;
|
||||
}
|
||||
private byte[] GetCRC(byte[] data)
|
||||
{
|
||||
byte b = byte.MaxValue;
|
||||
byte b2 = byte.MaxValue;
|
||||
byte b3 = 1;
|
||||
byte b4 = 160;
|
||||
for (int i = 0; i < data.Length; i++)
|
||||
{
|
||||
b = (byte)(b ^ data[i]);
|
||||
for (int j = 0; j <= 7; j++)
|
||||
{
|
||||
byte b5 = b2;
|
||||
byte b6 = b;
|
||||
b2 = (byte)(b2 >> 1);
|
||||
b = (byte)(b >> 1);
|
||||
if ((b5 & 1) == 1)
|
||||
{
|
||||
b = (byte)(b | 0x80u);
|
||||
}
|
||||
if ((b6 & 1) == 1)
|
||||
{
|
||||
b2 = (byte)(b2 ^ b4);
|
||||
b = (byte)(b ^ b3);
|
||||
}
|
||||
}
|
||||
}
|
||||
return new byte[2]
|
||||
{
|
||||
b,b2
|
||||
};
|
||||
}
|
||||
|
||||
private int GetIndexNo()
|
||||
{
|
||||
if (_index < 255)
|
||||
{
|
||||
_index = _index + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
_index = 0;
|
||||
}
|
||||
return _index;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user