Recorder Data for Different Addresses of the Same I/O (Output)

[RMP 8.3.1]

I have experienced some behavior that I did not predict regarding data coming in on recorders when I’m trying to get the “state” of an output.

I can get several different host/firmware addresses for an output. This is OK with me, so long as they behave the same. For general I/O, there’s the general I/O address (DigitalOutAddressGet), there’s the DIGITAL_OUTPUTS address, as well as the three PDO addresses (value, sent, override).

If I only use one of them as a recorder data item, I notice that it doesn’t always change, even though the output does change. If I add another data item for one of the “alternate” addresses of the output, the recorder data for both will (usually) change.

This is anecdotal, but I’ve run into this a number of times. To work around it, I frequently will just include several “copies” of the same output (different addresses), and that usually makes things work the way I’d expect (with just using any one of them).

I don’t have a MWE for this, but I’d like to know if there’s a Right Way™ to get an output’s value this way.

(FWIW, I’m trying to verify that streaming outputs is behaving correctly by comparing the state of the output to the actual axis position.)

Different drive/EtherCAT node PDO’s exist for different reasons. You should check your drive manufacturer manual for documentation on the difference between these addresses on the drive.

For example, something like a streaming output could set a digital output high but the override PDO could still be low if the streaming output isn’t configured to use the PDO as the method for changing the state of the output.

Observing or not observing a PDO value shouldn’t impact its state.

Generally when in doubt and debugging I’d recommend recording more stuff as it can help get a better understanding of how these things interact with each other.

Hypothetically, let’s say I’m trying to stream outputs, and I want to activate an drive output that is a general output.

There are three(?) ways to get an address/mask pair for the streaming output API.

  • MotionController::NetworkOutputAddressGet(...) (for the three different PDO addresses)
  • RapidCodeNetworkNode::DigitalOutAddressGet(...)
  • Axis::AddressGet(RSIAxisAddressTypeDIGITAL_OUTPUTS)

Let’s assume I’m not currently overriding the PDO output.

Which of these addresses is “better” to use?

I wouldn’t say any are better or worse, just different for use in different situations.
I would lean toward using the method off of the axis object though. It will get you the right address even if your EtherCAT topology (and thus PDOs) change. Assuming you are still setting up your axis correctly.