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, 2); model.IAcc = ToFloat(r1[0], r1[1]); var r2 = master.ReadHoldingRegisters(SLAVE_ADDRESS, 6, 8); model.U2 = ToFloat(r2[0], r2[1]); model.U3 = ToFloat(r2[2], r2[3]); model.U4 = ToFloat(r2[4], r2[5]); model.U5 = 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); } } }