Figured it out, and it was in fact the transaction code. I had improperly set the tcode for write block. The confusing thing is that it was in fact writing something to memory based on ioManager, which was incorrect. Since the packet was improperly formatted, I would have expected a failure response, but not so. So I have finally gotten a 1 hz timer routine working off of timer events.
One of the problems in developing custom stuff is typos in the manuals. On page 69 the turn on digital points I think is missing the two extended tcode bytes between the length and data field based on the packet description preceeding it. 000004100000FFFFF0500000000800000000FFFFFFAA
At first I trimmed these out of my packets thinking there was an error in the packet, until I spotted the tcode issue, then I had to put them back to get it to work.
I see that the B3000-ENET should support Pulse generation 'N pulses, continuous
square wave, on-pulse, off-pulse’ but I have not as of yet figured out where in the OptoMMP guide the mmap location for this can be found.