using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; namespace WIDESEAWCS_Tasks { /// /// 机械手 Socket 通信状态数据类 /// /// /// 该类用于在 Redis 缓存中存储机械手的实时状态,包括位置、任务、手臂对象等信息。 /// 所有属性均设计为线程安全更新,通过 的版本控制机制来防止并发覆盖。 /// public class RobotSocketState { /// /// 机械手的 IP 地址,作为缓存键的唯一标识 /// public string IPAddress { get; set; } = string.Empty; /// /// 版本号,用于乐观并发控制 /// /// /// 每次修改状态时更新为 DateTime.UtcNow.Ticks。 /// 使用此字段实现乐观锁,防止并发更新时旧值覆盖新值。 /// public long Version { get; set; } = DateTime.UtcNow.Ticks; /// /// 是否已订阅消息事件标志 /// /// /// 确保每个客户端只启动一次消息处理循环,避免重复订阅导致的消息重复处理。 /// public bool IsEventSubscribed { get; set; } /// /// 机械手运行模式 /// /// /// 1: 手动模式 /// 2: 自动模式 /// 当 RobotRunMode == 2 且 RobotControlMode == 1 时,系统进入自动控制状态。 /// public int? RobotRunMode { get; set; } /// /// 机械手控制模式 /// /// /// 1: 客户端控制 /// 2: 未知/其他 /// 与 RobotRunMode 配合判断机器人的当前控制状态。 /// public int? RobotControlMode { get; set; } /// /// 机械手手臂抓取对象状态 /// /// /// 0: 无物料(手臂空闲) /// 1: 有物料(已抓取货物) /// 用于判断机器人是否可以执行下一步动作。 /// public int? RobotArmObject { get; set; } /// /// 机械手设备基础信息 /// /// /// 包含设备的 DeviceCode、DeviceName、IPAddress 等基础信息。 /// 在状态初始化时从 JobDetail.JobDataMap 获取并缓存。 /// public RobotCraneDevice? RobotCrane { get; set; } /// /// 机械手初始化完成回到待机位 /// /// /// 可能的值: /// - "Homed": 已回零 /// - "Homing": 回零中 /// public string? Homed { get; set; } /// /// 机械手当前正在执行的动作 /// /// /// 可能的值: /// - "Picking": 取货中 /// - "Putting": 放货中 /// - "PickFinished": 取货完成 /// - "PutFinished": 放货完成 /// - "AllPickFinished": 全部取货完成 /// - "AllPutFinished": 全部放货完成 /// public string? CurrentAction { get; set; } /// /// 机械手当前运行状态 /// /// /// 可能的值: /// - "Homing": 回零中 /// - "Homed": 已回零 /// - "Running": 运行中 /// - "Pausing": 暂停中 /// - "Warming": 预热中 /// - "Emstoping": 急停中 /// public string? OperStatus { get; set; } /// /// 最近一次取货完成的位置数组 /// /// /// 数组中的每个元素代表一个电池位置编号。 /// 用于记录取货动作涉及的货位,供后续组盘/拆盘操作使用。 /// public int[]? LastPickPositions { get; set; } /// /// 最近一次放货完成的位置数组 /// /// /// 数组中的每个元素代表一个电池位置编号。 /// 用于记录放货动作涉及的货位。 /// public int[]? LastPutPositions { get; set; } /// /// 电池/货位条码列表 /// /// /// 在组盘操作时用于记录生成的托盘条码。 /// 每个条码格式为 "TRAY" + 日期 + 时间 + 随机数。 /// public List CellBarcode { get; set; } = new List(); /// /// 机械手当前正在执行的任务 /// /// /// 当任务下发到机器人后,该字段保存任务详情。 /// 任务类型包括:组盘(500)、换盘(510)、拆盘(520)。 /// public Dt_RobotTask? CurrentTask { get; set; } /// /// 是否需要执行拆盘任务 /// /// /// 当任务类型为 SplitPallet (520) 时设为 true。 /// 拆盘任务将电池从托盘上取下并逐个放置到目标位置。 /// public bool IsSplitPallet { get; set; } /// /// 是否需要执行组盘任务 /// /// /// 当任务类型为 GroupPallet (500) 或 ChangePallet (510) 时设为 true。 /// 组盘任务将多个电池组合到同一个托盘上。 /// public bool IsGroupPallet { get; set; } /// /// 机器人已处理的任务总数 /// /// /// 累计记录机器人已完成处理的电池/货物数量。 /// 当达到 MaxTaskTotalNum (48) 时,不再下发新任务。 /// public int RobotTaskTotalNum { get; set; } } }