dev(UML-981): Добавил настройку отключения изменения порядка байт

This commit is contained in:
Vadim Sychev 2022-09-01 15:38:55 +03:00
parent d752ef5b44
commit f6bbef1af9
5 changed files with 40 additions and 17 deletions

View File

@ -160,7 +160,7 @@ int main(int argc, char * argv[])
{ {
answer_str.clear(); answer_str.clear();
std::this_thread::sleep_for(std::chrono::milliseconds(500)); std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::string request{j_get_flags.dump()}; std::string request{j_get_flags.dump()};
///Запрос: ///Запрос:
*p_output_stream_ << request << std::endl; *p_output_stream_ << request << std::endl;
@ -409,13 +409,22 @@ int main(int argc, char * argv[])
j_set_data["submodule_id"] = submodule_id; j_set_data["submodule_id"] = submodule_id;
auto& data = j_set_data["data"]["I808InpBits"]; auto& data = j_set_data["data"]["I808InpBits"];
static bool init = true;
for (int i = 0; i < 8; ++i) if (init)
{ {
bits[i] = (~bits[i]) & 0x01; for (int i = 0; i < 8; ++i)
std::string bit_name = "in_bit_" + std::to_string(i); {
data[bit_name] = bits[i]; //bits[i] = (~bits[i]) & 0x01;
std::string bit_name = "in_bit_" + std::to_string(i);
data[bit_name] = value_bits[i];
}
init = false;
} }
else
{
data["in_bit_1"] = 1;
}
j_set_echo_data["params"].push_back(j_set_data); j_set_echo_data["params"].push_back(j_set_data);
} }
break; break;

View File

@ -234,7 +234,7 @@ static bool programconf_getCyclycDataDir(json& j_cyclic_data, uint8_t& dir)
return true; return true;
} }
static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<std::string, UserData>& user_data, uint16_t& cyc_data_len) static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<std::string, UserData>& user_data, uint16_t& cyc_data_len, bool swap)
{ {
uint16_t data_lengh = 0; uint16_t data_lengh = 0;
@ -256,7 +256,7 @@ static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<s
auto name = j.at("name").get<std::string>(); auto name = j.at("name").get<std::string>();
auto Type = j.at("DataType").get<std::string>(); auto Type = j.at("DataType").get<std::string>();
user_data.emplace(std::make_pair(std::string(name), UserData{name, Type, data_lengh})); user_data.emplace(std::make_pair(std::string(name), UserData{name, Type, data_lengh, swap}));
data_lengh+= user_data.at(name).size; data_lengh+= user_data.at(name).size;
@ -285,7 +285,7 @@ static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<s
static bool programconf_getParamsSettings(const json& j_sett, static bool programconf_getParamsSettings(const json& j_sett,
ProfinetData_Submodule& submod, ProfinetData_Submodule& submod,
ProfinetSharedData& shared_data, ProfinetSharedData& shared_data,
std::map<std::uint32_t, UserData>& user_data) std::map<std::uint32_t, UserData>& user_data, bool swap)
{ {
if (!j_sett.contains("parameters")) if (!j_sett.contains("parameters"))
return false; return false;
@ -319,7 +319,7 @@ static bool programconf_getParamsSettings(const json& j_sett,
param.index = static_cast<uint32_t>(parm_sett.at("index").get<int>()); param.index = static_cast<uint32_t>(parm_sett.at("index").get<int>());
param.name = parm_sett.at("name").get<string>(); param.name = parm_sett.at("name").get<string>();
user_data.emplace(std::make_pair(param.index, UserData{param.name, data_type, 0})); user_data.emplace(std::make_pair(param.index, UserData{param.name, data_type, 0, swap}));
param.length = static_cast<uint16_t>(user_data.at(param.index).size); param.length = static_cast<uint16_t>(user_data.at(param.index).size);
@ -378,6 +378,14 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
uint32_t module_index = 0; uint32_t module_index = 0;
/// Необходимость изменять порядок байт в датаграмме(мастер - bigendian)
bool swap = true;
if (j.contains("SwapData"))
{
swap = j.at("SwapData").get<bool>();
}
for (auto& mod_set : modules_sett) for (auto& mod_set : modules_sett)
{ {
uint32_t mod_id = hexstring_to_int(mod_set["id"].get<string>()); uint32_t mod_id = hexstring_to_int(mod_set["id"].get<string>());
@ -434,7 +442,7 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
if (j_cycdata_sett.contains("Inputs")) if (j_cycdata_sett.contains("Inputs"))
{ {
/// Конструируем поля пользовательских данных в датаграмме циклических данных /// Конструируем поля пользовательских данных в датаграмме циклических данных
if (!programconf_getCyclicDataSettings(j_cycdata_sett.at("Inputs"), submod_user_data.inp_data_map, submod.cyc_indata_len)) if (!programconf_getCyclicDataSettings(j_cycdata_sett.at("Inputs"), submod_user_data.inp_data_map, submod.cyc_indata_len, swap))
{ {
return false; return false;
} }
@ -447,7 +455,7 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
if (j_cycdata_sett.contains("Outputs")) if (j_cycdata_sett.contains("Outputs"))
{ {
if (!programconf_getCyclicDataSettings(j_cycdata_sett.at("Outputs"), submod_user_data.out_data_map, submod.cyc_outdata_len)) if (!programconf_getCyclicDataSettings(j_cycdata_sett.at("Outputs"), submod_user_data.out_data_map, submod.cyc_outdata_len, swap))
{ {
return false; return false;
} }
@ -481,7 +489,7 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
} }
/// Читаем конфигурацию параметров /// Читаем конфигурацию параметров
programconf_getParamsSettings(submod_sett, submod, shared_data, submod_user_data.params_map); programconf_getParamsSettings(submod_sett, submod, shared_data, submod_user_data.params_map, swap);
} }
} }

View File

@ -1,4 +1,5 @@
{ {
"SwapData": false,
"ProfinetDeviceSettings": "ProfinetDeviceSettings":
{ {
"product_name": "P-Net Sample Application", "product_name": "P-Net Sample Application",

View File

@ -255,7 +255,10 @@ void UserData::extractData(std::vector<uint8_t>& vect)
std::copy(&data_.uint8[0], &data_.uint8[size], buf); std::copy(&data_.uint8[0], &data_.uint8[size], buf);
/// Данные в профинет передаются в формате BigEndian /// Данные в профинет передаются в формате BigEndian
/// преобразуем из Little в Big /// преобразуем из Little в Big
endian_swapbytes(&buf[0], size); if (swap_)
{
endian_swapbytes(&buf[0], size);
}
/// Вставляем данные в вектор по офсету /// Вставляем данные в вектор по офсету
std::copy(buf, &buf[size], vect.begin() + data_offset_); std::copy(buf, &buf[size], vect.begin() + data_offset_);
} }
@ -266,7 +269,7 @@ void UserData::insertData(const std::vector<uint8_t>& vect)
std::copy(&vect[data_offset_], &vect[data_offset_ + size], data_.uint8); std::copy(&vect[data_offset_], &vect[data_offset_ + size], data_.uint8);
/// Конвертим /// Конвертим
if ((type >= UserDataTypes::UINT16) && if ((type >= UserDataTypes::UINT16) &&
(type <= UserDataTypes::FLOAT64)) (type <= UserDataTypes::FLOAT64) && swap_)
{ {
/// Данные в профинет передаются в формате BigEndian /// Данные в профинет передаются в формате BigEndian
/// преобразуем из Big в Little /// преобразуем из Big в Little

View File

@ -36,11 +36,12 @@ public:
FLOAT64, FLOAT64,
}; };
UserData(std::string& Name, std::string& DataType, uint16_t offset) : UserData(std::string& Name, std::string& DataType, uint16_t offset, bool swap) :
name{Name}, name{Name},
type{data_corr.at(DataType)}, type{data_corr.at(DataType)},
size{data_size.at(type)}, size{data_size.at(type)},
data_offset_{offset} data_offset_{offset},
swap_{swap}
{ {
data_.uint64 = 0; data_.uint64 = 0;
}; };
@ -115,6 +116,7 @@ private:
AnyData data_; /// Данные AnyData data_; /// Данные
std::vector<UserDataBit> bits_; /// std::vector<UserDataBit> bits_; ///
const uint16_t data_offset_; /// Офсет от начала датаграммы откуда начинаются данные const uint16_t data_offset_; /// Офсет от начала датаграммы откуда начинаются данные
const bool swap_; /// Перобразование порядка байт
}; };
struct SubmoduleUserData struct SubmoduleUserData