2026-01-19 13:46:29 +08:00

175 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// PLC通讯测试接口
/// </summary>
[AllowAnonymous]
[Route("PLC")]
public class PlcController : BaseController
{
/// <summary>
/// PLC通讯服务
/// </summary>
private readonly PlcService _plcService;
/// <summary>
/// 构造函数注入PLC服务
/// </summary>
/// <param name="plcService">PLC通讯服务实例</param>
public PlcController(PlcService plcService)
{
_plcService = plcService;
}
/// <summary>
/// 批量测试所有PLC的连接、读写功能核心接口
/// </summary>
/// <returns>批量测试结果</returns>
[HttpPost("batch-test")]
[Log(Title = "PLC测试", BusinessType = BusinessType.OTHER)]
public async Task<IActionResult> BatchTestAllPlc()
{
try
{
var results = await _plcService.BatchTestAllPlcAsync();
return SUCCESS(results);
}
catch (Exception ex)
{
return ToResponse(ApiResult.Error($"批量测试失败:{ex.Message}"));
}
}
/// <summary>
/// 测试单个PLC的连接、读写功能调试用
/// </summary>
/// <param name="config">单个PLC配置参数</param>
/// <returns>单PLC测试结果</returns>
[HttpPost("single-test")]
[ActionPermissionFilter(Permission = "business:plc:singletest")]
[Log(Title = "PLC测试", BusinessType = BusinessType.OTHER)]
public async Task<IActionResult> 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}"));
}
}
/// <summary>
/// 单独读取指定PLC的地址数据
/// </summary>
/// <param name="ip">PLC IP地址</param>
/// <param name="address">读取地址如DB1.DBD0</param>
/// <param name="rack">机架号默认0</param>
/// <param name="slot">槽位号默认1</param>
/// <returns>读取结果</returns>
[HttpGet("read")]
[ActionPermissionFilter(Permission = "business:plc:read")]
public async Task<IActionResult> 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}"));
}
}
/// <summary>
/// 单独写入数据到指定PLC地址
/// </summary>
/// <param name="ip">PLC IP地址</param>
/// <param name="address">写入地址如DB1.DBD0</param>
/// <param name="value">写入值(字符串格式)</param>
/// <param name="rack">机架号默认0</param>
/// <param name="slot">槽位号默认1</param>
/// <returns>写入结果</returns>
[HttpPost("write")]
[ActionPermissionFilter(Permission = "business:plc:write")]
[Log(Title = "PLC数据写入", BusinessType = BusinessType.UPDATE)]
public async Task<IActionResult> 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}"));
}
}
}
}