#include "profinet_shared_data_client.hpp" #include #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; } } }