2026-08-14 14:43:11 +08:00
|
|
|
using System;
|
|
|
|
|
using SimpleCore.Library;
|
|
|
|
|
using StandardScene.Signal.Model;
|
|
|
|
|
|
|
|
|
|
namespace StandardScene.Signal.Plc
|
|
|
|
|
{
|
2026-08-17 15:20:27 +08:00
|
|
|
/// <summary>
|
2026-08-24 14:55:35 +08:00
|
|
|
/// 单个工位运行态(不进 JSON)。扫车改写目标写状态,PLC Worker 负责下发 BOOL(或旧一字节枚举)。
|
2026-08-17 15:20:27 +08:00
|
|
|
/// </summary>
|
2026-08-14 14:43:11 +08:00
|
|
|
public sealed class PlcStationRuntime
|
|
|
|
|
{
|
|
|
|
|
private SignalWriteValue _writeSignal;
|
|
|
|
|
private SignalReadValue _readSignal;
|
|
|
|
|
private SignalWriteValue _readWriteSignal;
|
|
|
|
|
|
2026-08-24 14:55:35 +08:00
|
|
|
public PlcStationRuntime(PlcStationModel station, PlcStationDockModel dock, object sync = null)
|
2026-08-14 14:43:11 +08:00
|
|
|
{
|
2026-08-24 14:55:35 +08:00
|
|
|
Station = station ?? throw new ArgumentNullException(nameof(station));
|
|
|
|
|
Dock = dock ?? throw new ArgumentNullException(nameof(dock));
|
|
|
|
|
Sync = sync ?? new object();
|
2026-08-14 14:43:11 +08:00
|
|
|
}
|
|
|
|
|
|
2026-08-24 14:55:35 +08:00
|
|
|
public PlcStationModel Station { get; }
|
2026-08-14 14:43:11 +08:00
|
|
|
|
2026-08-24 14:55:35 +08:00
|
|
|
public PlcStationDockModel Dock { get; }
|
|
|
|
|
|
|
|
|
|
/// <summary>兼容旧代码:机构连接配置(不含工位地标)。</summary>
|
|
|
|
|
public PlcStationModel Config => Station;
|
|
|
|
|
|
|
|
|
|
public object Sync { get; }
|
|
|
|
|
|
|
|
|
|
public string JgName => Station.JgName ?? "";
|
|
|
|
|
|
|
|
|
|
public string DockId => Dock.ResolvedDockId;
|
|
|
|
|
|
|
|
|
|
public string DisplayName =>
|
|
|
|
|
string.IsNullOrEmpty(DockId) || string.Equals(DockId, PlcConfigLoader.DefaultDockId, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
? JgName
|
|
|
|
|
: $"{JgName}/{DockId}";
|
2026-08-14 14:43:11 +08:00
|
|
|
|
|
|
|
|
public SignalReadValue ReadSignal
|
|
|
|
|
{
|
|
|
|
|
get => _readSignal;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
if (_readSignal != value)
|
2026-08-24 14:55:35 +08:00
|
|
|
Diagnosis.Log($"{DisplayName} 读信号 {_readSignal} → {value}", "PLC", true);
|
2026-08-14 14:43:11 +08:00
|
|
|
_readSignal = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public SignalWriteValue WriteSignal
|
|
|
|
|
{
|
|
|
|
|
get => _writeSignal;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
if (_writeSignal != value)
|
2026-08-24 14:55:35 +08:00
|
|
|
Diagnosis.Log($"{DisplayName} 写信号 {_writeSignal} → {value}", "PLC", true);
|
2026-08-14 14:43:11 +08:00
|
|
|
_writeSignal = value;
|
|
|
|
|
WriteSuccess = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public SignalWriteValue ReadWriteSignal
|
|
|
|
|
{
|
|
|
|
|
get => _readWriteSignal;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
if (_readWriteSignal != value)
|
2026-08-24 14:55:35 +08:00
|
|
|
Diagnosis.Log($"{DisplayName} 回读写值 {_readWriteSignal} → {value}", "PLC", true);
|
2026-08-14 14:43:11 +08:00
|
|
|
_readWriteSignal = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int InAgvNo { get; set; }
|
2026-08-17 15:20:27 +08:00
|
|
|
|
2026-08-14 14:43:11 +08:00
|
|
|
public int RequestInAgvNo { get; set; }
|
2026-08-17 15:20:27 +08:00
|
|
|
|
2026-08-14 14:43:11 +08:00
|
|
|
public bool IsConnected { get; set; }
|
2026-08-17 15:20:27 +08:00
|
|
|
|
2026-08-14 14:43:11 +08:00
|
|
|
public bool WriteSuccess { get; set; }
|
2026-08-17 15:20:27 +08:00
|
|
|
|
2026-08-14 14:43:11 +08:00
|
|
|
public bool Heart { get; set; }
|
2026-08-17 15:20:27 +08:00
|
|
|
|
2026-08-14 14:43:11 +08:00
|
|
|
public string LastError { get; set; } = "";
|
|
|
|
|
|
|
|
|
|
public PlcStationSnapshot ToSnapshot() => new PlcStationSnapshot
|
|
|
|
|
{
|
2026-08-24 14:55:35 +08:00
|
|
|
JgName = DisplayName,
|
2026-08-14 14:43:11 +08:00
|
|
|
IsConnected = IsConnected,
|
|
|
|
|
ReadSignal = ReadSignal.ToString(),
|
|
|
|
|
WriteSignal = WriteSignal.ToString(),
|
|
|
|
|
ReadWriteSignal = ReadWriteSignal.ToString(),
|
|
|
|
|
InAgvNo = InAgvNo,
|
|
|
|
|
RequestInAgvNo = RequestInAgvNo,
|
|
|
|
|
WriteSuccess = WriteSuccess,
|
|
|
|
|
Heart = Heart,
|
|
|
|
|
LastError = LastError ?? ""
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|