dev(UML-981): Добавил настройку отключения изменения порядка байт
This commit is contained in:
parent
d752ef5b44
commit
f6bbef1af9
@ -160,7 +160,7 @@ int main(int argc, char * argv[])
|
||||
{
|
||||
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()};
|
||||
///Запрос:
|
||||
*p_output_stream_ << request << std::endl;
|
||||
@ -409,13 +409,22 @@ int main(int argc, char * argv[])
|
||||
j_set_data["submodule_id"] = submodule_id;
|
||||
|
||||
auto& data = j_set_data["data"]["I808InpBits"];
|
||||
|
||||
for (int i = 0; i < 8; ++i)
|
||||
static bool init = true;
|
||||
if (init)
|
||||
{
|
||||
bits[i] = (~bits[i]) & 0x01;
|
||||
std::string bit_name = "in_bit_" + std::to_string(i);
|
||||
data[bit_name] = bits[i];
|
||||
for (int i = 0; i < 8; ++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);
|
||||
}
|
||||
break;
|
||||
|
@ -234,7 +234,7 @@ static bool programconf_getCyclycDataDir(json& j_cyclic_data, uint8_t& dir)
|
||||
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;
|
||||
|
||||
@ -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 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;
|
||||
|
||||
@ -285,7 +285,7 @@ static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<s
|
||||
static bool programconf_getParamsSettings(const json& j_sett,
|
||||
ProfinetData_Submodule& submod,
|
||||
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"))
|
||||
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.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);
|
||||
|
||||
@ -378,6 +378,14 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
|
||||
|
||||
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)
|
||||
{
|
||||
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 (!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;
|
||||
}
|
||||
@ -447,7 +455,7 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
|
||||
|
||||
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;
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"SwapData": false,
|
||||
"ProfinetDeviceSettings":
|
||||
{
|
||||
"product_name": "P-Net Sample Application",
|
||||
|
@ -255,7 +255,10 @@ void UserData::extractData(std::vector<uint8_t>& vect)
|
||||
std::copy(&data_.uint8[0], &data_.uint8[size], buf);
|
||||
/// Данные в профинет передаются в формате BigEndian
|
||||
/// преобразуем из Little в Big
|
||||
endian_swapbytes(&buf[0], size);
|
||||
if (swap_)
|
||||
{
|
||||
endian_swapbytes(&buf[0], size);
|
||||
}
|
||||
/// Вставляем данные в вектор по офсету
|
||||
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);
|
||||
/// Конвертим
|
||||
if ((type >= UserDataTypes::UINT16) &&
|
||||
(type <= UserDataTypes::FLOAT64))
|
||||
(type <= UserDataTypes::FLOAT64) && swap_)
|
||||
{
|
||||
/// Данные в профинет передаются в формате BigEndian
|
||||
/// преобразуем из Big в Little
|
||||
|
@ -36,11 +36,12 @@ public:
|
||||
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},
|
||||
type{data_corr.at(DataType)},
|
||||
size{data_size.at(type)},
|
||||
data_offset_{offset}
|
||||
data_offset_{offset},
|
||||
swap_{swap}
|
||||
{
|
||||
data_.uint64 = 0;
|
||||
};
|
||||
@ -115,6 +116,7 @@ private:
|
||||
AnyData data_; /// Данные
|
||||
std::vector<UserDataBit> bits_; ///
|
||||
const uint16_t data_offset_; /// Офсет от начала датаграммы откуда начинаются данные
|
||||
const bool swap_; /// Перобразование порядка байт
|
||||
};
|
||||
|
||||
struct SubmoduleUserData
|
||||
|
Loading…
Reference in New Issue
Block a user