using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading;
using PropertyGridLib.Attributes;
using PropertyGridLib.Controls;
using TeamAAS.Communication;
using TeamAAS.Core;
using TeamAAS.Communication.Interfaces;
using TeamAAS.FlowEditor.Execution;
using TeamAAS.FlowEditor.Models;
using TeamAAS.FlowEditor.Plugins;
using TeamAAS.FlowEngine.FormulaData;
using Plugins.Standard.Models;
namespace Plugins.Standard.Models
{
// ─────────────────────────────────────────────────────────────────────
// 通讯标准节点模型(批量读 / 批量写)。
// 设计要点:一个节点一次事务处理整组点位 —— 减少往返、结果按键值输出、
// 失败逐项报告(哪一项失败不影响其余项的执行与结果记录)。
// ─────────────────────────────────────────────────────────────────────
/// 通讯批量读取节点模型。
[Serializable]
public class CommBatchReadModel : BasePluginModel
{
[Category("I.设备")]
[DisplayName("1.通讯设备名")]
[Description("通讯管理器中配置的设备名称(须与名称完全一致)")]
public string DeviceName { get; set; } = "";
[Category("II.读取项")]
[DisplayName("1.读取列表")]
[Description("地址→键名 映射列表;运行后每个键名成为本节点输出(下游用 &{本节点.键名} 绑定)")]
[CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)]
public List Items { get; set; } = new List();
[Category("III.选项")]
[DisplayName("1.失败时整体失败")]
[Description("开=任一项读取失败则节点 Failed;关=失败项记入 错误项 输出但节点仍成功")]
public bool FailOnAnyError { get; set; } = false;
}
/// 批量读取项:设备地址 → 输出键名。
[Serializable]
public class CommReadItem
{
[Category("读取项")]
[DisplayName("1.地址")]
[Description("设备地址(DB块/寄存器/Tag,随设备类型解释)")]
public string Address { get; set; } = "";
[Category("读取项")]
[DisplayName("2.键名")]
[Description("输出键名(下游绑定的名字)")]
public string Key { get; set; } = "";
public override string ToString() => string.IsNullOrWhiteSpace(Key) ? Address : $"{Key} ← {Address}";
}
/// 通讯批量写入节点模型。
[Serializable]
public class CommBatchWriteModel : BasePluginModel
{
[Category("I.设备")]
[DisplayName("1.通讯设备名")]
[Description("通讯管理器中配置的设备名称(须与名称完全一致)")]
public string DeviceName { get; set; } = "";
[Category("II.写入项")]
[DisplayName("1.写入列表")]
[Description("地址←来源值 映射列表;来源值可绑定上游输出公式(如 &{检测结果.面积})")]
[CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)]
public List Items { get; set; } = new List();
[Category("III.选项")]
[DisplayName("1.失败时整体失败")]
[Description("开=任一项写入失败则节点 Failed;关=失败项记入 错误项 输出但节点仍成功")]
public bool FailOnAnyError { get; set; } = true;
}
/// 批量写入项:目标地址 ← 来源值(公式/常量)。
[Serializable]
public class CommWriteItem
{
public CommWriteItem()
{
Source = new FormulaBound