using RIZO.Admin.WebApi.Filters;
using RIZO.Common;
using RIZO.Admin.WebApi.PLC;
using Infrastructure;
using Infrastructure.Attribute;
using Infrastructure.Controllers;
using Infrastructure.Enums;
using Infrastructure.Model;
using Microsoft.AspNetCore.Mvc;
// 创建时间:2026-01-16
namespace RIZO.Admin.WebApi.Controllers
{
///
/// PLC通讯测试接口
///
[AllowAnonymous]
[Route("PLC")]
public class PlcController : BaseController
{
///
/// PLC通讯服务
///
private readonly PlcService _plcService;
///
/// 构造函数注入PLC服务
///
/// PLC通讯服务实例
public PlcController(PlcService plcService)
{
_plcService = plcService;
}
///
/// 批量测试所有PLC的连接、读写功能(核心接口)
///
/// 批量测试结果
[HttpPost("batch-test")]
[ActionPermissionFilter(Permission = "business:plc:batchtest")]
[Log(Title = "PLC测试", BusinessType = BusinessType.OTHER)]
public async Task BatchTestAllPlc()
{
try
{
var results = await _plcService.BatchTestAllPlcAsync();
return SUCCESS(results);
}
catch (Exception ex)
{
return ToResponse(ApiResult.Error($"批量测试失败:{ex.Message}"));
}
}
///
/// 测试单个PLC的连接、读写功能(调试用)
///
/// 单个PLC配置参数
/// 单PLC测试结果
[HttpPost("single-test")]
[ActionPermissionFilter(Permission = "business:plc:singletest")]
[Log(Title = "PLC测试", BusinessType = BusinessType.OTHER)]
public async Task TestSinglePlc([FromBody] PlcConfig config)
{
if (config == null || string.IsNullOrEmpty(config.Ip))
{
return ToResponse(ApiResult.Error("PLC配置不能为空,IP地址为必填项"));
}
try
{
var result = await _plcService.TestSinglePlcAsync(config);
return SUCCESS(result);
}
catch (Exception ex)
{
return ToResponse(ApiResult.Error($"单PLC测试失败:{ex.Message}"));
}
}
///
/// 单独读取指定PLC的地址数据
///
/// PLC IP地址
/// 读取地址(如DB1.DBD0)
/// 机架号(默认0)
/// 槽位号(默认1)
/// 读取结果
[HttpGet("read")]
[ActionPermissionFilter(Permission = "business:plc:read")]
public async Task ReadPlcData(
[FromQuery] string ip,
[FromQuery] string address,
[FromQuery] short rack = 0,
[FromQuery] short slot = 1)
{
if (string.IsNullOrEmpty(ip))
{
return ToResponse(ApiResult.Error("PLC IP地址不能为空"));
}
if (string.IsNullOrEmpty(address))
{
return ToResponse(ApiResult.Error("PLC读取地址不能为空"));
}
try
{
var (success, value, message) = await _plcService.ReadPlcDataAsync(ip, rack, slot, address);
if (success)
{
return SUCCESS(new { Value = value, Message = message });
}
else
{
return ToResponse(ApiResult.Error(message));
}
}
catch (Exception ex)
{
return ToResponse(ApiResult.Error($"读取PLC数据失败:{ex.Message}"));
}
}
///
/// 单独写入数据到指定PLC地址
///
/// PLC IP地址
/// 写入地址(如DB1.DBD0)
/// 写入值(字符串格式)
/// 机架号(默认0)
/// 槽位号(默认1)
/// 写入结果
[HttpPost("write")]
[ActionPermissionFilter(Permission = "business:plc:write")]
[Log(Title = "PLC数据写入", BusinessType = BusinessType.UPDATE)]
public async Task WritePlcData(
[FromQuery] string ip,
[FromQuery] string address,
[FromQuery] string value,
[FromQuery] short rack = 0,
[FromQuery] short slot = 1)
{
if (string.IsNullOrEmpty(ip))
{
return ToResponse(ApiResult.Error("PLC IP地址不能为空"));
}
if (string.IsNullOrEmpty(address))
{
return ToResponse(ApiResult.Error("PLC写入地址不能为空"));
}
if (string.IsNullOrEmpty(value))
{
return ToResponse(ApiResult.Error("PLC写入值不能为空"));
}
try
{
var (success, message) = await _plcService.WritePlcDataAsync(ip, rack, slot, address, value);
if (success)
{
return SUCCESS(message);
}
else
{
return ToResponse(ApiResult.Error(message));
}
}
catch (Exception ex)
{
return ToResponse(ApiResult.Error($"写入PLC数据失败:{ex.Message}"));
}
}
}
}