- 在 appConfig.json 中添加 EndianFormat 配置项并更新相关输入输出地址 - 修改 ResultCode 类型为 short,确保与 PLC 通信一致 - 新增 DesignTimePlcService 以支持设计时的 PLC 测试写入功能 - 更新 SystemSettingViewModel 和 DashboardPage 以支持手动测试写入 - 调整多个视图模型和服务以适应新的 PLC 写入逻辑 - 更新相关单元测试以验证新功能的正确性
467 lines
12 KiB
C#
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;
|
|
}
|