-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathFileStore.h
More file actions
117 lines (90 loc) · 3.33 KB
/
Copy pathFileStore.h
File metadata and controls
117 lines (90 loc) · 3.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/**
* @file FileStore.h
* @brief 文件记录存储头文件
*
* 定义Modbus文件记录的数据结构和操作接口
*/
#ifndef FILESTORE_H
#define FILESTORE_H
#include <QObject>
#include <QMap>
#include <QReadWriteLock>
#include "ModbusTypes.h"
// 文件记录数据结构
class FileRecord
{
public:
FileRecord(quint16 fileNumber, quint16 totalRecords);
QByteArray readRecords(quint16 startRecord, quint16 length) const;
bool writeRecords(quint16 startRecord, const QByteArray &data);
quint16 fileNumber() const { return m_fileNumber; }
quint16 totalRecords() const { return m_totalRecords; }
QString description() const { return m_description; }
void setDescription(const QString &desc) { m_description = desc; }
QMap<quint16, QByteArray> getAllRecords() const
{
QReadLocker locker(&m_lock);
return m_records;
}
private:
quint16 m_fileNumber;
quint16 m_totalRecords;
QString m_description;
QMap<quint16, QByteArray> m_records; // 记录号 -> 2字节数据
mutable QReadWriteLock m_lock;
};
// 标准文件存储管理器(功能码 20/21)
class FileStore : public QObject
{
Q_OBJECT
public:
// 文件数量上限(防止内存无限增长)
static constexpr quint16 MAX_FILES = 100;
explicit FileStore(QObject *parent = nullptr);
~FileStore();
bool createFile(quint16 fileNumber, const QString &description, quint16 totalRecords = 10000);
QByteArray handleReadFileRecord(const QByteArray &request);
QByteArray handleWriteFileRecord(const QByteArray &request);
// 查询功能
QStringList getFileList() const;
QString getFileInfo(quint16 fileNumber) const;
QMap<quint16, quint16> getAllRecords(quint16 fileNumber, quint16 maxRecords = 100) const;
QMap<quint16, QByteArray> getAllRecordsRaw(quint16 fileNumber, quint16 maxRecords = 100) const;
// 内存使用统计
size_t getFileCount() const;
size_t getTotalRecordCount() const;
// 内存清理
void clearAllFiles();
void clearFileRecords(quint16 fileNumber);
signals:
void fileRead(quint16 fileNumber, quint16 recordNumber, quint16 length);
void fileWritten(quint16 fileNumber, quint16 recordNumber, int dataSize);
private:
QByteArray buildErrorResponse(quint8 errorCode, quint8 exceptionCode) const;
QMap<quint16, FileRecord *> m_files;
mutable QReadWriteLock m_lock;
};
// 地址文件存储管理器(功能码 203/204)
class FileAddressStore : public QObject
{
Q_OBJECT
public:
// 地址空间上限常量(防止内存无限增长)
static constexpr quint16 MAX_ADDRESS = 10000;
explicit FileAddressStore(QObject *parent = nullptr);
void initializeRegion(quint16 startAddress, quint16 count);
QByteArray handleReadFile(const QByteArray &request);
QByteArray handleWriteFile(const QByteArray &request);
// 查询功能
QMap<quint16, QByteArray> getAddressData(quint16 startAddress, quint16 count) const;
// 内存使用统计
size_t getItemCount() const;
signals:
void registerRead(quint16 address, quint16 count);
void registerWritten(quint16 address, int dataSize);
private:
QByteArray buildErrorResponse(quint8 errorCode, quint8 exceptionCode) const;
QMap<quint16, QByteArray> m_data; // 地址 -> 2字节数据
mutable QReadWriteLock m_lock;
};
#endif // FILESTORE_H