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