Доделана реализация с Modbus.
This commit is contained in:
parent
fdeeca4e79
commit
22aeb49964
@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user