105 lines
2.4 KiB
C#
105 lines
2.4 KiB
C#
using Modbus.Device;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO.Ports;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
|
|
namespace charger_gui
|
|
{
|
|
class UpdateWorker
|
|
{
|
|
const int SLAVE_ADDRESS = 1;
|
|
const int CHARGE_REGISTER = 4;
|
|
const int LAMP_REGISTER = 5;
|
|
|
|
private MainWindowViewModel model;
|
|
private Thread workingThread;
|
|
|
|
public UpdateWorker(MainWindowViewModel model)
|
|
{
|
|
this.model = model;
|
|
isWorking = false;
|
|
shouldRestart = false;
|
|
workingThread = new Thread(Work);
|
|
model.IsConnected = false;
|
|
}
|
|
|
|
private bool isWorking;
|
|
private bool shouldRestart;
|
|
private string portName;
|
|
|
|
public void SetPort(string name)
|
|
{
|
|
if (portName != name)
|
|
{
|
|
portName = name;
|
|
if (!isWorking)
|
|
{
|
|
isWorking = true;
|
|
workingThread.Start();
|
|
}
|
|
else
|
|
{
|
|
shouldRestart = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Work()
|
|
{
|
|
|
|
while (true)
|
|
{
|
|
try
|
|
{
|
|
using (var serialPort = new SerialPort(portName))
|
|
{
|
|
serialPort.BaudRate = 115200;
|
|
serialPort.DataBits = 8;
|
|
serialPort.Parity = Parity.None;
|
|
serialPort.StopBits = StopBits.One;
|
|
serialPort.ReadTimeout = 50;
|
|
serialPort.Open();
|
|
|
|
// create modbus master
|
|
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort);
|
|
while (!shouldRestart)
|
|
{
|
|
var r1 = master.ReadHoldingRegisters(SLAVE_ADDRESS, 0, 4);
|
|
model.IAcc = ToFloat(r1[0], r1[1]);
|
|
model.ILamp = ToFloat(r1[2], r1[3]);
|
|
var r2 = master.ReadHoldingRegisters(SLAVE_ADDRESS, 6, 8);
|
|
model.U1Acc = ToFloat(r2[0], r2[1]);
|
|
model.U2Acc = ToFloat(r2[2], r2[3]);
|
|
model.U1Lamp = ToFloat(r2[4], r2[5]);
|
|
model.U2Lamp = ToFloat(r2[6], r2[7]);
|
|
master.WriteSingleRegister(SLAVE_ADDRESS, CHARGE_REGISTER, (ushort)(model.IsCharging ? 1 : 0));
|
|
master.WriteSingleRegister(SLAVE_ADDRESS, LAMP_REGISTER, (ushort)(model.IsLampOn ? 1 : 0));
|
|
// ничего не упало, коннект есть значит
|
|
model.IsConnected = true;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
model.IsConnected = false;
|
|
Thread.Sleep(100);
|
|
// will continue
|
|
}
|
|
}
|
|
}
|
|
|
|
private float ToFloat(ushort v1, ushort v2)
|
|
{
|
|
byte[] t = new byte[4];
|
|
t[0] = (byte)(v1 & 0xFF);
|
|
t[1] = (byte)((v1 >> 8) & 0xFF);
|
|
t[2] = (byte)(v2 & 0xFF);
|
|
t[3] = (byte)((v2 >> 8) & 0xFF);
|
|
return System.BitConverter.ToSingle(t, 0);
|
|
}
|
|
}
|
|
}
|