Rapid Retriggering Of Trigger Once Transaction Group Fails

I have a triggered transaction group that logs parts as they come off the line, a few seconds between parts, and this works perfectly. However, on some occasions such as an unexpected stop, I want to log data for all the work in progress parts, so I queue it up and send it in a loop.

The problem I'm having is that when I do this, it goes extremely slowly, falling back on my timeout/retry mechanism. I'm already using both the write handshake and the reset trigger after execution options, and the PLC doesn't load the next set of data until those are seen.

At this point, my best guess at what is happening is that "trigger once" does not look at the tag reset action, and the PLC loads the next data and sets the trigger again before the next read of it by the transaction group, and thinks it's the same trigger. Does anyone know if this is indeed how the triggers work?

If so, any recommendations to improve the handshake? Maybe echoing back the trigger tag in a separate tag? Removing the "trigger once" might work, but I'd expect the much worse outcome of causing duplicate data if the network is slow. The easiest option, which will almost definitely work fine but isn't really any more robust than the normal timeout, is probably just a small magic number delay between logging attempts.

I've attached my trigger settings and the part of my code for the transaction group handshake, the loading of new data/resend is an outer state machine that waits for LogDataBusy to be false, and sets it true to start the communication. Beckhoff PLC using OPC UA.

Timeout(In:=LogDataBusy);

CASE State OF
	0: //Idle
		IF LogDataBusy THEN
			State := 10;
		END_IF
	10: //Idle Cycle Waiting for data to buffer in OPC server
		State := 20;
	20: 
		_DataReady := TRUE;
		State := 30;
	30: //Wait for response or timeout
		IF _DataSentOK THEN
			LogDataOK := TRUE;	
		ELSIF _DataSentNOK THEN
			LogDataNOK := TRUE;	
		ELSIF TimeOut.Q THEN
			LogDataNOK := TRUE;	
			TimeOut(IN := FALSE); //Reset to reuse as refresh timer
			State := 40;
		END_IF	
		IF NOT _DataReady AND (_DataSentOK OR _DataSentNOK) THEN
			LogDataBusy := FALSE;
			_DataSentOK := FALSE;
			_DataSentNOK := FALSE;
			TimeOut(IN := FALSE);
			State := 0;
		END_IF
	40: //Reset delay to let HMI server catch back up
		_DataReady := FALSE;
		
		IF TimeOut.Q THEN
			LogDataBusy := FALSE;
			_DataSentOK := FALSE;
			_DataSentNOK := FALSE;
			TimeOut(IN := FALSE);
			State := 0;
		END_IF
		
				
END_CASE