dev(UML-981): Исправлена бага при установлении связи. Реализован функционал примера pnet для модуля echo
This commit is contained in:
parent
5e9e6c3133
commit
86e4f454c2
24
src/main.cpp
24
src/main.cpp
@ -87,12 +87,36 @@ int main(int argc, char * argv[])
|
||||
auto echo_submod = echo_mod->getSubmodulePtr(ECHO_SUBMOD_ID);
|
||||
echo_submod->putDataToPlc(Echo_inpCycData.mem);
|
||||
|
||||
auto param = echo_submod->getParameterPtr(ECHO_PARAMETER_GAIN_IDX);
|
||||
|
||||
|
||||
uint32_t ix = 0;
|
||||
while(1)
|
||||
{
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
||||
++ix;
|
||||
std::cout << "tick: " << ix << endl;
|
||||
if (echo_submod->isDataUpdated())
|
||||
{
|
||||
std::cout << "New data from Plc" << endl;
|
||||
///Читаем данные от ПЛК
|
||||
echo_submod->getDataFromPlc(Echo_outCycData.mem);
|
||||
//Читаем параметр записанный ПЛК при установлении связи
|
||||
param->readParameter((uint8_t*)&Echo_Gain);
|
||||
/// Конвертируем в литл эндиан
|
||||
endian_convert_32((uint8_t*)&Echo_Gain);
|
||||
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->putDataToPlc(Echo_inpCycData.mem);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -500,6 +500,7 @@ void Profinet::initDataAndIoxs()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
submodule_ptr->inputSetData( m_pnet_data.pnet_ptr,
|
||||
m_pnet_data.api,
|
||||
slot_ptr->m_slot_nbr,
|
||||
@ -543,13 +544,6 @@ void Profinet::PeriodicOperations()
|
||||
/// Ждем время в мкс: ticks_period_us, по умолчанию 1мс
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(m_run_period_us));
|
||||
|
||||
if (flags_.get_flag(FLAGS_AREP_APP_READY))
|
||||
{
|
||||
pnet_application_ready (m_pnet_data.pnet_ptr, m_pnet_data.arep_for_appl_ready);
|
||||
flags_.clear_flags(FLAGS_AREP_APP_READY);
|
||||
LOG("FLAGS_AREP_APP_READY");
|
||||
}
|
||||
|
||||
/// Вызов cyclic io
|
||||
if (++m_cyclic_io_cnt >= m_cyclic_io_period_ms)
|
||||
{
|
||||
@ -559,6 +553,14 @@ void Profinet::PeriodicOperations()
|
||||
|
||||
/// запускаем pnet
|
||||
pnet_handle_periodic (m_pnet_data.pnet_ptr);
|
||||
|
||||
/// Нужно делать после pnet_handle_periodic(следующий тик).
|
||||
if (flags_.get_flag(FLAGS_AREP_APP_READY))
|
||||
{
|
||||
pnet_application_ready (m_pnet_data.pnet_ptr, m_pnet_data.arep_for_appl_ready);
|
||||
flags_.clear_flags(FLAGS_AREP_APP_READY);
|
||||
LOG("FLAGS_AREP_APP_READY");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -661,9 +663,11 @@ int Profinet::callbackStateInd ( uint32_t arep, pnet_event_values_t event)
|
||||
|
||||
if (event == PNET_EVENT_ABORT)
|
||||
{
|
||||
LOG("callbackStateInd:PNET_EVENT_ABORT");
|
||||
LOG("callbackStateInd: PNET_EVENT_ABORT: The AR has been closed.");
|
||||
if (pnet_get_ar_error_codes (m_pnet_data.pnet_ptr, arep, &err_cls, &err_code) == 0)
|
||||
{
|
||||
LOG("err_cls= " + std::to_string(err_cls));
|
||||
LOG("err_code= " + std::to_string(err_code));
|
||||
/**
|
||||
* @brief Коды ошибок в err_cls и err_code
|
||||
* TODO: Нужно передавать в управляющее приложение
|
||||
@ -679,7 +683,7 @@ int Profinet::callbackStateInd ( uint32_t arep, pnet_event_values_t event)
|
||||
}
|
||||
else if (event == PNET_EVENT_PRMEND)
|
||||
{
|
||||
LOG("callbackStateInd:PNET_EVENT_PRMEND");
|
||||
LOG("callbackStateInd: PNET_EVENT_PRMEND: Controller has sent all write records.");
|
||||
if (isConnectedToController())
|
||||
{
|
||||
/// Если уже были подключены и пришел запрос на еще одно подключение
|
||||
@ -706,14 +710,20 @@ int Profinet::callbackStateInd ( uint32_t arep, pnet_event_values_t event)
|
||||
the internal stack states */
|
||||
m_pnet_data.arep_for_appl_ready = arep;
|
||||
flags_.set_flag(FLAGS_AREP_APP_READY);
|
||||
|
||||
///os_event_set (app->main_events, APP_EVENT_READY_FOR_DATA); ///
|
||||
}
|
||||
else if (event == PNET_EVENT_DATA)
|
||||
{
|
||||
LOG("callbackStateInd:PNET_EVENT_DATA");
|
||||
LOG("callbackStateInd: PNET_EVENT_DATA: The cyclic data transmission is now properly set up");
|
||||
/// Стартовал обмен cyclic io
|
||||
}
|
||||
else if (event == PNET_EVENT_STARTUP)
|
||||
{
|
||||
LOG("callbackStateInd: PNET_EVENT_STARTUP: A connection has been initiated.");
|
||||
}
|
||||
else if (event == PNET_EVENT_APPLRDY)
|
||||
{
|
||||
LOG("callbackStateInd: PNET_EVENT_APPLRDY: Controller has acknowledged the APPL_RDY message.");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -844,9 +854,7 @@ int Profinet::callbackWriteInd ( uint32_t arep,
|
||||
}
|
||||
|
||||
///3. Копируем данные
|
||||
param_ptr->writeParameter(p_write_data);
|
||||
|
||||
return 0;
|
||||
return param_ptr->writeParameter(p_write_data);
|
||||
}
|
||||
|
||||
int Profinet::callbackExpModuleInd ( uint16_t slot, uint32_t module_ident)
|
||||
|
@ -10,7 +10,8 @@ ProfinetSubmodule::ProfinetSubmodule(uint32_t submodule_id,
|
||||
inp_data_ptr_(nullptr),
|
||||
out_data_ptr_(nullptr),
|
||||
m_indata_iocs(0),
|
||||
m_outdata_iops(0)
|
||||
m_outdata_iops(0),
|
||||
data_updated_(false)
|
||||
{
|
||||
/// Могут быть подмодули без данных, например DAP
|
||||
if (m_data_cfg.insize > 0)
|
||||
@ -49,10 +50,17 @@ bool ProfinetSubmodule::inputSetData( pnet_t * pnet_ptr,
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(inp_data_mutex_);
|
||||
|
||||
if ((pnet_ptr == nullptr) || (inp_data_ptr_ == nullptr))
|
||||
if ((pnet_ptr == nullptr) ||
|
||||
((inp_data_ptr_ == nullptr) && m_data_cfg.insize > 0))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Вызов когда m_data_cfg.insize==0 и inp_data_ptr_== nullptr
|
||||
* нужен для корректного установления соединения
|
||||
*
|
||||
*/
|
||||
/// Копируем данные для передачи в ПЛК
|
||||
pnet_input_set_data_and_iops( pnet_ptr,
|
||||
api,
|
||||
@ -93,7 +101,11 @@ bool ProfinetSubmodule::outputGetData( pnet_t * pnet_ptr,
|
||||
&outdata_iops);
|
||||
|
||||
m_outdata_iops = outdata_iops;
|
||||
data_updated_ = updated;
|
||||
|
||||
if ((!data_updated_) && (updated == true))
|
||||
{
|
||||
data_updated_ = updated; /// Сбрасывается после прочтения данных устройством
|
||||
}
|
||||
|
||||
if (m_data_cfg.outsize != outdata_length)
|
||||
{
|
||||
@ -118,6 +130,8 @@ bool ProfinetSubmodule::getDataFromPlc(uint8_t * data_ptr)
|
||||
|
||||
memcpy(data_ptr, out_data_ptr_.get(), m_data_cfg.outsize);
|
||||
|
||||
data_updated_ = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user