SourceCode/Bond/SGMeasurement/PLCSignalListener.h
@@ -31,26 +31,46 @@
    bool WriteOutValues(const OutValuesArray& values);
private:
    void PulseBitDevice(DeviceType eDevType, short nBitNo, int nDelayMs = 50);
    void LogInfo(const CString& strText, int nType);
    bool SendHeartbeat();
    bool CheckHeartbeat();
    bool MonitorHeartbeat();
    void StartHeartbeatMonitor();
    void StopHeartbeatMonitor();
    void PulseBitDevice(DeviceType eDevType, long nBitNo, int nDelayMs = 50);
    void HandleAckLife(int i, bool bCurrTriggerBit);
    void ThreadProc();
private:
    std::unique_ptr<CCCLinkIEControl> m_pPlc;
    StationIdentifier m_station;
    int m_nIntervalMs = 200;
    // === PLC 通信核心对象 ===
    std::unique_ptr<CCCLinkIEControl> m_pPlc; // PLC 通信控制器
    StationIdentifier m_station;              // PLC 站号
    std::atomic<bool> m_bConnected{ false };  // 是否成功连接
    std::atomic<bool> m_bConnected{ false };
    std::atomic<bool> m_bRunning{ false };
    std::thread m_thread;
    std::vector<bool> m_vecPrevBits;
    // === 控制参数 ===
    int m_nIntervalMs = 200;                  // 轮询周期(ms)
    std::array<bool, 2> m_vecAckSent = { false, false }; // 是否已发送 M10/M11
    std::array<int, 2> m_vecAckCounter = { 0, 0 };       // 计数器,超时自动清除
    // === 命令触发状态缓存 ===
    std::vector<bool> m_vecPrevBits;          // 上一周期的命令位状态(用于检测上升沿)
    Callback m_cbStart;
    Callback m_cbStop;
    AnalyzeCallback m_cbAnalyze;
    LogCallback m_cbLog;
    // === 回调函数(控制/计算/日志)===
    Callback m_cbStart;                       // Start 命令回调
    Callback m_cbStop;                        // Stop 命令回调
    AnalyzeCallback m_cbAnalyze;              // Analyze 计算回调(返回 OUT1~OUT4)
    LogCallback m_cbLog;                      // 日志输出回调
    // === 主线程控制 ===
    std::atomic<bool> m_bRunning{ false };    // 主监听线程是否运行
    std::thread m_thread;                     // 主监听线程对象
    // === ACK 信号状态 ===
    std::array<bool, 2> m_vecAckSent = { false, false }; // 是否已发送应答信号(B10/B11)
    std::array<int, 2>  m_vecAckCounter = { 0, 0 };      // 对应应答信号的生命周期计数器
    // === 心跳检测相关 ===
    std::thread m_heartbeatThread;                  // 心跳检测线程对象
    std::atomic<bool> m_bHeartbeatRunning = false;  // 心跳线程运行标志
   std::atomic<bool> m_bHeartbeatLost = false;     // 心跳丢失标志
    int m_nMissedHeartbeatCount = 0;                // 心跳未变化次数(用于检测 PLC 掉线)
};