refactor: replace hardcoded signal mappings with ModelRegistry

This commit is contained in:
Huamonarch 2026-05-13 15:24:32 +08:00
parent b4bb27f1e5
commit 4821cb9d36
2 changed files with 58 additions and 184 deletions

View File

@ -1,205 +1,77 @@
#include <TestProject/RNG/BaseData.h>
#include <TestProject/RNG/Generator.h>
#include <TestProject/RNG/RandT.h>
#include <TestProject/RNG/read_csv.hpp>
BaseData::BaseData data1;
// ReadCSV::DoubleData ddata("D102-1#酸槽数据.csv"); ///< 2列:入口流量,出口流量
ReadCSV::DoubleData
ddata("数据毛刺-仿真.csv"); ///< 4列:实际速度实际电流设定速度spderr
ReadCSV::DoubleData gdata("毛刺数据.csv"); ///< 6列:RW_o_Drv_ActSpd
///< RW_o_Drv_Current
///< RW_o_Drv_TQ_Ref
///< RW_o_Drv_SpdRegInt
///< RW_o_Drv_SpdErr RW_o_Drv_AVF
ReadCSV::DoubleData spbdata(
"转矩减小-速度偏差大-仿真2.csv"); ///< 4列:实际速度,实际电流,实际转矩,设定速度
ReadCSV::DoubleData
liquid_data("液位.csv"); ///< 4列:实际速度,实际电流,实际转矩,设定速度
// ReadCSV::IntData idata("D302-压辊数据.csv"); ///< 2列:阀动作,接近开关信号
ReadCSV::IntData
idata("C308仿-压辊数据.csv"); ///< 3列:阀动作- 开,接近开关信号-开,阀动作-关
ReadCSV::DoubleData
ddata_cn("D102-3#BR电流数据.csv"); ///< 4列:2/3/4电流,速度设定值
ReadCSV::DoubleData
ddata_cb("D102-3#BR异常电流数据.csv"); ///< 4列:2/3/4电流,速度设定值
#include <TestProject/RNG/model/ModelRegistry.h>
#include <glob/BinaryTele.h>
#include <zlib/MemFix.hpp>
#include <zlib/zoneDef.h>
#include <string>
#include <cmath>
#include "mix_cc/debug/pre_define.h"
ReadCSV::IntData car_data("D302-2#小车减速位.csv"); ///< 2列位置接近开关
ReadCSV::DoubleData std1_wr("D302-1#机架正弯.csv"); ///< 2列给定反馈
ReadCSV::DoubleData std5_wr("D302-工作辊正弯DS.csv"); ///< 2列给定反馈
ReadCSV::DoubleData loop3("D302-3#活套1-5电流.csv"); ///< 5列1-5电机电流
ReadCSV::DoubleData c308fur2col("C308速度毛刺仿真.csv"); ///< 2列 正常 毛刺
ReadCSV::IntData
std4_cr("D102-4#机架上中间辊窜辊.csv"); ///< 5列编码器-4个窜动
ReadCSV::IntData loop8_bool("D102-loop8.csv"); ///< 2列DS,OS
using namespace std;
using namespace chrono;
Generator::Generator() {
Generator::Generator() : registry(ModelRegistry::instance()) {
stime = chrono::system_clock::now();
logger_ = std::make_unique<LOG>("Generator");
logger_ = make_unique<LOG>("Generator");
}
Generator::~Generator() {
// if (!map_tables_.empty()) {
// auto iter = map_tables_.begin();
// while (iter != map_tables_.end()) {
// delete iter->second;
// iter->second = nullptr;
// map_tables_.erase(iter++);
// }
// }
for (auto& it : m_mapfix) {
if (it.second != nullptr) {
delete it.second;
}
}
}
bool Generator::wtite_in_shm(int event_no) {
try {
// if (map_tables_.find(event_no) == map_tables_.end()) {
// map_tables_[event_no] =
// new CMemTable<PLC_DATA>(StringHelper::ToString<int>(event_no),
// 100);
// }
// logger_->Debug() << "wtite_in_shm Test--1" << endl;
if (m_mapfix.find(event_no) == m_mapfix.end()) {
m_mapfix.insert(
make_pair(event_no, new CMemFix<PLC_DATA>(std::to_string(event_no),
make_pair(event_no, new CMemFix<PLC_DATA>(to_string(event_no),
TEL_CACHE_SIZE)));
}
binary_tele.ReBuild(event_no);
int size = binary_tele.size();
// binary_tele.Print();
size_t data_index =
((chrono::system_clock::now() - stime).count() / (size_t)pow(10, 6)) /
20; ///<时间-下标
logger_->Debug() << "wtite_in_shm Test--2"
<< "---data_index:" << data_index << endl;
20;
// First pass: create all models and link valve_pair models
for (int i = 0; i < size; i++) {
const char* spec = binary_tele[i].tables[1];
string specStr = (spec != nullptr && strlen(spec) > 0) ? string(spec) : "";
float defaultVal = atof(binary_tele[i].defaultValue);
string key = string(binary_tele[i].item);
registry.getOrCreate(specStr, defaultVal, key);
}
for (int i = 0; i < size; i++) {
const char* spec = binary_tele[i].tables[1];
string specStr = (spec != nullptr && strlen(spec) > 0) ? string(spec) : "";
float defaultVal = atof(binary_tele[i].defaultValue);
string key = string(binary_tele[i].item);
IModel* model = registry.getOrCreate(specStr, defaultVal, key);
model->linkPeers(registry);
}
// Second pass: evaluate
for (int i = 0; i < size; i++) {
const char* spec = binary_tele[i].tables[1];
string specStr = (spec != nullptr && strlen(spec) > 0) ? string(spec) : "";
float defaultVal = atof(binary_tele[i].defaultValue);
string key = string(binary_tele[i].item);
IModel* model = registry.getOrCreate(specStr, defaultVal, key);
if (binary_tele[i].type[0] == 'b') {
/*bool量*/
if (binary_tele[i].length != '1') {
binary_tele[i] = RandT::randomBool();
if (strcmp(binary_tele[i].item, "3G-DSA-B01-01B") == 0) {
/*2#张力辊压辊打开*/
binary_tele[i] = (float)idata(data_index, 0);
} else if (strcmp(binary_tele[i].item, "3G-PX-B01-01") == 0) {
/*2#张力辊压辊打开位*/
binary_tele[i] = (float)idata(data_index, 1);
} else if (strcmp(binary_tele[i].item, "3G-DSA-B01-01A") == 0) {
/*2#张力辊压辊关闭*/
binary_tele[i] = (float)idata(data_index, 2);
}
else if (strcmp(binary_tele[i].item, "ENT_DR_2R22_limi") == 0) {
/*No.2入口钢卷小车-后退极限接近开关*/
binary_tele[i] = (float)car_data(data_index, 1);
} else if (strcmp(binary_tele[i].item, "ENT_DR_2R11_act") == 0) {
/*4#机架窜辊动作1*/
binary_tele[i] = (float)std4_cr(data_index, 1);
} else if (strcmp(binary_tele[i].item, "ENT_DR_2R12_act") == 0) {
/*4#机架窜辊动作2*/
binary_tele[i] = (float)std4_cr(data_index, 2);
} else if (strcmp(binary_tele[i].item, "ENT_DR_2R11_limi") == 0) {
/*4#机架窜辊动作3*/
binary_tele[i] = (float)std4_cr(data_index, 3);
} else if (strcmp(binary_tele[i].item, "ENT_DR_2R12_limi") == 0) {
/*4#机架窜辊动作4*/
binary_tele[i] = (float)std4_cr(data_index, 4);
} else if (strcmp(binary_tele[i].item, "ENT_DR_2_run") == 0) {
/*入口活套-No.8摆动门传动侧关闭极限接近开关*/
binary_tele[i] = (float)loop8_bool(data_index, 0);
} else if (strcmp(binary_tele[i].item, "ENT_DR_2_Ft") == 0) {
/*入口活套-No.8摆动门操作侧关闭极限接近开关*/
binary_tele[i] = (float)loop8_bool(data_index, 1);
}
binary_tele[i] = model->evaluateBool(data_index) ? 1.0f : 0.0f;
} else {
logger_->Error() << "event_no:" << event_no << ",数据项:"
<< binary_tele[i].chinese
<< ",item:" << binary_tele[i].item
<< "类型长度不匹配,"
<< "type:" << binary_tele[i].type
<< ",lenth:" << binary_tele[i].length << std::endl;
binary_tele[i] = model->evaluate(data_index);
}
} else {
/*模拟量*/
strcpy((char *)binary_tele[i].value, binary_tele[i].defaultValue);
float dataN = binary_tele[i];
binary_tele[i] = float(dataN + RandT::RandT(-0.01, 0.01));
if (strcmp(binary_tele[i].item, "BR1_1_V_act") == 0) {
/*1#张力辊1#辊 实际速度*/
binary_tele[i] =
(float)binary_tele[i] + (float)c308fur2col(data_index, 1);
} else if (strcmp(binary_tele[i].item, "BR1_2_V_act") == 0) {
/*2#张力辊1#辊 设定速度*/
binary_tele[i] =
(float)binary_tele[i] + (float)c308fur2col(data_index, 0);
} else if (strcmp(binary_tele[i].item, "BR2_1_V_act") == 0) {
/*2#张力辊1#辊 实际电流*/
binary_tele[i] =
(float)binary_tele[i] + (float)c308fur2col(data_index, 0);
} else if (strcmp(binary_tele[i].item, "BR2_2_V_act") == 0) {
/*2#张力辊2#辊 实际速度*/
binary_tele[i] =
(float)binary_tele[i] + (float)c308fur2col(data_index, 1);
} else if (strcmp(binary_tele[i].item, "BR2_2_I_act") == 0) {
/*2#张力辊2#辊 实际电流*/
binary_tele[i] = (float)spbdata(data_index, 1);
} else if (strcmp(binary_tele[i].item, "BR2_2_TQ_act") == 0) {
/*2#张力辊2#辊 实际转矩*/
binary_tele[i] = (float)spbdata(data_index, 2);
} else if (strcmp(binary_tele[i].item, "IW_3G_LV_J02_03") == 0) {
/*入口液压站液位*/
binary_tele[i] = (float)liquid_data(data_index, 0);
} else if (strcmp(binary_tele[i].item, "TCM-4-82-BDRef-1-118") == 0) {
/*1#机架工作辊正弯辊压力给定*/
binary_tele[i] = (float)std1_wr(data_index, 0);
} else if (strcmp(binary_tele[i].item, "TCM-4-82-BD-1-101") == 0) {
/*1#机架工作辊正弯辊压力反馈*/
binary_tele[i] = (float)std1_wr(data_index, 1);
} else if (strcmp(binary_tele[i].item, "TCM-72-150-BDRef-5-134") == 0) {
/*5#机架工作辊DS正弯辊压力给定*/
binary_tele[i] = (float)std5_wr(data_index, 0);
} else if (strcmp(binary_tele[i].item, "TCM-72-150-BD-5-117") == 0) {
/*5#机架工作辊DS正弯辊压力反馈*/
binary_tele[i] = (float)std5_wr(data_index, 1);
} else if (strcmp(binary_tele[i].item, "ENT_BR_4R1_torfbk") == 0) {
/*3#活套1#电机电流*/
binary_tele[i] = (float)loop3(data_index, 0);
} else if (strcmp(binary_tele[i].item, "ENT_BR_4R2_torfbk") == 0) {
/*3#活套2#电机电流*/
binary_tele[i] = (float)loop3(data_index, 1);
} else if (strcmp(binary_tele[i].item, "ENT_BR_4R3_torfbk") == 0) {
/*3#活套3#电机电流*/
binary_tele[i] = (float)loop3(data_index, 2);
} else if (strcmp(binary_tele[i].item, "ENT_BR_4R3_curfbk") == 0) {
/*3#活套4#电机电流*/
binary_tele[i] = (float)loop3(data_index, 3);
} else if (strcmp(binary_tele[i].item, "ENT_BR_4R1_curfbk") == 0) {
/*3#活套5#电机电流*/
binary_tele[i] = (float)loop3(data_index, 4);
} else if (strcmp(binary_tele[i].item, "ENT_BR_4R2_curfbk") == 0) {
/*4#机架上中间辊窜辊编码器*/
binary_tele[i] = (float)std4_cr(data_index, 0);
} else if (strcmp(binary_tele[i].item, "ACD-3-42-FQ-2") == 0) {
/*3#酸槽出口流量 ---Test*/
binary_tele[i] = (float)RandT::randomBool();
} else {
// logger_->Debug() << "test:" << binary_tele[i].item
// << ",value:" << binary_tele[i] << endl;
}
// logger_->Debug() << "vale:" << binary_tele[i].value << "," << dataN
// << endl;
}
}
// binary_tele.Print();
char* buff = binary_tele.GetTeleData();
// this->logger_->Debug() << buff << endl;
// map_tables_[event_no]->push((PLC_DATA*)buff);
m_mapfix[event_no]->push((PLC_DATA*)buff);
// ((BinaryTele*)buff)->Print();
return true;
} catch (const std::exception& e) {
logger_->Error() << "wtite_in_shm Error!" << e.what() << std::endl;

View File

@ -3,14 +3,16 @@
#include <glob/BinaryTele.h>
#include <log4cplus/LOG.h>
#include <zlib/MemVar.h>
#include <zlib/MemFix.hpp>
#include <zlib/zoneDef.h>
#include <TestProject/RNG/model/ModelRegistry.h>
#include <array>
#include <chrono>
#include <map>
#include <numeric>
#include <string>
#include <zlib/MemFix.hpp>
#include <zlib/MemTable.hpp>
using namespace chrono;
using namespace std;
class Generator {
public:
Generator();
@ -20,7 +22,7 @@ class Generator {
private:
std::unique_ptr<LOG> logger_;
BinaryTele binary_tele{CMemVar::Const()->event_eis_start, "T_LOV_FDAAITEM"};
// map<int, CMemTable<PLC_DATA>*> map_tables_;
map<int, CMemFix<PLC_DATA>*> m_mapfix;
chrono::system_clock::time_point stime;
ModelRegistry& registry;
};