using DMS.Infrastructure.Interfaces.Services;
using Microsoft.Extensions.Logging;
using NLog;
using S7.Net;
using S7.Net.Types;
namespace DMS.Infrastructure.Services
{
///
/// S7服务实现类,用于与S7 PLC进行通信
///
public class S7Service : IS7Service
{
private const int ReadMultipleVarsCount = 10;
private Plc _plc;
private readonly ILogger _logger;
public bool IsConnected => _plc?.IsConnected ?? false;
public S7Service(ILogger logger)
{
_logger = logger;
}
///
/// 异步连接到S7 PLC
///
public async Task ConnectAsync(string ipAddress, int port, short rack, short slot, CpuType cpuType)
{
try
{
_plc = new Plc(cpuType, ipAddress, (short)port, rack, slot);
await _plc.OpenAsync();
_logger.LogInformation($"成功连接到S7 PLC: {ipAddress}:{port}");
}
catch (Exception ex)
{
_logger.LogError(ex, $"连接S7 PLC时发生错误: {ex.Message}");
throw;
}
}
///
/// 异步断开与S7 PLC的连接
///
public async Task DisconnectAsync()
{
try
{
if (_plc != null)
{
_plc.Close();
_logger.LogInformation("已断开S7 PLC连接");
}
}
catch (Exception ex)
{
_logger.LogError(ex, $"断开S7 PLC连接时发生错误: {ex.Message}");
throw;
}
}
///
/// 异步读取单个变量的值
///
public async Task