| | |
| | | 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 掉线) |
| | | }; |
| | | |