Files
Axi_Omron/src/AxiOmron.PcbCheck/Options/AppConfig.cs
yunxiao.zhu 27e2c9d5d0 ✨ feat(*): 更新 PLC 相关功能与配置
- 在 appConfig.json 中添加 EndianFormat 配置项并更新相关输入输出地址
- 修改 ResultCode 类型为 short,确保与 PLC 通信一致
- 新增 DesignTimePlcService 以支持设计时的 PLC 测试写入功能
- 更新 SystemSettingViewModel 和 DashboardPage 以支持手动测试写入
- 调整多个视图模型和服务以适应新的 PLC 写入逻辑
- 更新相关单元测试以验证新功能的正确性
2026-06-02 17:26:24 +08:00

467 lines
12 KiB
C#

namespace AxiOmron.PcbCheck.Options;
/// <summary>
/// 表示 PCB 目检上位机的根配置对象。
/// </summary>
public sealed class AppConfig
{
/// <summary>
/// 获取或设置 PLC 通信配置。
/// </summary>
public PlcOptions Plc { get; set; } = new();
/// <summary>
/// 获取或设置扫码枪配置。
/// </summary>
public ScannerOptions Scanner { get; set; } = new();
/// <summary>
/// 获取或设置统一文件校验配置。
/// </summary>
public FileCheckOptions FileCheck { get; set; } = new();
/// <summary>
/// 获取或设置 SFTP 校验配置。
/// </summary>
public SftpOptions Sftp { get; set; } = new();
/// <summary>
/// 获取或设置安灯接口配置。
/// </summary>
public AndonOptions Andon { get; set; } = new();
/// <summary>
/// 获取或设置流程控制配置。
/// </summary>
public WorkflowOptions Workflow { get; set; } = new();
/// <summary>
/// 获取或设置处理记录持久化配置。
/// </summary>
public RecordPersistenceOptions RecordPersistence { get; set; } = new();
/// <summary>
/// 获取或设置安全控制配置。
/// </summary>
public SecurityOptions Security { get; set; } = new();
}
/// <summary>
/// 表示文件校验通道类型。
/// </summary>
public enum FileCheckProvider
{
/// <summary>
/// 使用 SFTP 目录作为文件校验来源。
/// </summary>
Sftp,
/// <summary>
/// 使用本地磁盘目录作为文件校验来源。
/// </summary>
Local
}
/// <summary>
/// 表示统一文件校验配置。
/// </summary>
public sealed class FileCheckOptions
{
/// <summary>
/// 获取或设置当前启用的文件校验通道。
/// </summary>
public FileCheckProvider Provider { get; set; } = FileCheckProvider.Sftp;
/// <summary>
/// 获取或设置文件名匹配模板。
/// </summary>
public string FileNamePattern { get; set; } = "${barcode}.txt";
/// <summary>
/// 获取或设置首次未命中后的重试间隔,单位为秒。
/// </summary>
public int RetryIntervalSeconds { get; set; } = 2;
/// <summary>
/// 获取或设置首次未命中后的最大重试次数。
/// </summary>
public int MaxRetryCount { get; set; } = 3;
/// <summary>
/// 获取或设置本地磁盘文件校验配置。
/// </summary>
public LocalFileCheckOptions Local { get; set; } = new();
}
/// <summary>
/// 表示本地磁盘文件校验配置。
/// </summary>
public sealed class LocalFileCheckOptions
{
/// <summary>
/// 获取或设置本地文件校验根目录。
/// </summary>
public string RootPath { get; set; } = "D:\\PcbCheck\\Files";
}
/// <summary>
/// 表示 PLC 通信参数与点位映射配置。
/// </summary>
public sealed class PlcOptions
{
/// <summary>
/// 获取或设置 PLC 主机地址。
/// </summary>
public string Host { get; set; } = "127.0.0.1";
/// <summary>
/// 获取或设置 PLC 端口。
/// </summary>
public int Port { get; set; } = 9600;
/// <summary>
/// 获取或设置 FINS 目标单元地址。
/// </summary>
public byte UnitAddress { get; set; }
/// <summary>
/// 获取或设置上位机节点编号。
/// </summary>
public byte SourceNodeAddress { get; set; } = 25;
/// <summary>
/// 获取或设置 PLC 寄存器字节序,默认使用 BADC 以匹配现场 D 区 Int16 高低字节顺序。
/// </summary>
public string? EndianFormat { get; set; } = "BADC";
/// <summary>
/// 获取或设置轮询周期,单位为毫秒。
/// </summary>
public int PollIntervalMs { get; set; } = 200;
/// <summary>
/// 获取或设置连接超时,单位为毫秒。
/// </summary>
public int ConnectTimeoutMs { get; set; } = 3000;
/// <summary>
/// 获取或设置放行脉冲持续时间,单位为毫秒。
/// </summary>
public int ReleasePulseMs { get; set; } = 500;
/// <summary>
/// 获取或设置放行应答超时,单位为毫秒。
/// </summary>
public int ReleaseAckTimeoutMs { get; set; } = 2000;
/// <summary>
/// 获取或设置 PLC 输入点位配置。
/// </summary>
public PlcInputAddressOptions Inputs { get; set; } = new();
/// <summary>
/// 获取或设置 PLC 输出点位配置。
/// </summary>
public PlcOutputAddressOptions Outputs { get; set; } = new();
/// <summary>
/// 获取或设置 PLC 结果寄存器配置。
/// </summary>
public PlcRegisterAddressOptions Registers { get; set; } = new();
}
/// <summary>
/// 表示双 TCP 扫码枪参数配置。
/// </summary>
public sealed class ScannerOptions
{
/// <summary>
/// 获取或设置扫码枪1配置。
/// </summary>
public TcpScannerEndpointOptions Scanner1 { get; set; } = new()
{
Name = "扫码枪1",
Host = "127.0.0.1",
Port = 9001
};
/// <summary>
/// 获取或设置扫码枪2配置。
/// </summary>
public TcpScannerEndpointOptions Scanner2 { get; set; } = new()
{
Name = "扫码枪2",
Host = "127.0.0.1",
Port = 9002
};
/// <summary>
/// 获取或设置 TCP 连接超时,单位为毫秒。
/// </summary>
public int ConnectTimeoutMs { get; set; } = 3000;
/// <summary>
/// 获取或设置扫码枪触发命令,支持转义字符。
/// </summary>
public string TriggerCommand { get; set; } = "T";
/// <summary>
/// 获取或设置返回报文结束符,支持转义字符;为空时读取到首批非空数据即返回。
/// </summary>
public string ResponseTerminator { get; set; } = "\\r";
/// <summary>
/// 获取或设置是否并发触发两把扫码枪。
/// </summary>
public bool TriggerInParallel { get; set; } = true;
/// <summary>
/// 获取或设置单次扫码超时,单位为毫秒。
/// </summary>
public int ReadTimeoutMs { get; set; } = 3000;
}
/// <summary>
/// 表示单把 TCP 扫码枪连接参数。
/// </summary>
public sealed class TcpScannerEndpointOptions
{
/// <summary>
/// 获取或设置扫码枪名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 获取或设置扫码枪 IP 或主机名。
/// </summary>
public string Host { get; set; } = "127.0.0.1";
/// <summary>
/// 获取或设置扫码枪 TCP 端口。
/// </summary>
public int Port { get; set; } = 9001;
}
/// <summary>
/// 表示 SFTP 文件查找配置。
/// </summary>
public sealed class SftpOptions
{
/// <summary>
/// 获取或设置 SFTP 主机地址。
/// </summary>
public string Host { get; set; } = "127.0.0.1";
/// <summary>
/// 获取或设置 SFTP 端口。
/// </summary>
public int Port { get; set; } = 22;
/// <summary>
/// 获取或设置登录用户名。
/// </summary>
public string Username { get; set; } = "user";
/// <summary>
/// 获取或设置登录密码。
/// </summary>
public string Password { get; set; } = string.Empty;
/// <summary>
/// 获取或设置私钥文件路径。
/// </summary>
public string PrivateKeyPath { get; set; } = string.Empty;
/// <summary>
/// 获取或设置私钥口令。
/// </summary>
public string PrivateKeyPassphrase { get; set; } = string.Empty;
/// <summary>
/// 获取或设置根目录。
/// </summary>
public string RootPath { get; set; } = "/pcb";
/// <summary>
/// 获取或设置文件名匹配模板。
/// </summary>
public string FileNamePattern { get; set; } = "${barcode}.txt";
/// <summary>
/// 获取或设置首次未命中后的重试间隔,单位为秒。
/// </summary>
public int RetryIntervalSeconds { get; set; } = 2;
/// <summary>
/// 获取或设置首次未命中后的最大重试次数。
/// </summary>
public int MaxRetryCount { get; set; } = 3;
/// <summary>
/// 获取或设置连接超时,单位为毫秒。
/// </summary>
public int ConnectTimeoutMs { get; set; } = 3000;
}
/// <summary>
/// 表示安灯 HTTP 接口配置。
/// </summary>
public sealed class AndonOptions
{
/// <summary>
/// 获取或设置是否启用安灯接口。
/// </summary>
public bool Enable { get; set; } = true;
/// <summary>
/// 获取或设置安灯接口地址。
/// </summary>
public string Url { get; set; } = "https://shp.prod.aliyun.mit.uaes.com/api/mit/MAE/Station/Status/alarm";
/// <summary>
/// 获取或设置请求方法。
/// </summary>
public string Method { get; set; } = "POST";
/// <summary>
/// 获取或设置请求超时,单位为毫秒。
/// </summary>
public int TimeoutMs { get; set; } = 3000;
/// <summary>
/// 获取或设置安灯主题。
/// </summary>
public string AndonTheme { get; set; } = "SS7_Auto_Andon";
/// <summary>
/// 获取或设置设备唯一标识。
/// </summary>
public string Eid { get; set; } = "PR1965269806334783488";
/// <summary>
/// 获取或设置调用来源标记。
/// </summary>
public string FromSign { get; set; } = "IOT";
/// <summary>
/// 获取或设置服务标识。
/// </summary>
public string ServiceId { get; set; } = "4dccd822-86b2-47dd-89bd-ca472ba0d14d";
/// <summary>
/// 获取或设置扫码失败报警是否启用。
/// </summary>
public bool EnableScanFailAlarm { get; set; } = true;
/// <summary>
/// 获取或设置文件未找到报警是否启用。
/// </summary>
public bool EnableFileNotFoundAlarm { get; set; } = false;
/// <summary>
/// 获取或设置附加请求头。
/// </summary>
public Dictionary<string, string> Headers { get; set; } = new(StringComparer.OrdinalIgnoreCase);
}
/// <summary>
/// 表示流程控制公共配置。
/// </summary>
public sealed class WorkflowOptions
{
/// <summary>
/// 获取或设置故障后是否必须人工复位。
/// </summary>
public bool RequireManualResetAfterFault { get; set; } = true;
/// <summary>
/// 获取或设置 UI 日志最大保留条数。
/// </summary>
public int MaxUiLogEntries { get; set; } = 200;
/// <summary>
/// 获取或设置最近处理记录最大保留条数。
/// </summary>
public int MaxBoardRecords { get; set; } = 100;
}
/// <summary>
/// 表示处理记录 CSV 持久化配置。
/// </summary>
public sealed class RecordPersistenceOptions
{
/// <summary>
/// 获取或设置记录目录相对路径或绝对路径。
/// </summary>
public string DirectoryPath { get; set; } = "Data\\Records";
/// <summary>
/// 获取或设置跨天检查周期,单位为秒。
/// </summary>
public int DayChangeCheckIntervalSeconds { get; set; } = 30;
}
/// <summary>
/// 表示简易管理员控制配置。
/// </summary>
public sealed class SecurityOptions
{
/// <summary>
/// 获取或设置管理员解锁密码。
/// </summary>
public string AdminPassword { get; set; } = "AxiOmron@123";
/// <summary>
/// 获取或设置管理员解锁会话超时时间,单位为分钟。
/// </summary>
public int AdminSessionTimeoutMinutes { get; set; } = 15;
}
/// <summary>
/// 表示 PLC 输入点位地址配置。
/// </summary>
public sealed class PlcInputAddressOptions
{
/// <summary>
/// 获取或设置 PCB 到位点位地址。
/// </summary>
public int PcbArrived { get; set; } = 1001;
/// <summary>
/// 获取或设置 PLC 复位点位地址。
/// </summary>
public int PlcReset { get; set; } = 1002;
/// <summary>
/// 获取或设置 PLC 放行应答点位地址。
/// </summary>
public int PlcAckRelease { get; set; } = 1003;
}
/// <summary>
/// 表示 PLC 输出地址配置。
/// </summary>
public sealed class PlcOutputAddressOptions
{
/// <summary>
/// 获取或设置 PC 忙碌位地址。
/// </summary>
public int PcBusy { get; set; } = 1051;
/// <summary>
/// 获取或设置放行位地址。
/// </summary>
public int ReleasePermit { get; set; } = 1052;
}
/// <summary>
/// 表示 PLC 寄存器地址配置。
/// </summary>
public sealed class PlcRegisterAddressOptions
{
/// <summary>
/// 获取或设置结果代码寄存器地址。
/// </summary>
public int ResultCode { get; set; } = 1100;
}