You cannot assume that the OPC DA tags are updated syncronously.
Here are 4 methods to assure that the data is consistent.
1. Instead of the OPC client polling the tags, you can let the PLC send the data to the OPC Server via send/receive.
The usual OPC DA name will be something like Simaticnet.S7[..] or Simaticnet.SY[..], but for the send/recieve interface it has to be Simaticnet.SR[..]
(this from memory, so dont kill me).
2. Let the PLC increment a counter to indicate when new data is ready. Let the OPC client read all the data as an array, including the counter. Then evaluate the data in the OPC client software when the counter tells that there is new data.
I think this only works as long as the array isnt bigger than the PDU of the S7 CPU.
3. Same as 2, except if the amount of data is bigger than the PDU of the CPU, then a trick is to let the counter be the very last position in the array. In this way, when the OPC client senses that the counter has changed, all data is updated even if it spans multiple reads.
I think this is only safe if the data doesnt change too often.
4. Let the PLC increment a counter to indicate when new data is ready. Let the OPC client read only the counter cyclically. When the OPC client detects that the counter changes, then initiate another read of the net data, preferably as an array.