278 lines
11 KiB
C#
278 lines
11 KiB
C#
using Gather.Common.Util;
|
||
using GatherAPI.api;
|
||
using HslCommunication.Core;
|
||
using HslCommunication.ModBus;
|
||
using log4net;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.AspNetCore.Hosting;
|
||
using Microsoft.AspNetCore.Http;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Newtonsoft.Json;
|
||
using Newtonsoft.Json.Linq;
|
||
using Pomelo.Data.MySql.Memcached;
|
||
using System.Text;
|
||
|
||
namespace GatherAPI.Controllers
|
||
{
|
||
[Route("api/[controller]")]
|
||
[ApiController]
|
||
public class ControlDeviceController : Controller
|
||
{
|
||
public ControlDeviceController()
|
||
{
|
||
}
|
||
|
||
/// <summary>
|
||
/// 控制设备接口
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public JsonResult Index([FromBody] ControlDeviceRequest req)
|
||
{
|
||
try
|
||
{
|
||
if (string.IsNullOrEmpty(req.ip))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "IP不能为空"));
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(req.port))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "端口号不能为空"));
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(req.station))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "站号不能为空"));
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(req.function_code))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "功能码不能为空"));
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(req.data_type))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "数据类型不能为空"));
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(req.byte_order))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "字节顺序不能为空"));
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(req.is_bit_read))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "是否按二进制位读取不能为空"));
|
||
}
|
||
|
||
if (req.is_bit_read == "1")
|
||
{
|
||
if (string.IsNullOrEmpty(req.bit_index))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "位索引(0-7)不能为空"));
|
||
}
|
||
}
|
||
|
||
|
||
if (string.IsNullOrEmpty(req.attr_value))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "点位不能为空"));
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(req.value))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "值不能为空"));
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(req.start_address_from_zero))
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "是否从0开始不能为空"));
|
||
}
|
||
|
||
var modbusTcp = new ModbusTcpNet(req.ip, int.Parse(req.port), byte.Parse(req.station));
|
||
if (req.start_address_from_zero == "1")
|
||
{
|
||
modbusTcp.AddressStartWithZero = true;
|
||
}
|
||
else
|
||
{
|
||
modbusTcp.AddressStartWithZero = false;
|
||
}
|
||
if (req.function_code == "01")
|
||
{
|
||
modbusTcp.ByteTransform.DataFormat = GetDataFormat(req.byte_order);
|
||
var value = bool.Parse(req.value);
|
||
var result1 = modbusTcp.Write(req.attr_value, value);
|
||
if (result1.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else if (req.function_code == "03")
|
||
{
|
||
modbusTcp.ByteTransform.DataFormat = GetDataFormat(req.byte_order);
|
||
if (req.is_bit_read == "1")
|
||
{
|
||
req.attr_value = req.attr_value + "." + req.bit_index;
|
||
}
|
||
|
||
if (req.data_type == "short")
|
||
{
|
||
var value = short.Parse(req.value);
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else if (req.data_type == "ushort")
|
||
{
|
||
var value = ushort.Parse(req.value);
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else if (req.data_type == "int")
|
||
{
|
||
if (req.is_bit_read == "1")
|
||
{
|
||
bool value = req.value == "1";
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var value = int.Parse(req.value);
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
}
|
||
else if (req.data_type == "uint")
|
||
{
|
||
var value = uint.Parse(req.value);
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else if (req.data_type == "long")
|
||
{
|
||
var value = long.Parse(req.value);
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else if (req.data_type == "ulong")
|
||
{
|
||
var value = ulong.Parse(req.value);
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else if (req.data_type == "float")
|
||
{
|
||
var value = float.Parse(req.value);
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else if (req.data_type == "double")
|
||
{
|
||
var value = double.Parse(req.value);
|
||
var result = modbusTcp.Write(req.attr_value, value);
|
||
if (result.IsSuccess)
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Success, "控制成功"));
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "控制失败"));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "数据类型不支持"));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "功能码不支持"));
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Util.LogHelper.WriteLog(ex.Message + ",行号:" + ex.StackTrace);
|
||
return Json(Tool.GetJsonWithCode(APICode.Fail, "发生错误,请联系管理员。"));
|
||
}
|
||
}
|
||
|
||
private DataFormat GetDataFormat(string byteOrder)
|
||
{
|
||
if (string.IsNullOrEmpty(byteOrder))
|
||
{
|
||
return DataFormat.ABCD;
|
||
}
|
||
switch (byteOrder?.ToUpper())
|
||
{
|
||
case "ABCD": return DataFormat.ABCD;
|
||
case "BADC": return DataFormat.BADC;
|
||
case "CDAB": return DataFormat.CDAB;
|
||
case "DCBA": return DataFormat.DCBA;
|
||
default: return DataFormat.ABCD;
|
||
}
|
||
}
|
||
}
|
||
}
|