From f56051fa3102feb35ea60650ebda80f49e62d025 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期二, 05 八月 2025 14:54:24 +0800
Subject: [PATCH] 1. SGMeasurement实现规划的地址 2. 优化读取位时输入的地址不是8的倍数的问题 3. 添加读写心跳的功能
---
SourceCode/Bond/SGMeasurement/PLCSignalListener.h | 48 ++++++++++++++++++++++++++++++++++--------------
1 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/SourceCode/Bond/SGMeasurement/PLCSignalListener.h b/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
index cce8782..219e963 100644
--- a/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
+++ b/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 掉线)
};
--
Gitblit v1.9.3