IPC-610
2024-09-22 d79fcd9534d97f5bbb4edb66dbb925dea0479304
ssd12313
8个文件已修改
3个文件已添加
1601 ■■■■■ 已修改文件
Admin.NET/WCS.Application/Configuration/Database.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Model/TaskRequest.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/OpenApi/DemoOpenApi.cs 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/OpenApi/Dto/WCSResultModel.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/OpenApi/Dto/WCSTasks.cs 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCCommon.cs 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Util/HttpService.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Util/LedDll.cs 1147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/WCS.Application.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Configuration/Database.json
@@ -11,7 +11,7 @@
        //"ConnectionString": "PORT=5432;DATABASE=xxx;HOST=localhost;PASSWORD=xxx;USER ID=xxx", // PostgreSQL 库连接字符串
        //"ConnectionString": "Server=localhost;Database=xxx;Uid=xxx;Pwd=xxx;SslMode=None;", // MySql 库连接字符串",
        //"ConnectionString": "User Id=xxx; Password=xxx; Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))", // Oracle 库连接字符串
        "ConnectionString": "Server=192.168.62.200;Database=WCSnet6;User Id=sa;Password=sql2019;", // SqlServer 库连接字符串
        "ConnectionString": "Server=10.18.99.10;Database=WCSnet6;User Id=sa;Password=sql2024;", // SqlServer 库连接字符串
        //"SlaveConnectionConfigs": [ // 读写分离/主从
        //    {
Admin.NET/WCS.Application/Model/TaskRequest.cs
@@ -7,6 +7,17 @@
    public TaskTypeEnum TaskType { get; set; }                        // 任务类型
    public TaskStatusEnum TaskStatus { get; set; }                      // 任务状态 0 等待执行 1 正在执行 2 执行完成 3 异常结束   4 任务取消
}
public class TaskRequestWMS
{
    public string TaskNo { get; set; }                          // 任务号
    public string PalletNo { get; set; }                        // 托盘号
    public string TaskType { get; set; }                        // 任务类型
    public string TaskStatus { get; set; }                      // 任务状态 0 等待执行 1 正在执行 2 执行完成 3 异常结束   4 任务取消
}
/// <summary>
/// 申请巷道WMS返回的实体
/// </summary>
public class ResponseTasks
{
    public string StatusCode { get; set; }
@@ -17,6 +28,16 @@
    public ResponseTasksModel TaskList { get; set; }
}
/// <summary>
/// 任务完成 WMS返回实体
/// </summary>
public class ResponseModel
{
    public int StatusCode { get; set; }
    public string Msg { get; set; }
}
public class ResponseTasksModel
{
    /// <summary>
Admin.NET/WCS.Application/OpenApi/DemoOpenApi.cs
@@ -1,22 +1,84 @@
namespace WCS.Application;
using System.Diagnostics.CodeAnalysis;
using System.Text;
using WCS.Application.OpenApi.Dto;
///// <summary>
///// 示例开放接口
///// </summary>
//[ApiDescriptionSettings("开放接口", Name = "Demo", Order = 100)]
namespace WCS.Application;
/// <summary>
/// 示例开放接口
/// </summary>
[ApiDescriptionSettings("开放接口", Name = "Demo", Order = 100)]
//[Authorize(AuthenticationSchemes = SignatureAuthenticationDefaults.AuthenticationScheme)]
//public class DemoOpenApi : IDynamicApiController
//{
//    private readonly UserManager _userManager;
public class DemoOpenApi : IDynamicApiController
{
    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
//    public DemoOpenApi(UserManager userManager)
//    {
//        _userManager = userManager;
//    }
    private readonly UserManager _userManager;
//    [HttpGet("helloWord")]
//    public Task<string> HelloWord()
//    {
//        return Task.FromResult($"Hello word. {_userManager.Account}");
//    }
//}
    public DemoOpenApi(UserManager userManager)
    {
        _userManager = userManager;
    }
    //[HttpGet("helloWord")]
    //public Task<string> HelloWord()
    //{
    //    return Task.FromResult($"Hello word. {_userManager.Account}");
    //}
    /// <summary>
    /// WCS接受WMS下发的任务(单条任务)
    /// </summary>
    /// <param name="models">任务信息</param>
    /// <returns>反馈信息</returns>
    [AllowAnonymous]
    public WCSResultModel AddWcsTask(WCSTasks models)
    {
        WCSResultModel result = new WCSResultModel();
        try
        {
            // 验证任务是否已存在
            var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == models.TaskNo);
            if (taskInfo != null)
            {
                result.StatusCode = "-1";
                result.Msg = "任务:" + models.TaskNo + ";已存在!";
                return result;
            }
            if (models.Type == "0")
            {
                models.Levels = "1.5";
            }
            else
            {
                models.Levels = "2";
            }
            //新增任务
            var taskAdd = new WcsTask()
            {
                TaskNo = models.TaskNo,
                TaskType = TaskTypeEnum.Out,
                Status = TaskStatusEnum.Wait,
                //IsSuccess =TaskSuccessEnum.Success,
                Origin = "WMS",
                StartRoadway= models.StartRoadway,
                StartLocate = models.StartLocate,
                EndLocate = models.EndLocate,
                EndRoadway= models.EndRoadway,
                PalletNo = models.PalletNo,
                LotNo =models.LotNo,
                SkuNo=models.SkuNo,
                SkuName=models.SkuName,
                Qty=models.Qty
            };
            _db.Insertable(taskAdd).ExecuteCommand();
            return new WCSResultModel() { StatusCode = "1", Msg = "插入成功" };
        }
        catch (Exception ex)
        {
            return new WCSResultModel() { StatusCode = "-1", Msg = ex.Message };
        }
    }
}
Admin.NET/WCS.Application/OpenApi/Dto/WCSResultModel.cs
New file
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WCS.Application.OpenApi.Dto;
public class WCSResultModel
{
    /// <summary>
    /// 1:成功  -1:失败
    /// </summary>
    public string StatusCode { get; set; }
    public string Msg { get; set; }
}
Admin.NET/WCS.Application/OpenApi/Dto/WCSTasks.cs
New file
@@ -0,0 +1,141 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WCS.Application.OpenApi.Dto;
/// <summary>
/// 任务实体类
/// </summary>
public class WCSTasks
{
    public int? Id { get; set; }
    /// <summary>
    /// 任务号
    /// </summary>
    public string TaskNo { get; set; }
    /// <summary>
    /// 任务类型
    /// </summary>
    public string Type { get; set; }
    /// <summary>
    /// 状态
    /// </summary>
    public string Status { get; set; }
    /// <summary>
    /// 是否回馈成功
    /// </summary>
    public int? IsSuccess { get; set; }
    /// <summary>
    /// 异常信息
    /// </summary>
    public string Information { get; set; }
    /// <summary>
    /// 来源
    /// </summary>
    public string Origin { get; set; }
    /// <summary>
    /// 起始位置
    /// </summary>
    public string StartLocat { get; set; }
    public string StartLocate { get; set; }
    /// <summary>
    /// 起始巷道
    /// </summary>
    public string StartRoadway { get; set; }
    /// <summary>
    /// 目标位置
    /// </summary>
    public string EndLocate { get; set; }
    /// <summary>
    /// 目标巷道
    /// </summary>
    public string EndRoadway { get; set; }
    /// <summary>
    /// 托盘号
    /// </summary>
    public string PalletNo { get; set; }
    /// <summary>
    /// 托盘类型
    /// </summary>
    public string PalletType { get; set; }
    /// <summary>
    /// 批次号
    /// </summary>
    public string LotNo { get; set; }
    /// <summary>
    /// 供货批次
    /// </summary>
    public string SupplierLot { get; set; }
    /// <summary>
    /// 物料编码
    /// </summary>
    public string SkuNo { get; set; }
    /// <summary>
    /// 物料名称
    /// </summary>
    public string SkuName { get; set; }
    /// <summary>
    /// 物料类型
    /// </summary>
    public string SkuType { get; set; }
    /// <summary>
    /// 数量
    /// </summary>
    public int? Qty { get; set; }
    /// <summary>
    /// 取消时间
    /// </summary>
    public DateTime? CancelDate { get; set; }
    /// <summary>
    /// 完成时间
    /// </summary>
    public DateTime? FinishDate { get; set; }
    /// <summary>
    /// 最后写入流程控制字值
    /// </summary>
    public string WcsPosValue { get; set; }
    /// <summary>
    /// 优先级
    /// </summary>
    public string Levels { get; set; }
    /// <summary>
    /// 是否裹包
    /// </summary>
    public string IsBale { get; set; }
    /// <summary>
    /// 是否打带
    /// </summary>
    public string IsBelt { get; set; }
    /// <summary>
    /// 是否同步到WMS
    /// </summary>
    public string SyncWms { get; set; }
    /// <summary>
    /// 备注
    /// </summary>
    public string Demo { get; set; }
    public string IsStacking1 { get; set; }
    public string IsStacking2 { get; set; }
    public string IsStacking3 { get; set; }
    public string Dismantling { get; set; }
    /// <summary>
    /// 物料任务类型
    /// </summary>
    public string TaskType { get; set; }
    public string IsDel { get; set; }
    public DateTime? TopTime { get; set; }
    public DateTime? CreateTime { get; set; }
    public int? CreateUser { get; set; }
    public DateTime? UpdateTime { get; set; }
    public int? UpdateUser { get; set; }
    public string OutMode { get; set; }
    public int Order { get; set; }
}
Admin.NET/WCS.Application/PLC/PLCCommon.cs
@@ -556,33 +556,42 @@
        //var conveyList2 = new List<string>() { "252", "254", "260", "262", "272", "270", "278", "280", "288", "290", "294", "301", "307", "309", "315", "317", "325", "327", "331", "337" };
        //var conveyList3 = new List<string>() { "401", "402", "405", "406", "409", "410", "413", "414", "417", "418", "421", "422", "425", "426", "429", "430", "433", "434", "437", "438" };
        var ipInfo = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.StackingMachine || s.Type == PLCTypeEnum.ConveyorLine || s.Type == PLCTypeEnum.BoxConveyorLine);
        var ip1 = ipInfo.First(m=>m.Text == "1层托盘输送线");
        var ip2 = ipInfo.First(m=>m.Text == "2层托盘输送线");
        var ip3 = ipInfo.First(m=>m.Text == "3层托盘输送线");
        var dev1 = PLCTaskAction.plcDevices.Where(m => m.IsDelete == false && m.PlcId == ip1.Id).Select(m=>m.StationNum).ToList();
        var dev2 = PLCTaskAction.plcDevices.Where(m => m.IsDelete == false && m.PlcId == ip2.Id).Select(m => m.StationNum).ToList();
        var dev3 = PLCTaskAction.plcDevices.Where(m => m.IsDelete == false && m.PlcId == ip3.Id).Select(m => m.StationNum).ToList();
        var ipInfo = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.StackingMachine || s.Type == PLCTypeEnum.ConveyorLine);
        var ip1 = ipInfo.First(m => m.Text == "1层托盘输送线");
        var ip2 = ipInfo.First(m => m.Text == "2层托盘输送线");
        var ip3 = ipInfo.First(m => m.Text == "3层托盘输送线");
        if (dev1.Contains(StationNum))
        if (ip1 != null)
        {
            value = "1";
        }
        else if (dev2.Contains(StationNum))
        {
            value = "2";
        }
        else if (dev3.Contains(StationNum))
        {
            value = "3";
        }
        else
        {
            throw new Exception("工位未查询到");
            var dev1 = PLCTaskAction.plcDevices.Where(m => m.IsDelete == false && m.PlcId == ip1.Id).Select(m => m.StationNum).ToList();
            if (dev1.Contains(StationNum))
            {
                value = "1";
                return value;
            }
        }
        return value;
        if (ip2 != null)
        {
            var dev2 = PLCTaskAction.plcDevices.Where(m => m.IsDelete == false && m.PlcId == ip2.Id).Select(m => m.StationNum).ToList();
            if (dev2.Contains(StationNum))
            {
                value = "2";
                return value;
            }
        }
        if (ip3 != null)
        {
            var dev3 = PLCTaskAction.plcDevices.Where(m => m.IsDelete == false && m.PlcId == ip3.Id).Select(m => m.StationNum).ToList();
            if (dev3.Contains(StationNum))
            {
                value = "3";
                return value;
            }
        }
        throw new Exception("工位未查询到");
    }
    /// <summary>
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -10,6 +10,7 @@
using System;
using System.Data;
using System.Reflection.Emit;
using WCS.Application.Util;
namespace WCS.Application;
public static class PLCService
@@ -70,7 +71,7 @@
                    }
                    // 根据目标地址和巷道获取放货工位对应的排列层
                    PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, modTask.TaskType.ToString(),
                    PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, ((int)modTask.TaskType).ToString(),
                        modTask.StartRoadway, modTask.EndRoadway);
                    // 目标工位不为null,需先判断放货工位是否空闲
@@ -197,7 +198,7 @@
                    {
                        // 获取任务信息
                        string tasknoVal = val.ToString();
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == true);
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false);
                        if (modTask == null)
                        {
                            Log.Error(string.Format("PLC控制字840:未找到对应的任务。"));
@@ -218,16 +219,16 @@
                        {
                            // 获取跺机起始工位点位配置,读取起始工位
                            var modPosStartStation = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位");
                            var (startStationRes, startStationVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosStartStation.PlcPos);
                            var (startStationRes, startStationVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Short, modDevice.DbNumber, modPosStartStation.PlcPos);
                            if (startStationRes.IsSucceed)
                            {
                                // 根据工位号获取对应的输送线IP
                                var plcConveyorConn = PLCCommon.GetPlcIp(startStationVal);
                                var plcConveyorConn = PLCCommon.GetPlcIp(startStationVal.ToString());
                                if (plcConveyorConn.Connected)
                                {
                                    // 向取货工位写入流程字640  取货已完成
                                    var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == startStationVal
                                                            && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == true);
                                    var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == startStationVal.ToString()
                                                            && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false);
                                    var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640");
                                    var modcTaskMonitor = new WcsTaskMonitor()
                                    {
@@ -236,7 +237,7 @@
                                        PlcName = ConveyorMod.Text,
                                        PalletNo = modTask.PalletNo,
                                        Status = TaskStatusEnum.Complete,
                                        StartLocat = startStationVal,
                                        StartLocat = startStationVal.ToString(),
                                        EndLocat = modTask.EndLocate                  // 目标储位地址
                                    };
                                    if (!retc.IsSucceed)
@@ -283,6 +284,11 @@
                            // 记录任务明细
                            modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成", modTask.StartLocate);
                            modInsertTaskMonitor.EndLocat = endStation;                  // 放货工位
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        else
                        {
@@ -295,12 +301,13 @@
                            modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成", modTask.StartLocate);
                            modInsertTaskMonitor.EndLocat = endStation;                  // 目标储位
                        }
                        // 插入交互日志
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                        //下发任务日志
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        //修改led屏信息
                        //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
                    }
@@ -315,7 +322,7 @@
                    if (res.IsSucceed)
                    {
                        string tasknoVal = val.ToString();
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == true);
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false);
                        if (modTask == null)
                        {
                            Log.Error(string.Format("跺机控制字860:未找到对应的任务。"));
@@ -352,24 +359,35 @@
                                    if (modTask.Origin == "WMS")
                                    {
                                        // 反馈WMS
                                        var requestMode = new TaskRequest()
                                        var requestMode = new TaskRequestWMS()
                                        {
                                            TaskNo = modTask.TaskNo,
                                            PalletNo = modTask.PalletNo,
                                            TaskType = TaskTypeEnum.In,
                                            TaskStatus = TaskStatusEnum.Complete
                                            TaskType = ((int)TaskTypeEnum.In).ToString(),
                                            TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
                                        };
                                        HttpService httpService = new HttpService();
                                        var modResponseTask = httpService.RequestTask(requestMode).Result;
                                        if (modResponseTask.StatusCode == "0")
                                        if (modResponseTask.StatusCode == 0)
                                        {
                                            modTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成";
                                        }
                                        else
                                        {
                                            Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg));
                                        }
                                    }
                                    // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                                    var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == modTask.TaskNo);
                                    modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First();
                                    // 插入交互日志
                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
                                    //下发任务日志
                                    HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    // led显示内容
                                    LedDisplay(modDevice.LedIP, "工位:" + modTask.StartLocate, "入库完成 " + $"任务完成:{modTask.TaskNo}", "托盘号:" + modTask.PalletNo);
                                    // 此处添加不空跑业务
                                }
@@ -478,16 +496,16 @@
                                    if (modTask.Origin == "WMS")
                                    {
                                        // 反馈WMS
                                        var requestMode = new TaskRequest()
                                        var requestMode = new TaskRequestWMS()
                                        {
                                            TaskNo = modTask.TaskNo,
                                            PalletNo = modTask.PalletNo,
                                            TaskType = TaskTypeEnum.Move,
                                            TaskStatus = TaskStatusEnum.Complete
                                            TaskType = TaskTypeEnum.Move.ToString(),
                                            TaskStatus = TaskStatusEnum.Complete.ToString()
                                        };
                                        HttpService httpService = new HttpService();
                                        var modResponseTask = httpService.RequestTask(requestMode).Result;
                                        if (modResponseTask.StatusCode == "0")
                                        if (modResponseTask.StatusCode == 0)
                                        {
                                            modcTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成";
                                            //修改储位信息 任务类型 执行状态 起始位置 目标位置
@@ -752,6 +770,10 @@
                    if (!strMsg.Contains("-1"))
                    {
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo);
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First();
                        // 写入330
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "330");
@@ -775,9 +797,8 @@
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                            //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
                            // led显示内容
                            LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"目标巷道:{EndLocate}", "托盘号:" + palletVal);
                        }
                    }
@@ -790,6 +811,7 @@
                break;
            case "330":
                {
                    // 写入任务 托盘移动 340
                    // 获取工位托盘码信息
@@ -838,6 +860,8 @@
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "340");
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First();
                        if (ret.IsSucceed)
                        {
@@ -860,8 +884,8 @@
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
                            // led显示内容
                            LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "入库中 " + $"目标巷道:{endLocatVlue}", "托盘号:" + palletVal);
                        }
                    }
@@ -896,6 +920,11 @@
                    string TaskNo = "";
                    // 向WMS申请储位信息
                    strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, roadway, ref TaskNo);
                    // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                    var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo);
                    modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First();
                    if (!strMsg.Contains("-1"))
                    {
                        // 写入流程字 630
@@ -921,9 +950,8 @@
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                            //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
                            // led显示内容
                            LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "入库中 " + $"申请储位地址:{strMsg}", "托盘号:" + palletVal);
                        }
                    }
                    else
@@ -982,7 +1010,9 @@
                        string lie = int.Parse(endLocate.Substring(2, 2)).ToString();
                        string ceng = int.Parse(endLocate.Substring(4, 2)).ToString();
                        var djMod = PLCTaskAction.plcDevices.First(m => m.StationNum == modTask.EndRoadway
                        var djmodel = _db.Queryable<WcsPlc>().First(m => m.IP == sInfo.Ip);
                        var djMod = PLCTaskAction.plcDevices.First(m => m.PlcId == djmodel.Id
                            && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false);
                        var djInfos = PLCTaskAction.plcPositions.Where(m => m.IsDelete == false && m.DeviceId == djMod.Id).ToList();
                        var djInfo = djInfos.First(m => m.Text == "PLC流程字");
@@ -990,7 +1020,7 @@
                        // 获取跺机当前状态
                        var (djRes, djVal) = plcStackeConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos);
                        if (!djRes.IsSucceed || djVal != "820")
                        if (!djRes.IsSucceed || djVal.ToString() != "820")
                        {
                            // 跺机非空闲等待
                            break;
@@ -1004,7 +1034,7 @@
                        var modPosTaskType = djInfos.FirstOrDefault(s => s.Text == "任务类型");
                        var taskTypeStr = (int)modTask.TaskType;
                        listResult.Add(plcStackeConn.SetPlcDBValue(modPosTaskType.PosType, djMod.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString()));
                        var modPosPalletNo = djInfos.FirstOrDefault(s => s.Text == "托盘号");
                        var modPosPalletNo = djInfos.FirstOrDefault(s => s.Text == "托盘码");
                        listResult.Add(plcStackeConn.SetPlcDBValue(modPosPalletNo.PosType, djMod.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                        //起始工位
@@ -1202,6 +1232,23 @@
        }
    }
    /// <summary>
    /// Led屏展示信息
    /// </summary>
    /// <param name="ip">地址</param>
    /// <param name="top">上方区域</param>
    /// <param name="content">中间区域</param>
    /// <param name="foot">底部区域</param>
    private static void LedDisplay(string ip, string top, string content, string foot)
    {
        try
        {
            LedDll Led = new LedDll();
            Led.LEDstr(ip, top, content, foot);
        }
        catch { }
    }
    private static void Test(WcsDeviceDto modDevice)
    {
        //写死测试读string
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -171,7 +171,7 @@
                            }
                        }
                        Thread.Sleep(10000);
                        Thread.Sleep(1000);
                    }
                    catch (OperationCanceledException)
                    {
Admin.NET/WCS.Application/Util/HttpService.cs
@@ -99,7 +99,9 @@
        string returnStr = "";
        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo && string.IsNullOrWhiteSpace(m.EndLocate));
        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false
        && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)
        && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo && !string.IsNullOrWhiteSpace(m.EndLocate));
        if (task == null)
        {
@@ -168,10 +170,10 @@
    /// </summary>
    /// <param name="model">任务完成状态</param>
    /// <returns></returns>
    public async Task<ResponseTasks> RequestTask(TaskRequest model)
    public async Task<ResponseModel> RequestTask(TaskRequestWMS model)
    {
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = await (url + "/api/DownAPi/ReceiveWcsSignal").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>();
        var result = await (url + "/api/DownAPi/ReceiveWcsSignal").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseModel>();
        Log.Information("调用WMS接口反馈任务接口" + result.ToJson());
        return result;
    }
Admin.NET/WCS.Application/Util/LedDll.cs
New file
@@ -0,0 +1,1147 @@
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace WCS.Application.Util;
public class LedDll
{
    //颜色值 R 0x0000ff   G 0x00ff00   B 0xff0000
    public const int COLOR_RED = 0xff;          //红色
    public const int COLOR_GREEN = 0xff00;      //绿色
    public const int COLOR_YELLOW = 0xffff;     //黄色
    public const int ADDTYPE_STRING = 0;     //添加类型为字符串
    public const int ADDTYPE_FILE = 1;      //添加类型为文件
    public const int OK = 0;//函数返回成功
    //******节目定时启用日期时间星期的标志宏***************************************************************************
    public const int ENABLE_DATE = 0x01;
    public const int ENABLE_TIME = 0x02;
    public const int ENABLE_WEEK = 0x04;
    //*****************************************************************************************************************
    //******节目定时星期里某天启用宏***********************************************************
    public const int WEEK_MON = 0x01;
    public const int WEEK_TUES = 0x02;
    public const int WEEK_WEN = 0x04;
    public const int WEEK_THUR = 0x08;
    public const int WEEK_FRI = 0x10;
    public const int WEEK_SAT = 0x20;
    public const int WEEK_SUN = 0x40;
    //*****************************************************************************
    //[StructLayout(LayoutKind.Sequential, Size = 8, CharSet = CharSet.Unicode, Pack = 1)]
    //**通讯设置结构体*********************************************************
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct COMMUNICATIONINFO
    {
        public int LEDType;             ////LED类型    0.6代T系A系XC系    1.6代E系     2.X1X2        3.7代C系
        public int SendType;                //通讯方式    0.为Tcp发送(又称固定IP通讯),        1.广播发送(又称单机直连)        2.串口通讯        3.磁盘保存     4.广域网通讯
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string IpStr;                //LED屏的IP地址,只有通讯方式为0时才需赋值,其它通讯方式无需赋值
        public int Commport;                //串口号,只有通讯方式为2时才需赋值,其它通讯方式无需赋值
        public int Baud;                    //波特率,只有通讯方式为2时才需赋值,其它通讯方式无需赋值,   0.9600   1.57600   2.115200  直接赋值 9600,19200,38400,57600,115200亦可
        public int LedNumber;               //LED的屏号,只有通讯方式为2时,且用485通讯时才需赋值,其它通讯方式无需赋值
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string OutputDir;    //磁盘保存的目录,只有通讯方式为3时才需赋值,其它通讯方式无需赋值
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 19)]
        public string networkIdStr;             //网络ID,只有通讯方式为4时才需赋值,其它通讯方式无需赋值
    };
    //***********************************************************************
    //**区域坐标结构体*********************************************************
    public struct AREARECT
    {
        public int left;    //区域左上角横坐标
        public int top; //区域左上角纵坐标
        public int width;   //区域的宽度
        public int height;  //区域的高度
    };
    //****************************************************************************
    //***字体属性结构对**********************************************************
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct FONTPROP
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string FontName;     //字体名
        public int FontSize;            //字号(单位磅)
        public int FontColor;           //字体颜色
        public int FontBold;            //是否加粗
        public int FontItalic;          //是否斜体
        public int FontUnderLine;       //时否下划线
    };
    //****************************************************************************
    //**页面显示的属性结构体****************************************************
    public struct PLAYPROP
    {
        public int InStyle; //入场特技值(取值范围 0-38)
        public int OutStyle;    //退场特技值(现无效,预留,置0)
        public int Speed;       //特技显示速度(取值范围1-255) 值越大,速度越慢
        public int DelayTime;   //页面留停时间(1-65535)   注:当入场特技为连续左移、连续右移、连续上移、连续下移时,此参数无效
    };
    /*  特技值对应
        0=立即显示
        1=随机
        2=左移
        3=右移
        4=上移
        5=下移
        6=连续左移
        7=连续右移
        8=连续上移
        9=连续下移
        10=闪烁
        11=激光字(向上)
        12=激光字(向下)
        13=激光字(向左)
        14=激光字(向右)
        15=水平交叉拉幕
        16=上下交叉拉幕
        17=左右切入
        18=上下切入
        19=左覆盖
        20=右覆盖
        21=上覆盖
        22=下覆盖
        23=水平百叶(左右)
        24=水平百叶(右左)
        25=垂直百叶(上下)
        26=垂直百叶(下上)
        27=左右对开
        28=上下对开
        29=左右闭合
        30=上下闭合
        31=向左拉伸
        32=向右拉伸
        33=向上拉伸
        34=向下拉伸
        35=分散向左拉伸
        36=分散向右拉伸
        37=冒泡
        38=下雪
     */
    //*******************************************************************************
    //**设置节目定时属性结构体****************************************************
    public struct PROGRAMTIME
    {
        public int EnableFlag;      //启用定时的标记,ENABLE_DATE为启用日期,ENABLE_TIME为启用时间,ENABLE_WEEK为启用星期,可用或运算进行组合,如 ENABLE_DATE | ENABLE_TIME | ENABLE_WEEK
        public int WeekValue;       //启用星期后,选择要定时的星期里的某些天,用宏 WEEK_MON,WEEK_TUES,WEEK_WEN,WEEK_THUR,WEEK_FRI,WEEK_SAT,WEEK_SUN 通过或运算进行组合
        public int StartYear;       //起始年
        public int StartMonth;      //起始月
        public int StartDay;        //起始日
        public int StartHour;       //起姐时
        public int StartMinute; //起始分
        public int StartSecond; //起始秒
        public int EndYear;     //结束年
        public int EndMonth;        //结束月
        public int EndDay;          //结束日
        public int EndHour;     //结束时
        public int EndMinute;       //结束分
        public int EndSecond;       //结束秒
    };
    //**********************************************************************************
    //数字时钟属性结构体*********************************************************************************
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct DIGITALCLOCKAREAINFO
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string ShowStr;          //自定义显示字符串
                                        //[MarshalAs(UnmanagedType.Struct)]
        public FONTPROP ShowStrFont;            //自定义显示字符串以及日期星期时间的字体属性,注意此字体属性里的FontColor只对自定义显示字体有效,其它项的颜色有单独的颜色属性,属性的赋值见FONTPROP结构体说明
        public int TimeLagType;         //时差类型 0为超前,1为滞后
        public int HourNum;             //时差小时数
        public int MiniteNum;               //时差分钟数
        public int DateFormat;              //日期格式 0.YYYY年MM月DD日  1.YY年MM月DD日  2.MM/DD/YYYY  3.YYYY/MM/DD  4.YYYY-MM-DD  5.YYYY.MM.DD  6.MM.DD.YYYY  7.DD.MM.YYYY
        public int DateColor;               //日期字体颜色  格式是16进制 BBGGRR(如:红色0xff 绿色0xff00 黄色0xffff)
        public int WeekFormat;              //星期格式 0.星期X  1.Monday  2.Mon.
        public int WeekColor;               //星期字体颜色
        public int TimeFormat;              //时间格式 0.HH时mm分ss秒  1.HH時mm分ss秒  2.HH:mm:ss  3.上午 HH:mm:ss  4.AM HH:mm:ss  5.HH:mm:ss 上午  6.HH:mm:ss AM
        public int TimeColor;               //时间字体颜色
        public int IsShowYear;              //是否显示年 TRUE为显示 FALSE不显示 下同
        public int IsShowWeek;              //是否显示星期
        public int IsShowMonth;         //是否显示月
        public int IsShowDay;               //是否显示日
        public int IsShowHour;              //是否显示时
        public int IsShowMinute;            //是否显示分
        public int IsShowSecond;            //是否显示秒
        public int IsMutleLineShow;     //是否多行显示
    };
    //******************************************************************************
    //**模拟时钟属性结构体*********************************************************
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct CLOCKAREAINFO
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
        public string ShowStr;          //自定义显示字符串
        public FONTPROP ShowStrFont;            //自定义显示字符串字体属性
        public int TimeLagType;         //时差类型 0为超前,1为滞后
        public int HourNum;             //时差小时数
        public int MiniteNum;               //时差分钟数
        public int ClockType;               //表盘类型  0.圆形  1.正方形
        public int HourMarkColor;          //时标颜色    格式是16进制 BBGGRR(如:红色0xff 绿色0xff00 黄色0xffff)
        public int HourMarkType;            //时标类型    0.圆形  1.正方形
        public int HourMarkWidth;           //时标宽度    1~16
        public int MiniteMarkColor;     //分标颜色
        public int MiniteMarkType;          //分标类型    0.圆形  1.正方形
        public int MiniteMarkWidth;     //分标宽度  1~16
        public int HourPointerColor;        //时针颜色
        public int MinutePointerColor;      //分针颜色
        public int SecondPointerColor;      //秒针颜色
        public int HourPointerWidth;        //时针的宽度  1~5
        public int MinutePointerWidth;      //分针的宽度  1~5
        public int SecondPointerWidth;      //秒针的宽度  1~5
        public int IsShowDate;              //是否显示日期
        public int DateFormat;              //日期格式 0.YYYY年MM月DD日  1.YY年MM月DD日  2.MM/DD/YYYY  3.YYYY/MM/DD  4.YYYY-MM-DD  5.YYYY.MM.DD  6.MM.DD.YYYY  7.DD.MM.YYYY
        public FONTPROP DateFont;               //日期字体属性
        public int IsShowWeek;              //是否显示星期
        public int WeekFormat;              //星期格式 0.星期X  1.Monday  2.Mon.
        public FONTPROP WeekFont;               //星期字体属性
    };
    //**************************************************************************************
    //**计时属性结构体**********************************************************************
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct TIMEAREAINFO
    {
        public int ShowFormat;              //显示格式    0.xx天xx时xx分xx秒  1.xx天xx時xx分xx秒  2.xxDayxxHourxxMinxxSec  3.XXdXXhXXmXXs  4.xx:xx:xx:xx
        public int nYear;                   //结束年
        public int nMonth;                  //结束月
        public int nDay;                    //结束日
        public int nHour;                   //结束时
        public int nMinute;             //结束分
        public int nSecond;             //结束秒
        public int IsShowDay;               //是否显示天
        public int IsShowHour;              //是否显示时
        public int IsShowMinute;            //是否显示分
        public int IsShowSecond;            //是否显示秒
        public int IsMutleLineShow;     //是否多行显示,指的是自定义文字与计时文字是否分行显示
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string ShowStr;          //自定义文字字符串
        public int TimeStrColor;            //计时文字的颜色
        public FONTPROP ShowFont;               //自定义文字及计时文字颜色,其中FontColor只对文定义文字有效,计时文字颜色为TimeStrColor
    };
    //****************************************************************************************
    //**LED通讯参数修改结构体*****************************************************************
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct LEDCOMMUNICATIONPARAMETER
    {
        public int dwMask;              //要修改项的标记  0.修改网络通讯参数  1.修改串口通讯参数  2.修改网口和串口通讯参数
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string IpStr;            //新的IP地址,只有dwMask为0或2时才需赋值,其它值无需赋值,格式例如 192.168.1.100
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string NetMaskStr;       //新的子网掩码,只有dwMask为0或2时才需赋值,其它值无需赋值,格式例如 255.255.255.0
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string GatewayStr;       //新的网关,只有dwMask为0或2时才需赋值,其它值无需赋值,格式例如 192.168.1.1
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
        public string MacStr;           //新的MAC地址,只有dwMask为0或2时才需赋值,其它值无需赋值,格式例如 12-34-56-78-9a-bc,如无需修改请设为 ff-ff-ff-ff-ff-ff
        public int Baud;                //波特率,只有dwMask为1或2时才需赋值,其它值无需赋值,0.9600  1.57600  2.115200
        public int LedNumber;           //LED屏号 1~255,网络通讯和232通讯赋值 1 即可,485必需和控制卡显示的屏号相同才可通讯
    };
    //*****************************************************************************************
    //**流水边框属性结构体************************************************************************
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct WATERBORDERINFO
    {
        public int Flag;                            //流水边框加载类型标志,0.为动态库预置的边框  1.为从文件加载的边框
        public int BorderType;                      //边框的类型,Flag为0是有效,0.单色边框  1.双基色边框  2.全彩边框
        public int BorderValue;                 //边框的值,Flag为0是有效,单色边框取值范围是0~39,双基色边框取值范围是0~34,全彩边框取值范围是0~21
        public int BorderColor;                 //边框线颜色,Flag为0并且BorderType为0是才有效
        public int BorderStyle;                 //边框显示的样式  0.固定  1.顺时针  2.逆时针  3.闪烁
        public int BorderSpeed;//边框流动的速度
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string WaterBorderBmpPath;   //边框图片文件的路径,注意只能是bmp图片,图片大小必需是宽度为32点,取高度小于等于8
    };
    //*********************************************************************************************
    //**定时开关屏设置属性************************************************************************
    public struct ONOFFTIMEINFO
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] TimeFlag;                          //支持3个定时,1代表打开  0关闭
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] StartHour;                         //开始时钟
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] StartMinute;                       //开始分钟
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] EndHour;                           //结束时钟
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] EndMinute;                         //结束分钟
    };
    //********************************************************************************************
    //**定时亮度设置属性**************************************************************************
    public struct BRIGHTNESSTIMEINFO
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] TimeFlag;                          //支持3个定时,1代表打开  0关闭
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] StartHour;                         //开始时钟
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] StartMinute;                       //开始分钟
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] EndHour;                           //结束时钟
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] EndMinute;                         //结束分钟
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] BrightnessValue;                   //亮度值0~15
    };
    //*******************************************************************************************
    [UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
    public delegate int SERVERINFOCALLBACK(int Msg, int wParam, IntPtr ptr);
    public enum LV_MSG
    {
        LV_MSG_NONE,
        LV_MSG_CARD_ONLINE,//上线通知,通过CARD_INFO结构体指针获取详细上线信息
        LV_MSG_CARD_OFFLINE,//下线通知,通过CARD_INFO结构体指针获取详细下线信息
    };
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct CARD_INFO
    {
        public int port;                                        //控制卡端口
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string ipStr;                                    //控制卡IP
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 19)]
        public string networkIdStr;                             //控制卡唯一网络ID(每张卡都贴有唯一网络ID)
    };
    /********************************************************************************************
     *    LV_CreateProgramEx            创建节目对象,返回类型为 HPROGRAM
     *
     *    参数说明
     *                LedWidth        屏的宽度
     *                LedHeight        屏的高度
     *                ColorType        屏的颜色 1.单色  2.双基色  3.三基色     注:C卡全彩参数为3      X系列卡参数固定为 4
     *                GrayLevel        灰度等级  赋值  1-5对应的灰度等级分别为 无,4,8,16,32  注:目前C系列的卡才支持,其它型号(T,A,U,XC,W,E,X)参数必须为0
     *                SaveType        节目保存位置,默认为0保存存为flash节目,3保存为ram节目
     *                                注:flash节目掉电不清除,ram节目掉电清除。应用场景需要实时刷新的,建议保存为ram节目
     *    返回值
     *                0                创建节目对象失败
     *                非0                创建节目对象成功
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_CreateProgramEx", CharSet = CharSet.Unicode)]
    public static extern IntPtr LV_CreateProgramEx(int LedWidth, int LedHeight, int ColorType, int GrayLevel, int SaveType);
    /*********************************************************************************************
     *    LV_AddProgram                添加一个节目
     *
     *    参数说明
     *                hProgram        节目对象句柄
     *                ProgramNo        节目号 (取值范围0-255)(从0开始)
     *                ProgramTime        节目播放时长 0.节目播放时长  非0.指定播放时长
     *                LoopCount        循环播放次数  1-255
     *    返回值
     *                0                成功
     *                非0                失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddProgram", CharSet = CharSet.Unicode)]
    public static extern int LV_AddProgram(IntPtr hProgram, int ProgramNo, int ProgramTime, int LoopCount);
    /*********************************************************************************************
     *    LV_SetProgramTime            设置节目定时
     *
     *    参数说明
     *                hProgram        节目对象句柄
     *                ProgramNo        节目号 (取值范围0-255)(从0开始)
     *                pProgramTime    节目定时属性,设置方式见PROGRAMTIME结构体注示
     *    返回值
     *                0                成功
     *                非0                失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_SetProgramTime", CharSet = CharSet.Unicode)]
    public static extern int LV_SetProgramTime(IntPtr hProgram, int ProgramNo, ref PROGRAMTIME pProgramTime);
    /*********************************************************************************************
    *    LV_AddImageTextArea                添加一个图文区域
    *
    *    参数说明
    *                hProgram            节目对象句柄
    *                ProgramNo            节目号 (取值范围0-255)(从0开始)
    *                AreaNo                区域号 (取值范围1-255)
    *                pAreaRect            区域坐标属性,设置方式见AREARECT结构体注示
    *                nLayout                区域层号,0.前景区(默认) 1.背景区  注:除C系列,其它默认为1
    *    返回值
    *                0                    成功
    *                非0                    失败,调用LV_GetError来获取错误信息
    ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddImageTextArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddImageTextArea(IntPtr hProgram, int ProgramNo, int AreaNo, ref AREARECT pAreaRect, int nLayout);
    /*********************************************************************************************
     *    LV_AddFileToImageTextArea            添加一个文件到图文区
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号 (取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                FilePath                文件路径,支持的文件类型有 txt  rtf  bmp  gif  png  jpg jpeg tiff
     *                pPlayProp                显示的属性,设置方式见PLAYPROP结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddFileToImageTextArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddFileToImageTextArea(IntPtr hProgram, int ProgramNo, int AreaNo, string FilePath, ref PLAYPROP pPlayProp);
    /*********************************************************************************************
     *    LV_AddSingleLineTextToImageTextArea    添加一个单行文本到图文区
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号 (取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                AddType                    添加的类型  0.为字符串  1.文件(只支持txt和rtf文件)
     *                AddStr                    AddType为0则为字符串数据,AddType为1则为文件路径
     *                pFontProp                如果AddType为字符串类型或AddType为文件类型且文件为txt则可传入以赋值的该结构体,其它可赋NULL
     *                pPlayProp                显示的属性,设置方式见PLAYPROP结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddSingleLineTextToImageTextArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddSingleLineTextToImageTextArea(IntPtr hProgram, int ProgramNo, int AreaNo, int AddType, string AddStr, ref FONTPROP pFontProp, ref PLAYPROP pPlayProp);
    /*********************************************************************************************
     *    LV_AddMultiLineTextToImageTextArea    添加一个多行文本到图文区
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号 (取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                AddType                    添加的类型  0.为字符串  1.文件(只支持txt和rtf文件)
     *                AddStr                    AddType为0则为字符串数据,AddType为1则为文件路径   换行符(\n)
     *                pFontProp                如果AddType为字符串类型或AddType为文件类型且文件为txt则可传入以赋值的该结构体,其它可赋NULL
     *                pPlayProp                显示的属性,设置方式见PLAYPROP结构体注示
     *                nAlignment                水平对齐样式,0.左对齐  1.右对齐  2.水平居中  (注意:只对字符串和txt文件有效)
     *                IsVCenter                是否垂直居中  0.置顶(默认) 1.垂直居中
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddMultiLineTextToImageTextArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddMultiLineTextToImageTextArea(IntPtr hProgram, int ProgramNo, int AreaNo, int AddType, string AddStr, ref FONTPROP pFontProp, ref PLAYPROP pPlayProp, int nAlignment, int IsVCenter);
    /*********************************************************************************************
     *    LV_AddStaticTextToImageTextArea        添加一个静止文本到图文区
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号 (取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                AddType                    添加的类型  0.为字符串  1.文件(只支持txt和rtf文件)
     *                AddStr                    AddType为0则为字符串数据,AddType为1则为文件路径
     *                pFontProp                如果AddType为字符串类型或AddType为文件类型且文件为txt则可传入以赋值的该结构体,其它可赋NULL
     *                DelayTime                显示的时长 1~65535
     *                nAlignment                水平对齐样式,0.左对齐  1.右对齐  2.水平居中  (注意:只对字符串和txt文件有效)
     *                IsVCenter                是否垂直居中  0.置顶(默认) 1.垂直居中
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddStaticTextToImageTextArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddStaticTextToImageTextArea(int hProgram, int ProgramNo, int AreaNo, int AddType, string AddStr, ref FONTPROP pFontProp, int DelayTime, int nAlignment, int IsVCenter);
    /*********************************************************************************************
     *    LV_QuickAddSingleLineTextArea        快速添加一个向左移的单行文本区域
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号 (取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                pAreaRect                区域坐标属性,设置方式见AREARECT结构体注示
     *                AddType                    添加的类型  0.为字符串  1.文件(只支持txt和rtf文件)
     *                AddStr                    AddType为0则为字符串数据,AddType为1则为文件路径
     *                pFontProp                如果AddType为字符串类型或AddType为文件类型且文件为txt则可传入以赋值的该结构体,其它可赋NULL
     *                nSpeed                    滚动速度 1~255
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_QuickAddSingleLineTextArea", CharSet = CharSet.Unicode)]
    public static extern int LV_QuickAddSingleLineTextArea(IntPtr hProgram, int ProgramNo, int AreaNo, ref AREARECT pAreaRect, int AddType, string AddStr, ref FONTPROP pFontProp, int nSpeed);
    /*********************************************************************************************
     *    LV_AddDigitalClockArea                添加一个数字时钟区域
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号 (取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                pAreaRect                区域坐标属性,设置方式见AREARECT结构体注示
     *                pDigitalClockAreaInfo    数字时钟属性,见DIGITALCLOCKAREAINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddDigitalClockArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddDigitalClockArea(IntPtr hProgram, int ProgramNo, int AreaNo, ref AREARECT pAreaRect, ref DIGITALCLOCKAREAINFO pDigitalClockAreaInfo);
    /*********************************************************************************************
     *    LV_AddTimeArea                        添加一个计时区域
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号(取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                pAreaRect                区域坐标属性,设置方式见AREARECT结构体注示
     *                pTimeAreaInfo            计时属性,见TIMEAREAINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddTimeArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddTimeArea(IntPtr hProgram, int ProgramNo, int AreaNo, ref AREARECT pAreaRect, ref TIMEAREAINFO pTimeAreaInfo);
    /*********************************************************************************************
     *    LV_AddClockArea                        添加一个模拟时钟区域
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号 (取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                pAreaRect                区域坐标属性,设置方式见AREARECT结构体注示
     *                pClockAreaInfo            模拟时钟属性,见CLOCKAREAINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddClockArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddClockArea(IntPtr hProgram, int ProgramNo, int AreaNo, ref AREARECT pAreaRect, ref CLOCKAREAINFO pClockAreaInfo);
    /*********************************************************************************************
     *    LV_AddNeiMaArea                        添加一个内码区域
     *  参数说明
     *              hProgram                节目对象句柄
     *              ProgramNo               节目号  从0开始(0-255)
     *              AreaNo                  区域号 (1-255)
     *              pAreaRect               区域坐标属性,设置方式见AREARECT结构体注示
     *              NeiMaStr                文本字符串   注:字符串编码是GB2312
     *              FontSize                字体大小 16 24 32
     *              FontColor               文字颜色 格式BBGGRR 0xff 红色  0xff00 绿色  0xffff黄色
     *              pPlayProp               显示的属性,设置方式见PLAYPROP结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddNeiMaArea", CharSet = CharSet.Unicode)]
    public static extern int LV_AddNeiMaArea(IntPtr hProgram, int ProgramNo, int AreaNo, ref AREARECT pAreaRect, string NeiMaStr, int FontSize, int FontColor, ref PLAYPROP pPlayProp);
    /*********************************************************************************************
     *    LV_AddWaterBorder                    添加一个流水边框区域
     *
     *    参数说明
     *                hProgram                节目对象句柄
     *                ProgramNo                节目号 (取值范围0-255)(从0开始)
     *                AreaNo                    区域号 (取值范围1-255)
     *                pAreaRect                区域坐标属性,设置方式见AREARECT结构体注示
     *                pWaterBorderInfo        流水边框属性,见WATERBORDERINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AddWaterBorder", CharSet = CharSet.Unicode)]
    public static extern int LV_AddWaterBorder(IntPtr hProgram, int ProgramNo, int AreaNo, ref AREARECT pAreaRect, ref WATERBORDERINFO pWaterBorderInfo);
    /*********************************************************************************************
     *    LV_DeleteProgram                    销毁节目对象(注意:如果此节目对象不再使用,请调用此函数销毁,否则会造成内存泄露)
     *
     *    参数说明
     *                hProgram                节目对象句柄
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_DeleteProgram", CharSet = CharSet.Unicode)]
    public static extern void LV_DeleteProgram(IntPtr hProgram);
    /*********************************************************************************************
     *    LV_Send                                发送节目,此发送为一对一发送
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                hProgram                节目对象句柄
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_Send", CharSet = CharSet.Unicode)]
    public static extern int LV_Send(ref COMMUNICATIONINFO pCommunicationInfo, IntPtr hProgram);
    /*********************************************************************************************
     *    LV_TestOnline                        测试LED屏是否可连接上
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_TestOnline", CharSet = CharSet.Unicode)]
    public static extern int LV_TestOnline(ref COMMUNICATIONINFO pCommunicationInfo);
    /*********************************************************************************************
     *    LV_SetBasicInfoEx                        设置基本屏参
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                ColorType                屏的颜色 1.单色  2.双基色  3.三基色     注:C卡全彩参数为3      X系列卡参数固定为 4
     *                GrayLevel                灰度等级  赋值  1-5对应的灰度等级分别为 无,4,8,16,32  注:目前C系列的卡才支持,其它型号(T,A,U,XC,W,E,X)参数必须为0
     *                LedWidth                屏的宽度点数
     *                LedHeight                屏的高度点数
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_SetBasicInfoEx", CharSet = CharSet.Unicode)]
    public static extern int LV_SetBasicInfoEx(ref COMMUNICATIONINFO pCommunicationInfo, int ColorType, int GrayLevel, int LedWidth, int LedHeight);
    /*********************************************************************************************
     *    LV_SetOEDA                            设置OE DA
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                Oe                        OE  0.低有效  1.高有效
     *                Da                        DA  0.负极性  1.正极性
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_SetOEDA", CharSet = CharSet.Unicode)]
    public static extern int LV_SetOEDA(ref COMMUNICATIONINFO pCommunicationInfo, int Oe, int Da);
    /*********************************************************************************************
     *    LV_AdjustTime                        校时
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_AdjustTime", CharSet = CharSet.Unicode)]
    public static extern int LV_AdjustTime(ref COMMUNICATIONINFO pCommunicationInfo);
    /*********************************************************************************************
     *    LV_PowerOnOff                        开关屏
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                OnOff                    开关值  0.关屏  1.开屏  2.重启
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_PowerOnOff", CharSet = CharSet.Unicode)]
    public static extern int LV_PowerOnOff(ref COMMUNICATIONINFO pCommunicationInfo, int OnOff);
    /*********************************************************************************************
     *    LV_TimePowerOnOff                    定时开关屏
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                pTimeInfo                定时开关屏属性,详见ONOFFTIMEINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_TimePowerOnOff", CharSet = CharSet.Unicode)]
    public static extern int LV_TimePowerOnOff(ref COMMUNICATIONINFO pCommunicationInfo, ref ONOFFTIMEINFO pTimeInfo);
    /*********************************************************************************************
     *    LV_SetBrightness                    设置亮度
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                BrightnessValue            亮度值 0~15
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_SetBrightness", CharSet = CharSet.Unicode)]
    public static extern int LV_SetBrightness(ref COMMUNICATIONINFO pCommunicationInfo, int BrightnessValue);
    /*********************************************************************************************
     *    LV_TimeBrightness                    定时亮度
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                pBrightnessTimeInfo        定时亮度属性,详见BRIGHTNESSTIMEINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_TimeBrightness", CharSet = CharSet.Unicode)]
    public static extern int LV_TimeBrightness(ref COMMUNICATIONINFO pCommunicationInfo, ref BRIGHTNESSTIMEINFO pBrightnessTimeInfo);
    /*********************************************************************************************
     *    LV_LedTest                            LED测试
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                TestValue                测试值
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_LedTest", CharSet = CharSet.Unicode)]
    public static extern int LV_LedTest(ref COMMUNICATIONINFO pCommunicationInfo, int TestValue);
    /*********************************************************************************************
     *    LV_TimeLocker                        LED定时锁屏
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                LockerYear                锁屏年
     *                LockerMonth                锁屏月
     *                LockerDay                锁屏日
     *                LockerHour                锁屏时
     *                LockerMinute            锁屏分
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_TimeLocker", CharSet = CharSet.Unicode)]
    public static extern int LV_TimeLocker(ref COMMUNICATIONINFO pCommunicationInfo, int LockerYear, int LockerMonth, int LockerDay, int LockerHour, int LockerMinute);
    /*********************************************************************************************
     *    LV_CancelLocker                        取消定时锁屏
     *
     *    参数说明
     *                pCommunicationInfo        通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_CancelLocker", CharSet = CharSet.Unicode)]
    public static extern int LV_CancelLocker(ref COMMUNICATIONINFO pCommunicationInfo);
    /*********************************************************************************************
     *    LV_SetLedCommunicationParameter            设置LED通讯参数
     *
     *    参数说明
     *                pCommunicationInfo            通讯参数,赋值方式见COMMUNICATIONINFO结构体注示
     *                pLedCommunicationParameter    详见LEDCOMMUNICATIONPARAMETER结构体注示
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_SetLedCommunicationParameter", CharSet = CharSet.Unicode)]
    public static extern int LV_SetLedCommunicationParameter(ref COMMUNICATIONINFO pCommunicationInfo, ref LEDCOMMUNICATIONPARAMETER pLedCommunicationParameter);
    /*********************************************************************************************
     *    LV_LedInitServer            启动控制卡心跳包服务 注:C2M、C4M才支持
     *
     *    参数说明
     *                port            监听的端口
     *    返回值
     *                0                        成功
     *                非0                        失败,调用LV_GetError来获取错误信息
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_LedInitServer", CharSet = CharSet.Unicode)]
    public static extern int LV_LedInitServer(int port);
    /*********************************************************************************************
     *    LV_LedShudownServer            断开控制卡心跳包服务 注:C2M、C4M才支持
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_LedShudownServer", CharSet = CharSet.Unicode)]
    public static extern int LV_LedShudownServer();
    /*********************************************************************************************
     *    LV_RegisterLedServerCallback            注册回调函数 注:C2M、C4M才支持
     *
     *    参数说明
     *                serverCallback            回调函数
     ********************************************************************************************/
    [DllImport("lv_led_64.dll", EntryPoint = "LV_RegisterLedServerCallback", CharSet = CharSet.Unicode)]
    public static extern int LV_RegisterLedServerCallback(SERVERINFOCALLBACK serverCallback);
    /*********************************************************************************************
     *    LV_GetError                                获取错误信息(只支持中文)
     *
     *    参数说明
     *                nErrCode                    函数执行返回的错误代码
     *    返回值
     *            错误信息字符串
     ********************************************************************************************/
    public static string LS_GetError(int nErrCode)
    {
        string ErrStr;
        switch (nErrCode)
        {
            case -1:
                ErrStr = "无效的节目句柄。"; break;
            case -2:
                ErrStr = "节目已经存在。"; break;
            case -3:
                ErrStr = "指定的节目不存在。"; break;
            case -4:
                ErrStr = "定的区域不存在。"; break;
            case -5:
                ErrStr = "创建socket失败。"; break;
            case -6:
                ErrStr = "错误的回复包。"; break;
            case -7:
                ErrStr = "不支持的文件类型。"; break;
            case -8:
                ErrStr = "IP网关掩码或MAC字符串格式错误。"; break;
            case -9:
                ErrStr = "错误的波特率。"; break;
            case -10:
                ErrStr = "文件路径不存在。"; break;
            case -11:
                ErrStr = "区域重叠。"; break;
            case -12:
                ErrStr = "打开文件失败。"; break;
            case -14:
                ErrStr = "区域已存在。"; break;
            case -15:
                ErrStr = "无效的发送类型。"; break;
            case -16:
                ErrStr = "绘图失败。"; break;
            case -17:
                ErrStr = "创建文件夹失败。"; break;
            case -30:
                ErrStr = "打开串口失败。"; break;
            case -31:
                ErrStr = "设置串口超时失败。"; break;
            case -32:
                ErrStr = "设置串口缓冲区失败。"; break;
            case -33:
                ErrStr = "串口发送数据失败。"; break;
            case -34:
                ErrStr = "串口接收数据失败。"; break;
            case -35:
                ErrStr = "串口设置失败。"; break;
            case -36:
                ErrStr = "串口接收数据超时。"; break;
            case -37:
                ErrStr = "USB不支持群发。"; break;
            case -38:
                ErrStr = "发送取消。"; break;
            case -100:
                ErrStr = "网络连接失败。"; break;
            case -101:
                ErrStr = "网络发送失败。"; break;
            case -102:
                ErrStr = "网络接收数据失败。"; break;
            case -103:
                ErrStr = "bind失败。"; break;
            case -104:
                ErrStr = "无可用网卡。"; break;
            case 0xc140:
                ErrStr = "Logo与参屏大小不适应。"; break;
            case 0xdaa3:
                ErrStr = "控制器繁忙。"; break;
            case 0xd5b0:
                ErrStr = "固件程序型号不匹配。"; break;
            case 0xd5b4:
                ErrStr = "不是有效的固件程序。"; break;
            case 0xdab8:
                ErrStr = "节目颜色或屏宽高与控制卡屏参设定值不一致。"; break;
            case 0xc1ba:
                ErrStr = "超出控制卡带载。"; break;
            case 0xdab5:
                ErrStr = "节目数据大小超过允许的最大值。"; break;
            default:
                ErrStr = "未定义错误。"; break;
        }
        return ErrStr;
    }
    #region 调用方法
    private int m_ledWidth;
    private int m_ledHeight;
    private int m_ledColor;
    private int m_ledGrayLevel;
    #region [led]
    /// <summary>
    /// 发送给LED 三个区域同时更新
    /// </summary>
    /// <param name="m_ip">LED屏幕IP地址</param>
    /// <param name="palno">托盘区显示内容</param>
    /// <param name="palno1">中间区域多文本</param>
    /// <param name="strType">运行状态显示内容</param>
    public void LEDstr(string m_ip, string palno, string palno1, string strType)
    {
        m_ledWidth = 256;
        m_ledHeight = 160;
        m_ledColor = 1;
        m_ledGrayLevel = 0;
        try
        {
            Logger logger = LogManager.GetCurrentClassLogger();
            int nResult;
            LedDll.COMMUNICATIONINFO CommunicationInfo = new LedDll.COMMUNICATIONINFO();
            CommunicationInfo.LEDType = 0;
            //TCP通讯********************************************************************************
            CommunicationInfo.SendType = 0;                                                     // 设为固定IP通讯模式,即TCP通讯
            CommunicationInfo.IpStr = m_ip;                                                     // 给IpStr赋值LED控制卡的IP
            CommunicationInfo.LedNumber = 1;                                                    // LED屏号为1,注意socket通讯和232通讯不识别屏号,默认赋1就行了,485必需根据屏的实际屏号进行赋值
            #region 创建一个节目
            IntPtr hProgram;                                                                    // 节目句柄
                                                                                                //注意此处屏宽高及颜色参数必需与设置屏参的屏宽高及颜色一致,否则发送时会提示错误
            hProgram = LedDll.LV_CreateProgramEx(m_ledWidth, m_ledHeight, m_ledColor, m_ledGrayLevel, 0);
            nResult = LedDll.LV_AddProgram(hProgram, 0, 0, 1);                                  // 添加一个节目,参数说明见函数声明注示
            //if (nResult != 0)
            //{
            //    string ErrStr;
            //    ErrStr = LedDll.LS_GetError(nResult);                                           // liudl  此处需记录Log
            //    logger.Error("返回错误信息A2:", ErrStr);
            //    return;
            //}
            #endregion
            #region 区域属性设置
            // 区域范围变量 参数设定
            LedDll.AREARECT AreaRect = new LedDll.AREARECT();//区域坐标属性结构体变量
            AreaRect.left = 0;
            AreaRect.top = 0;
            AreaRect.width = m_ledWidth;
            AreaRect.height = 106;
            // 区域字体变量 参数设定
            LedDll.FONTPROP FontProp = new LedDll.FONTPROP();//文字属性
            FontProp.FontName = "宋体";
            FontProp.FontSize = 12;
            FontProp.FontColor = LedDll.COLOR_RED;
            FontProp.FontBold = 0;
            // 区域字体运行速度 带入方式
            LedDll.PLAYPROP PlayProp = new LedDll.PLAYPROP();
            PlayProp.InStyle = 0;
            PlayProp.DelayTime = 3;
            PlayProp.Speed = 2;
            #endregion
            #region 创建区域
            AreaRect.left = 0;
            AreaRect.top = 0;
            AreaRect.width = m_ledWidth;
            AreaRect.height = 36;
            LedDll.LV_AddImageTextArea(hProgram, 0, 1, ref AreaRect, 1);
            FontProp.FontName = "宋体";
            FontProp.FontSize = 14;
            FontProp.FontColor = LedDll.COLOR_RED;
            FontProp.FontBold = 1;
            // 操作类型
            nResult = LedDll.LV_AddMultiLineTextToImageTextArea(hProgram, 0, 1, LedDll.ADDTYPE_STRING, palno, ref FontProp, ref PlayProp, 0, 0);
            AreaRect.left = 0;
            AreaRect.top = 36;
            AreaRect.width = m_ledWidth;
            AreaRect.height = 70;
            LedDll.LV_AddImageTextArea(hProgram, 0, 2, ref AreaRect, 1);
            FontProp.FontName = "宋体";
            FontProp.FontSize = 16;
            FontProp.FontColor = LedDll.COLOR_RED;
            FontProp.FontBold = 1;
            // 多文本区域 用于显示托盘信息
            nResult = LedDll.LV_AddMultiLineTextToImageTextArea(hProgram, 0, 2, LedDll.ADDTYPE_STRING, palno1, ref FontProp, ref PlayProp, 0, 0);
            FontProp.FontName = "宋体";
            FontProp.FontSize = 16;
            FontProp.FontColor = LedDll.COLOR_RED;
            FontProp.FontBold = 1;
            AreaRect.left = 0;
            AreaRect.top = 106;
            AreaRect.width = m_ledWidth;
            AreaRect.height = 53;
            // 字幕区域 用于显示运行状态 14 区域已存在
            nResult = LedDll.LV_QuickAddSingleLineTextArea(hProgram, 0, 3, ref AreaRect, LedDll.ADDTYPE_STRING, strType, ref FontProp, 32);
            // 发送到LED屏幕
            nResult = LedDll.LV_Send(ref CommunicationInfo, hProgram);
            LedDll.LV_DeleteProgram(hProgram);
            #endregion
            if (nResult != 0)
            {
                string ErrStr;
                ErrStr = LedDll.LS_GetError(nResult);               // liudl 此处需要添加log
                logger.Error("返回错误信息A04:", ErrStr);
            }
        }
        catch (Exception ex)
        {
            // 不抛出异常,防止阻碍主程序运行; Liudl:此处需添加log
            //throw ex;
            Logger logger = LogManager.GetCurrentClassLogger();
            logger.Error("测试trycatch捕捉的信息:", ex.Message);
        }
    }
    /// <summary>
    /// 发送给LED 单独更新字幕区域
    /// </summary>
    /// <param name="m_ip">LED屏幕IP地址</param>
    /// <param name="Mstr">运行状态显示内容</param>
    public void LEDstr(string m_ip, string Mstr)
    {
        m_ledWidth = 256;
        m_ledHeight = 160;
        m_ledColor = 1;
        m_ledGrayLevel = 0;
        try
        {
            int nResult;
            LedDll.COMMUNICATIONINFO CommunicationInfo = new LedDll.COMMUNICATIONINFO();
            CommunicationInfo.LEDType = 0;
            //TCP通讯********************************************************************************
            CommunicationInfo.SendType = 0;                                                     // 设为固定IP通讯模式,即TCP通讯
            CommunicationInfo.IpStr = m_ip;                                                     // 给IpStr赋值LED控制卡的IP
            CommunicationInfo.LedNumber = 1;                                                    // LED屏号为1,注意socket通讯和232通讯不识别屏号,默认赋1就行了,485必需根据屏的实际屏号进行赋值
            #region 创建一个节目
            IntPtr hProgram;                                                                    // 节目句柄
                                                                                                //注意此处屏宽高及颜色参数必需与设置屏参的屏宽高及颜色一致,否则发送时会提示错误
            hProgram = LedDll.LV_CreateProgramEx(m_ledWidth, m_ledHeight, m_ledColor, m_ledGrayLevel, 0);
            nResult = LedDll.LV_AddProgram(hProgram, 0, 0, 1);                                  // 添加一个节目,参数说明见函数声明注示
            if (nResult != 0)
            {
                string ErrStr;
                ErrStr = LedDll.LS_GetError(nResult);                                           // liudl  此处需记录Log
                return;
            }
            #endregion
            #region 创建区域
            // 区域字体运行速度 带入方式
            LedDll.PLAYPROP PlayProp = new LedDll.PLAYPROP();
            PlayProp.InStyle = 0;
            PlayProp.DelayTime = 3;
            PlayProp.Speed = 2;
            // 区域字体变量 参数设定
            LedDll.FONTPROP FontProp = new LedDll.FONTPROP();//文字属性
            FontProp.FontName = "宋体";
            FontProp.FontSize = 16;
            FontProp.FontColor = LedDll.COLOR_RED;
            FontProp.FontBold = 0;
            // 区域范围变量 参数设定
            LedDll.AREARECT AreaRect = new LedDll.AREARECT();//区域坐标属性结构体变量
            AreaRect.left = 0;
            AreaRect.top = 106;
            AreaRect.width = m_ledWidth;
            AreaRect.height = 53;
            // 字幕区域 用于显示运行状态 14 区域已存在
            nResult = LedDll.LV_QuickAddSingleLineTextArea(hProgram, 0, 3, ref AreaRect, LedDll.ADDTYPE_STRING, Mstr, ref FontProp, 32);
            // 发送到LED屏幕
            nResult = LedDll.LV_Send(ref CommunicationInfo, hProgram);
            LedDll.LV_DeleteProgram(hProgram);
            #endregion
            if (nResult != 0)
            {
                string ErrStr;
                ErrStr = LedDll.LS_GetError(nResult);               // liudl 此处需要添加log
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    /// <summary>
    /// 设置led整屏字幕滚动
    /// </summary>
    /// <param name="m_ip">LED屏幕IP地址</param>
    /// <param name="palno">托盘区显示内容</param>
    public void SetLEDText(string IPStr, string ledText)
    {
        m_ledWidth = 256;
        m_ledHeight = 160;
        m_ledColor = 1;
        m_ledGrayLevel = 0;
        try
        {
            Logger logger = LogManager.GetCurrentClassLogger();
            int nResult;
            LedDll.COMMUNICATIONINFO CommunicationInfo = new LedDll.COMMUNICATIONINFO();
            CommunicationInfo.LEDType = 0;
            //TCP通讯********************************************************************************
            CommunicationInfo.SendType = 0;                                                     // 设为固定IP通讯模式,即TCP通讯
            CommunicationInfo.IpStr = IPStr;                                                     // 给IpStr赋值LED控制卡的IP
            CommunicationInfo.LedNumber = 1;                                                    // LED屏号为1,注意socket通讯和232通讯不识别屏号,默认赋1就行了,485必需根据屏的实际屏号进行赋值
            #region 创建一个节目
            IntPtr hProgram;                                                                    // 节目句柄
                                                                                                //注意此处屏宽高及颜色参数必需与设置屏参的屏宽高及颜色一致,否则发送时会提示错误
            hProgram = LedDll.LV_CreateProgramEx(m_ledWidth, m_ledHeight, m_ledColor, m_ledGrayLevel, 0);
            nResult = LedDll.LV_AddProgram(hProgram, 0, 0, 1);                                  // 添加一个节目,参数说明见函数声明注示
            #endregion
            #region 区域属性设置
            // 区域范围变量 参数设定
            LedDll.AREARECT AreaRect = new LedDll.AREARECT();//区域坐标属性结构体变量
            AreaRect.left = 0;
            AreaRect.top = 20;
            AreaRect.width = m_ledWidth;
            AreaRect.height = 106;
            // 区域字体变量 参数设定
            LedDll.FONTPROP FontProp = new LedDll.FONTPROP();//文字属性
            FontProp.FontName = "宋体";
            FontProp.FontSize = 72;
            FontProp.FontColor = LedDll.COLOR_RED;
            FontProp.FontBold = 1;
            // 区域字体运行速度 带入方式
            LedDll.PLAYPROP PlayProp = new LedDll.PLAYPROP();
            PlayProp.InStyle = 0;
            PlayProp.DelayTime = 3;
            PlayProp.Speed = 2;
            #endregion
            #region 创建区域
            // 字幕区域 用于显示运行状态 14 区域已存在
            nResult = LedDll.LV_QuickAddSingleLineTextArea(hProgram, 0, 3, ref AreaRect, LedDll.ADDTYPE_STRING, ledText, ref FontProp, 32);
            // 发送到LED屏幕
            nResult = LedDll.LV_Send(ref CommunicationInfo, hProgram);
            LedDll.LV_DeleteProgram(hProgram);
            #endregion
            if (nResult != 0)
            {
                string ErrStr;
                ErrStr = LedDll.LS_GetError(nResult);               // liudl 此处需要添加log
                logger.Error("返回错误信息A041:", ErrStr);
            }
        }
        catch (Exception ex)
        {
            // 不抛出异常,防止阻碍主程序运行; Liudl:此处需添加log
            //throw ex;
            Logger logger = LogManager.GetCurrentClassLogger();
            logger.Error("测试trycatch捕捉的信息1:", ex.Message);
        }
    }
    #endregion
    #endregion
}
Admin.NET/WCS.Application/WCS.Application.csproj
@@ -119,6 +119,7 @@
  <ItemGroup>
    <PackageReference Include="IoTClient" Version="1.0.40" />
    <PackageReference Include="NLog" Version="5.3.4" />
  </ItemGroup>
  <ItemGroup>