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; using RIZO.Admin.WebApi.PLC.Service; using RIZO.Admin.WebApi.PLC.Model; // 创建时间:2026-01-16 namespace RIZO.Admin.WebApi.PLC.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")] [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}")); } } } }