Доделана реализация с Modbus.

This commit is contained in:
Artyom 2024-05-13 18:39:07 +03:00
parent fdeeca4e79
commit 22aeb49964
2 changed files with 30 additions and 40 deletions

View File

@ -2,20 +2,25 @@
namespace ApiServer.Controllers namespace ApiServer.Controllers
{ {
[ApiController] [ApiController]
[Route("api/state")] [Route("api/state")]
public class StateContoller public class StateContoller
{ {
[HttpGet] [HttpGet]
public byte GetActualState() public byte GetActualState()
{ {
return GetActualStateFromCom.CurrentState; return GetActualStateFromCom.CurrentState;
} }
[HttpGet] [HttpGet]
[Route("modbus")] [Route("modbus")]
public bool GetActualState(int inputIndex) public ActionResult<bool> GetActualState(int inputIndex)
{ {
if (inputIndex > 1)
{
return new NotFoundResult();
//throw new ArgumentOutOfRangeException(nameof(inputIndex), "Значение может быть от 0 до 1 включительно.");
}
return GetActualStateFromComWithModbus.CurrentState[inputIndex]; return GetActualStateFromComWithModbus.CurrentState[inputIndex];
} }
} }

View File

@ -1,31 +1,17 @@
using Modbus.Device; using Modbus.Device;
using System;
using System.Diagnostics.Metrics;
using System.IO.Ports; using System.IO.Ports;
using System.Threading;
using System.Threading.Tasks;
namespace ApiServer namespace ApiServer
{ {
public class GetActualStateFromComWithModbus : IHostedService, IDisposable public class GetActualStateFromComWithModbus : BackgroundService, IDisposable
{ {
public static bool[] CurrentState { get; set; } public static bool[] CurrentState { get; set; }
static SerialPort _serialPort; private static SerialPort? _serialPort;
static ModbusSerialMaster _serialMaster; private static ModbusSerialMaster? _serialMaster;
static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_serialMaster = ModbusSerialMaster.CreateRtu(_serialPort);
byte slaveID = 1;
ushort startAddress = 0;
ushort numOfPoints = 2;
CurrentState = _serialMaster.ReadInputs(slaveID, startAddress, numOfPoints);
}
public Task StartAsync(CancellationToken cancellationToken)
{ {
_serialPort = new SerialPort(); _serialPort = new SerialPort();
_serialPort.PortName = "COM5"; _serialPort.PortName = "COM5";
@ -33,20 +19,19 @@ namespace ApiServer
_serialPort.DataBits = 8; _serialPort.DataBits = 8;
_serialPort.Parity = Parity.None; _serialPort.Parity = Parity.None;
_serialPort.StopBits = StopBits.One; _serialPort.StopBits = StopBits.One;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
_serialPort.Open(); _serialPort.Open();
return Task.CompletedTask; _serialMaster = ModbusSerialMaster.CreateRtu(_serialPort);
} byte slaveID = 1;
ushort startAddress = 0;
ushort numOfPoints = 2;
public Task StopAsync(CancellationToken cancellationToken) while (!stoppingToken.IsCancellationRequested)
{ {
return Task.CompletedTask; CurrentState = _serialMaster.ReadInputs(slaveID, startAddress, numOfPoints);
} await Task.Delay(100, stoppingToken);
}
public void Dispose() await Task.CompletedTask;
{
_serialPort.Dispose();
} }
} }
} }