119 lines
3.9 KiB
C++
119 lines
3.9 KiB
C++
|
|
#include "profinet_shared_data_client.hpp"
|
||
|
|
#include <iostream>
|
||
|
|
|
||
|
|
#define ECHO_MODULE_ID 0x00000040 /// Идентификатор тестового модуля
|
||
|
|
#define ECHO_SUBMOD_ID 0x00000140 /// Идентификатор тестового подмодуля
|
||
|
|
#define ECHO_INPUT_DATA_SIZE 8
|
||
|
|
#define ECHO_OUTPUT_DATA_SIZE 8
|
||
|
|
#define ECHO_PARAMETER_GAIN_IDX 125 /// Индекс параметра Gain для подмодуля ECHO
|
||
|
|
|
||
|
|
using namespace std;
|
||
|
|
|
||
|
|
uint32_t Echo_Gain = 0;
|
||
|
|
|
||
|
|
struct EchoData {
|
||
|
|
float data_f;
|
||
|
|
uint32_t data_i;
|
||
|
|
};
|
||
|
|
|
||
|
|
union EchoDataMem
|
||
|
|
{
|
||
|
|
EchoData data;
|
||
|
|
uint8_t mem[sizeof(EchoData)];
|
||
|
|
};
|
||
|
|
|
||
|
|
EchoDataMem Echo_inpCycData;
|
||
|
|
EchoDataMem Echo_outCycData;
|
||
|
|
|
||
|
|
uint8_t be_data_inp[sizeof(EchoData)];
|
||
|
|
|
||
|
|
void endian_convert_32(uint8_t * p_data)
|
||
|
|
{
|
||
|
|
uint8_t tmp = p_data[1];
|
||
|
|
p_data[1] = p_data[2];
|
||
|
|
p_data[2] = tmp;
|
||
|
|
tmp = p_data[0];
|
||
|
|
p_data[0] = p_data[3];
|
||
|
|
p_data[3] = tmp;
|
||
|
|
}
|
||
|
|
|
||
|
|
ProfinetSharedDataClient shared_data;
|
||
|
|
ProfinetData_Map * p_profinet_data;
|
||
|
|
|
||
|
|
uint32_t event_mask = ( ProfinetEvent::EVENT_CONNECTION_ESTABLISHED |
|
||
|
|
ProfinetEvent::EVENT_NEW_CYCLIC_DATA |
|
||
|
|
ProfinetEvent::EVENT_NEW_PARAM_DATA |
|
||
|
|
ProfinetEvent::EVENT_CONNECTION_ABORT );
|
||
|
|
|
||
|
|
int main(int argc, char * argv[])
|
||
|
|
{
|
||
|
|
p_profinet_data = shared_data.Connect("profinet_shared_data");
|
||
|
|
auto& echo_module = p_profinet_data->p_mods[0];
|
||
|
|
if (echo_module.id != ECHO_MODULE_ID)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
auto& echo_submod = echo_module.p_submods[0];
|
||
|
|
|
||
|
|
if (echo_submod.id != ECHO_SUBMOD_ID)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
auto& echo_param_gain = echo_submod.p_params[0];
|
||
|
|
|
||
|
|
if (echo_param_gain.index != ECHO_PARAMETER_GAIN_IDX)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
std::cout << "Strarting..." << std::endl;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
for(;;)
|
||
|
|
{
|
||
|
|
uint32_t events = p_profinet_data->Events.wait_flags(event_mask);
|
||
|
|
|
||
|
|
if (events & ProfinetEvent::EVENT_CONNECTION_ESTABLISHED)
|
||
|
|
{
|
||
|
|
p_profinet_data->Events.clear_flags(ProfinetEvent::EVENT_CONNECTION_ESTABLISHED);
|
||
|
|
|
||
|
|
std::cout << "Event: PLC connection established" << std::endl;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (events & ProfinetEvent::EVENT_NEW_CYCLIC_DATA)
|
||
|
|
{
|
||
|
|
std::cout << "New cyc data" << std::endl;
|
||
|
|
|
||
|
|
p_profinet_data->Events.clear_flags(ProfinetEvent::EVENT_NEW_CYCLIC_DATA);
|
||
|
|
|
||
|
|
///Читаем данные от ПЛК
|
||
|
|
echo_submod.out_data.Read(0, Echo_outCycData.mem, echo_submod.cyc_outdata_len);
|
||
|
|
/// Конвертируем в литл эндиан
|
||
|
|
endian_convert_32((uint8_t*)&Echo_outCycData.data.data_i);
|
||
|
|
endian_convert_32((uint8_t*)&Echo_outCycData.data.data_f);
|
||
|
|
///Подготавливаем данные для ПЛК
|
||
|
|
Echo_inpCycData.data.data_i = Echo_Gain * Echo_outCycData.data.data_i;
|
||
|
|
Echo_inpCycData.data.data_f = Echo_Gain * Echo_outCycData.data.data_f;
|
||
|
|
///Конвертируем в биг эндиан
|
||
|
|
endian_convert_32((uint8_t*)&Echo_inpCycData.data.data_i);
|
||
|
|
endian_convert_32((uint8_t*)&Echo_inpCycData.data.data_f);
|
||
|
|
///Отправляем данные для ПЛК
|
||
|
|
echo_submod.inp_data.Write(0, Echo_inpCycData.mem, echo_submod.cyc_indata_len);
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
if (events & ProfinetEvent::EVENT_NEW_PARAM_DATA)
|
||
|
|
{
|
||
|
|
p_profinet_data->Events.clear_flags(ProfinetEvent::EVENT_NEW_PARAM_DATA);
|
||
|
|
|
||
|
|
std::cout << "Event: New parameter data: " << std::endl;
|
||
|
|
//Читаем параметр записанный ПЛК при установлении связи
|
||
|
|
echo_param_gain.data.Read(0, (uint8_t*)&Echo_Gain, echo_param_gain.length);
|
||
|
|
/// Конвертируем в литл эндиан
|
||
|
|
endian_convert_32((uint8_t*)&Echo_Gain);
|
||
|
|
std::cout << "Echo_Gain = " << std::to_string(Echo_Gain) << endl;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|