Mine was a coding error. I had some cross contamination between the two program blocks. Once I fixed it, my connection is staying opening and running fine.
FWIW...not saying there isn't an issue...but on no less than 3 occasions today, I have sworn it wasn't working right and it turned out to be a coding error. It is very easy to do when you create copies of the same code and modify it.
I did find a couple of things in the implementation I don't like however. One was that once a STREAMIN has passed the initial check for a connection, it doesn't check on subsequent scans. The code was there for the check and I had commented it out. What bothers me is I don't remember why I removed it, and I didn't leave myself any bread crumbs, which I generally do. Adding the check back in allows STREAMIN to fail due to a lost connection when no timeout was configured. Truthfully, it is pretty bad form to not use a timeout, but, it is worse form to allow an instruction to get hung badly enough that a trip to program mode is required. So I put the checks back in. It will be interesting to see what I just broke.

The other thing I found that I don't like is that the OPENTCP was not setting the .Connected member immediately upon completion, but relying on some background code that manages it after it is open. What this means is that if anything was expecting .Connected to be true between the completion of OPENTCP and the bottom of the current scan, it might be wrongly concluding that the connection is closed. Upon reflecting on it, that seems like that could be a pretty big deal...I would fully expect code to be testing the connection immediately after opening. That could be causing you trouble.