cancel
Showing results for 
Search instead for 
Did you mean: 
SOLVED

Correct way to obtain memory map in a real time bundle.

Correct way to obtain memory map in a real time bundle.

Elleshar
Established Member

Hello Community,

as the topic says: Correct way to obtain memory map in a real time bundle.
How can we do this?

Is there a way to use something like this?:
member = std::shared_ptr<comm::datalayer::IMemoryUser>();
DatalayerFactory->openMemory(member , "fieldbuses/ethercat/master/instances/ethercatmaster/realtime_data/output");
member ->getMemoryMap(data);

Or do we need to use readAsync(...)

What's the best practice?

Sincerely Elleshar

 

3 REPLIES 3

nickH
Community Moderator
Community Moderator

Hello Elleshar,

If you want to access the data layer out of a realtime bundle, you have to access the data in the ctrlX Data Layer like it is shown in the datalayer.realtime example. Therefore you use the service provided by the ctrlX Data Layer itself. But you have to register a ServiceDependency to the Data Layer Service in the activator.cpp first. 

Please have a look at this thread

 

Best regards, 

Nick

Elleshar
Established Member

Hi Nick,

we are already doing like in the thread you posted.
Exactly like this: https://developer.community.boschrexroth.com/t5/SDK/How-to-access-RT-Data-from-Scheduler-app/m-p/205...

But we are using a node from the Ethercatmaster-App.
Our primary problem is that when we call 

result = output_led->getMemoryMap(data_led);

 
we get an invalid memory map. (DL_RT_INVALIDMEMORYMAP)
our address: std::string ethercatNode = "fieldbuses/ethercat/master/instances/ethercatmaster/realtime_data/output";

Sincerely Elleshar

nickH
Community Moderator
Community Moderator

Hi, 

be aware of the moment when you call:

result = output_led->getMemoryMap(data_led);

When you call this code when the scheduler is still in config-mode, the EtherCat Data may not be valid.

 

For a quick and dirty workaround you can try to read it in until you get a valid memory map (when your scheduler is running). 

 

do
{
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    result = output_led->getMemoryMap(data_led);
} while (comm::datalayer::STATUS_FAILED(result));

 

But be sure you have deactivated your watchdog before you try this. 

 

Best regards

Nick

Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist