예제 #1
0
        void IOPCDataCallback.OnReadComplete(
            int dwTransid, int hGroup, int hrMasterquality, int hrMastererror, int dwCount,
            IntPtr phClientItems, IntPtr pvValues, IntPtr pwQualities, IntPtr pftTimeStamps, IntPtr ppErrors)
        {
            Trace.WriteLine($"{nameof(OpcGroup)}.{nameof(IOPCDataCallback.OnReadComplete)}, transID:{dwTransid}, count:{dwCount}, thread ID:{System.Threading.Thread.CurrentThread.ManagedThreadId}");

            if ((dwCount == 0) || (hGroup != stateHandleClient))
            {
                return;
            }

            ReadCompleteEventArgs eventArgs = new ReadCompleteEventArgs
            {
                TransactionID     = dwTransid,
                GroupHandleClient = hGroup,
                MasterQuality     = hrMasterquality,
                MasterError       = hrMastererror,
                ItemStates        = new OpcItemState[dwCount]
            };

            for (int i = 0; i < dwCount; i++)
            {
                eventArgs.ItemStates[i] = new OpcItemState
                {
                    Error        = Extensions.ReadInt32(ppErrors, i),
                    HandleClient = Extensions.ReadInt32(phClientItems, i)
                };
                if (HRESULTS.Succeeded(eventArgs.ItemStates[i].Error))
                {
                    // Test if native variant is VT_ERROR
                    short vt = Marshal.ReadInt16(pvValues, i * Extensions.NativeVariantSize);
                    if (vt == (short)VarEnum.VT_ERROR)
                    {
                        eventArgs.ItemStates[i].Error = Marshal.ReadInt32(pvValues, (i * Extensions.NativeVariantSize) + 8);
                    }

                    eventArgs.ItemStates[i].DataValue = Extensions.GetObjectForNativeVariant(pvValues, i);
                    eventArgs.ItemStates[i].Quality   = Extensions.ReadInt16(pwQualities, i);
                    eventArgs.ItemStates[i].TimeStamp = Extensions.ReadInt64(pftTimeStamps, i);
                }
            }

            readCompleted?.Invoke(this, eventArgs);
        }
 public void TheGrpReadComplete(object sender, ReadCompleteEventArgs e)
 {
     lock (locker) {
         InstantLogger.msg("after read");
         InstantLogger.msg("ReadComplete event: gh={0} id={1} me={2} mq={3}", e.groupHandleClient,
                           e.transactionID,
                           e.masterError, e.masterQuality);
         foreach (OPCItemState s in e.sts) {
             if (HRESULTS.Succeeded(s.Error))
                 InstantLogger.msg(" ih={0} v={1} q={2} t={3}", s.HandleClient, s.DataValue, s.Quality,
                                   s.TimeStamp);
             else
                 InstantLogger.msg(" ih={0}    ERROR=0x{1:x} !", s.HandleClient, s.Error);
         }
     }
 }
 public void TheGrpReadComplete(object sender, ReadCompleteEventArgs e)
 {
     CoreEventGenerator(sender, e);
 }
        void IOPCDataCallback.OnReadComplete(
            int dwTransid, int hGroup, int hrMasterquality, int hrMastererror, int dwCount,
            IntPtr phClientItems, IntPtr pvValues, IntPtr pwQualities, IntPtr pftTimeStamps, IntPtr ppErrors)
        {
            Trace.WriteLine( "OpcGroup.OnReadComplete" );
            if( (dwCount == 0) || (hGroup != state.HandleClient) )
            return;
            int count = (int) dwCount;

            int	runh = (int) phClientItems;
            int	runv = (int) pvValues;
            int	runq = (int) pwQualities;
            int	runt = (int) pftTimeStamps;
            int	rune = (int) ppErrors;

            ReadCompleteEventArgs	e = new ReadCompleteEventArgs();
            e.transactionID		= dwTransid;
            e.groupHandleClient	= hGroup;
            e.masterQuality		= hrMasterquality;
            e.masterError		= hrMastererror;
            e.sts				= new OPCItemState[ count ];

            for( int i = 0; i < count; i++ )
            {
            e.sts[i] = new OPCItemState();
            e.sts[i].Error = Marshal.ReadInt32( (IntPtr) rune );
            rune += 4;

            e.sts[i].HandleClient = Marshal.ReadInt32( (IntPtr) runh );
            runh += 4;

            if( HRESULTS.Succeeded( e.sts[i].Error ) )
                {
                short vt = Marshal.ReadInt16( (IntPtr) runv );
                if( vt == (short) VarEnum.VT_ERROR )
                    e.sts[i].Error = Marshal.ReadInt32( (IntPtr) (runv + 8) );

                e.sts[i].DataValue	= Marshal.GetObjectForNativeVariant( (IntPtr) runv );
                e.sts[i].Quality = Marshal.ReadInt16( (IntPtr) runq );
                e.sts[i].TimeStamp = Marshal.ReadInt64( (IntPtr) runt );
                }

            runv += DUMMY_VARIANT.ConstSize;
            runq += 2;
            runt += 8;
            }

            if( ReadCompleted != null )
            ReadCompleted( this, e );
        }
예제 #5
0
        void IOPCDataCallback.OnReadComplete(
            int dwTransid, int hGroup, int hrMasterquality, int hrMastererror, int dwCount,
            IntPtr phClientItems, IntPtr pvValues, IntPtr pwQualities, IntPtr pftTimeStamps, IntPtr ppErrors)
        {
            Trace.WriteLine("OpcGroup.OnReadComplete");
            if ((dwCount == 0) || (hGroup != state.HandleClient))
            {
                return;
            }
            int count = (int)dwCount;

            int runh = (int)phClientItems;
            int runv = (int)pvValues;
            int runq = (int)pwQualities;
            int runt = (int)pftTimeStamps;
            int rune = (int)ppErrors;

            ReadCompleteEventArgs e = new ReadCompleteEventArgs();

            e.transactionID     = dwTransid;
            e.groupHandleClient = hGroup;
            e.masterQuality     = hrMasterquality;
            e.masterError       = hrMastererror;
            e.sts = new OPCItemState[count];

            for (int i = 0; i < count; i++)
            {
                OPCItemState item = new OPCItemState();
                e.sts[i]   = item;
                item.Error = Marshal.ReadInt32((IntPtr)rune);
                rune      += 4;

                item.HandleClient = Marshal.ReadInt32((IntPtr)runh);
                runh += 4;

                if (HRESULTS.Succeeded(item.Error))
                {
                    short vt = Marshal.ReadInt16((IntPtr)runv);
                    if (vt == (short)VarEnum.VT_ERROR)
                    {
                        item.Error = Marshal.ReadInt32((IntPtr)(runv + 8));
                    }

                    item.DataValue     = Marshal.GetObjectForNativeVariant((IntPtr)runv);
                    item.QualityString = QualityToString(Marshal.ReadInt16((IntPtr)runq));
                    try
                    {
                        item.TimeStamp = DateTime.FromFileTime(Marshal.ReadInt64((IntPtr)runt));
                    }
                    catch
                    {
                    }
                }

                runv += DUMMY_VARIANT.ConstSize;
                runq += 2;
                runt += 8;
            }

            if (ReadCompleted != null)
            {
                ReadCompleted(this, e);
            }
        }