public void NewValueTestMethod()
        {
            ProducerBindingFactory _pr = new ProducerBindingFactory();

            Assert.IsNotNull(_pr);
            IProducerBinding _bn = _pr.GetProducerBinding("ProducerBinding", "variableName", new UATypeInfo(BuiltInType.String));

            Assert.IsNotNull(_bn);
            int _changeCounter = 0;

            _bn.PropertyChanged += (x, y) => _changeCounter++;
            Assert.IsFalse(_bn.NewValue);
            Assert.AreEqual <int>(0, _changeCounter);
            _pr.Modify("654321");
            Assert.IsTrue(_bn.NewValue);
            Assert.AreEqual <int>(1, _changeCounter);
            string _testValue = "1231221431423421";

            _pr.Modify(_testValue);
            Assert.IsTrue(_bn.NewValue);
            Assert.AreEqual <int>(1, _changeCounter);
            Assert.AreEqual <string>(_testValue, (string)_bn.GetFromRepository());
            Assert.IsFalse(_bn.NewValue);
            Assert.AreEqual <int>(1, _changeCounter);
            Assert.AreEqual <string>(_testValue, (string)_bn.GetFromRepository());
            Assert.IsFalse(_bn.NewValue);
            _pr.Modify(_testValue);
            Assert.IsFalse(_bn.NewValue);
            Assert.AreEqual <int>(1, _changeCounter);
            _testValue = "987654321";
            _pr.Modify(_testValue);
            Assert.IsTrue(_bn.NewValue);
            Assert.AreEqual <int>(2, _changeCounter);
            Assert.AreEqual <string>(_testValue, (string)_bn.GetFromRepository());
        }
예제 #2
0
        private void WriteValueVariant(IProducerBinding producerBinding)
        {
            object  value    = producerBinding.GetFromRepository();
            Variant _variant = new Variant(producerBinding.Encoding, value);

            m_UAEncoder.Write(this, _variant);
        }
        /// <summary>
        /// Gets the consumer binding for data member.
        /// </summary>
        /// <param name="member">The field description captured bu object of type <see cref="FieldMetaData"/> .</param>
        /// <param name="repositoryGroup">The repository group.</param>
        /// <param name="bindingFactory">The binding factory.</param>
        /// <param name="encodingFactory">The encoding factory.</param>
        /// <returns>An instance of <see cref="IProducerBinding" /> type.</returns>
        internal static IProducerBinding GetProducerBinding4DataMember(this FieldMetaData member, string repositoryGroup, IBindingFactory bindingFactory, IEncodingFactory encodingFactory)
        {
            IProducerBinding _binding = bindingFactory.GetProducerBinding(repositoryGroup, member.ProcessValueName, member.TypeInformation);

            encodingFactory.UpdateValueConverter(_binding, repositoryGroup, member.TypeInformation);
            return(_binding);
        }
        public void CorrectInitializationTestMethod()
        {
            ProducerBindingFactory _pr = new ProducerBindingFactory();

            Assert.IsNotNull(_pr);
            IProducerBinding _bn = _pr.GetProducerBinding("ProducerBindingMonitoredValue", "variableName", new UATypeInfo(BuiltInType.String));

            Assert.IsNotNull(_bn);
            Assert.IsFalse(_bn.NewValue);
            _pr.Modify("654321");
            Assert.IsTrue(_bn.NewValue);
            _bn.GetFromRepository();
            Assert.IsFalse(_bn.NewValue);
            int _changeCounter = 0;

            _bn.PropertyChanged += (x, y) => _changeCounter++;
            Assert.AreEqual <int>(0, _changeCounter);
            _pr.Modify("1234567");
            Assert.IsTrue(_bn.NewValue);
            Assert.AreEqual <int>(1, _changeCounter);
            _bn.GetFromRepository();
            _pr.Modify("654321");
            _pr.Modify("1234567");
            Assert.AreEqual <int>(2, _changeCounter);
        }
        public void CreatorTestMethod1()
        {
            ProducerBindingFactory _pr = new ProducerBindingFactory();

            Assert.IsNotNull(_pr);
            IProducerBinding _bn = _pr.GetProducerBinding("ProducerBinding", "variableName", new UATypeInfo(BuiltInType.String));

            Assert.IsNotNull(_bn);
        }
예제 #6
0
        public void GetProducerBindingTypesMismatchTest()
        {
            BoilersSetFixture _boiler = new BoilersSetFixture();

            using (DataGenerator _generator = new DataGenerator(_boiler))
            {
                IBindingFactory  _bindingFactory = _generator;
                IProducerBinding _binding        = _bindingFactory.GetProducerBinding("repositoryGroup", "processValueName", new UATypeInfo(BuiltInType.Int16));
            }
        }
        public void GetNewValueTestMethod()
        {
            ProducerBindingFactory _pr = new ProducerBindingFactory();

            Assert.IsNotNull(_pr);
            IProducerBinding _bn = _pr.GetProducerBinding("ProducerBinding", "variableName", new UATypeInfo(BuiltInType.String));

            Assert.IsNotNull(_bn);
            string _testValue = "1231221431423421";

            _pr.Modify(_testValue);
            Assert.IsTrue(_bn.NewValue);
            Assert.AreEqual <string>(_testValue, (string)_bn.GetFromRepository());
            Assert.IsFalse(_bn.NewValue);
        }
예제 #8
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ProducerAssociation"/> class.
 /// </summary>
 /// <param name="data">The semantic data description.</param>
 /// <param name="aliasName">Name of the alias - .</param>
 /// <param name="dataSet">The data set configuration.</param>
 /// <param name="bindingFactory">The binding factory.</param>
 /// <param name="encodingFactory">The encoding factory.</param>
 internal ProducerAssociation(ISemanticData data, string aliasName, DataSetConfiguration dataSet, IBindingFactory bindingFactory, IEncodingFactory encodingFactory)
     : base(data, dataSet.AssociationName)
 {
     m_ConfigurationVersion = dataSet.ConfigurationVersion;
     m_DataSetBindings      =
         dataSet.DataSet.Select <FieldMetaData, IProducerBinding>
             ((_fieldMetadata) =>
     {
         IProducerBinding _ret = _fieldMetadata.GetProducerBinding4DataMember(dataSet.RepositoryGroup, bindingFactory, encodingFactory);
         _ret.PropertyChanged += ProducerBinding_PropertyChanged;
         return(_ret);
     }).ToArray <IProducerBinding>();
     m_Timer = new Timer(1000)
     {
         AutoReset = true
     };
     m_Timer.Elapsed += M_Timer_Elapsed;
     m_Timer.Start();
 }
예제 #9
0
        /// <summary>
        /// Sends the data described by a data set collection to remote destination.
        /// </summary>
        /// <param name="producerBinding">Encapsulates functionality used by the <see cref="IMessageWriter" /> to collect all the data (data set items) required to prepare new message and send it over the network.</param>
        /// <param name="length">Number of items to be send used to calculate the length of the message.</param>
        /// <param name="contentMask">The content mask represented as unsigned number <see cref="UInt64" />. The order of the bits starting from the least significant
        /// bit matches the order of the data items within the data set.</param>
        /// <param name="encoding">The encoding.</param>
        /// <param name="dataSelector">The data selector.</param>
        /// <param name="messageSequenceNumber">The message sequence number. A monotonically increasing sequence number assigned by the publisher to each message sent.</param>
        /// <param name="timeStamp">The time stamp - the time the Data was collected.</param>
        /// <param name="configurationVersion">The configuration version.</param>
        /// <exception cref="System.ArgumentOutOfRangeException">Impossible to convert null value
        /// or</exception>
        void IMessageWriter.Send
            (Func <int, IProducerBinding> producerBinding, ushort length, ulong contentMask, FieldEncodingEnum encoding, DataSelector dataSelector,
            ushort messageSequenceNumber, DateTime timeStamp, ConfigurationVersionDataType configurationVersion)
        {
            lock (this)
            {
                if (State.State != HandlerState.Operational)
                {
                    return;
                }
                ContentMask = contentMask;

                CreateMessage(encoding, dataSelector.PublisherId, dataSelector.DataSetWriterId, length, messageSequenceNumber, timeStamp, configurationVersion);
                //UInt64 _mask = 0x1;
                for (int i = 0; i < length; i++)
                {
                    //TODO: Implement ContentMask https://github.com/mpostol/OPC-UA-OOI/issues/89
                    //if ((ContentMask & _mask) > 0)
                    //{
                    IProducerBinding _pb = producerBinding(i);
                    switch (encoding)
                    {
                    case FieldEncodingEnum.VariantFieldEncoding:
                        WriteValueVariant(_pb);
                        break;

                    case FieldEncodingEnum.CompressedFieldEncoding:
                        WriteValue(_pb);
                        break;

                    case FieldEncodingEnum.DataValueFieldEncoding:
                        WriteDataValue(_pb);
                        break;
                    }
                    //}
                    //_mask = _mask << 1;
                }
                SendMessage();
            }
        }
예제 #10
0
        public void GetProducerBindingTest()
        {
            BoilersSetFixture _boiler = new BoilersSetFixture();

            using (DataGenerator _generator = new DataGenerator(_boiler))
            {
                IBindingFactory  _bindingFactory = _generator;
                IProducerBinding _binding        = _bindingFactory.GetProducerBinding("repositoryGroup", "processValueName", new UATypeInfo(BuiltInType.Boolean));
                Assert.IsNotNull(_binding);
                _binding.Encoding.IsEqual(new UATypeInfo(BuiltInType.Boolean));
                Assert.IsFalse(_binding.NewValue);
                Assert.IsNull(_binding.Parameter);
                int _newValueInvocationCount = 0;
                _binding.PropertyChanged += (x, evetArgs) => _newValueInvocationCount++;
                _boiler.Variable.Change();
                Assert.AreEqual <int>(1, _newValueInvocationCount);
                Assert.IsTrue(_binding.NewValue);
                Assert.IsTrue((bool)_binding.GetFromRepository());
                Assert.IsFalse(_binding.NewValue);
                Assert.AreEqual <int>(1, _newValueInvocationCount);
            }
            Assert.AreEqual <int>(1, _boiler.DisposeCount);
        }
예제 #11
0
 private void WriteDataValue(IProducerBinding _pb)
 {
     throw new NotImplementedException();
 }
예제 #12
0
 private void WriteDataValue(IProducerBinding _pb)
 {
     throw new NotImplementedException();
 }
예제 #13
0
        private void WriteValue(IProducerBinding producerBinding)
        {
            object value = producerBinding.GetFromRepository();

            switch (producerBinding.Encoding.BuiltInType)
            {
            case BuiltInType.Boolean:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((bool)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <bool>(this, (Array)value, Write, BuiltInType.Boolean);
                }
                break;

            case BuiltInType.SByte:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((sbyte)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <sbyte>(this, (Array)value, Write, BuiltInType.SByte);
                }
                break;

            case BuiltInType.Byte:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((byte)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <byte>(this, (Array)value, Write, BuiltInType.Byte);
                }
                break;

            case BuiltInType.DateTime:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (DateTime)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <DateTime>(this, (Array)value, Write, BuiltInType.DateTime);
                }
                break;

            case BuiltInType.Double:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((double)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <double>(this, (Array)value, Write, BuiltInType.Double);
                }
                break;

            case BuiltInType.Int16:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((short)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <short>(this, (Array)value, Write, BuiltInType.Int16);
                }
                break;

            case BuiltInType.Enumeration:
            case BuiltInType.Int32:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((int)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <int>(this, (Array)value, Write, BuiltInType.Int32);
                }
                break;

            case BuiltInType.Int64:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((long)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <long>(this, (Array)value, Write, BuiltInType.Int64);
                }
                break;

            case BuiltInType.Float:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((float)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <float>(this, (Array)value, Write, BuiltInType.Float);
                }
                break;

            case BuiltInType.String:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (string)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <string>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.String);
                }
                break;

            case BuiltInType.UInt16:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((ushort)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <ushort>(this, (Array)value, Write, BuiltInType.UInt16);
                }
                break;

            case BuiltInType.UInt32:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((uint)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <uint>(this, (Array)value, Write, BuiltInType.UInt32);
                }
                break;

            case BuiltInType.UInt64:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    Write((ulong)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <ulong>(this, (Array)value, Write, BuiltInType.UInt64);
                }
                break;

            case BuiltInType.Guid:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (Guid)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <Guid>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.Guid);
                }
                break;

            case BuiltInType.ByteString:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (byte[])value);
                }
                else
                {
                    m_UAEncoder.WriteArray <byte[]>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.ByteString);
                }
                break;

            case BuiltInType.XmlElement:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (XmlElement)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <XmlElement>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.XmlElement);
                }
                break;

            case BuiltInType.NodeId:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (INodeId)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <INodeId>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.NodeId);
                }
                break;

            case BuiltInType.ExpandedNodeId:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (IExpandedNodeId)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <IExpandedNodeId>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.ExpandedNodeId);
                }
                break;

            case BuiltInType.StatusCode:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (IStatusCode)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <IStatusCode>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.StatusCode);
                }
                break;

            case BuiltInType.QualifiedName:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (IQualifiedName)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <IQualifiedName>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.QualifiedName);
                }
                break;

            case BuiltInType.LocalizedText:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (ILocalizedText)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <ILocalizedText>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.LocalizedText);
                }
                break;

            case BuiltInType.ExtensionObject:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (IExtensionObject)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <IExtensionObject>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.ExtensionObject);
                }
                break;

            case BuiltInType.DataValue:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (IDataValue)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <IDataValue>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.DataValue);
                }
                break;

            case BuiltInType.Variant:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (IVariant)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <IVariant>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.Variant);
                }
                break;

            case BuiltInType.DiagnosticInfo:
                if (producerBinding.Encoding.ValueRank < 0)
                {
                    m_UAEncoder.Write(this, (IDiagnosticInfo)value);
                }
                else
                {
                    m_UAEncoder.WriteArray <IDiagnosticInfo>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.DiagnosticInfo);
                }
                break;

            case BuiltInType.Null:
            default:
                throw new ArgumentOutOfRangeException($"Impossible to convert {value} of type {producerBinding.Encoding}");
            }
        }
예제 #14
0
 private void WriteValue(IProducerBinding producerBinding)
 {
     object value = producerBinding.GetFromRepository();
       switch (producerBinding.Encoding.BuiltInType)
       {
     case BuiltInType.Boolean:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((Boolean)value);
       else
     m_UAEncoder.WriteArray<Boolean>(this, (Array)value, Write, BuiltInType.Boolean);
       break;
     case BuiltInType.SByte:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((SByte)value);
       else
     m_UAEncoder.WriteArray<SByte>(this, (Array)value, Write, BuiltInType.SByte);
       break;
     case BuiltInType.Byte:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((Byte)value);
       else
     m_UAEncoder.WriteArray<Byte>(this, (Array)value, Write, BuiltInType.Byte);
       break;
     case BuiltInType.DateTime:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (DateTime)value);
       else
     m_UAEncoder.WriteArray<DateTime>(this, (Array)value, Write, BuiltInType.DateTime);
       break;
     case BuiltInType.Double:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((Double)value);
       else
     m_UAEncoder.WriteArray<Double>(this, (Array)value, Write, BuiltInType.Double);
       break;
     case BuiltInType.Int16:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((Int16)value);
       else
     m_UAEncoder.WriteArray<Int16>(this, (Array)value, Write, BuiltInType.Int16);
       break;
     case BuiltInType.Enumeration:
     case BuiltInType.Int32:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((Int32)value);
       else
     m_UAEncoder.WriteArray<Int32>(this, (Array)value, Write, BuiltInType.Int32);
       break;
     case BuiltInType.Int64:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((Int64)value);
       else
     m_UAEncoder.WriteArray<Int64>(this, (Array)value, Write, BuiltInType.Int64);
       break;
     case BuiltInType.Float:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((Single)value);
       else
     m_UAEncoder.WriteArray<Single>(this, (Array)value, Write, BuiltInType.Float);
       break;
     case BuiltInType.String:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (String)value);
       else
     m_UAEncoder.WriteArray<String>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.String);
       break;
     case BuiltInType.UInt16:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((UInt16)value);
       else
     m_UAEncoder.WriteArray<UInt16>(this, (Array)value, Write, BuiltInType.UInt16);
       break;
     case BuiltInType.UInt32:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((UInt32)value);
       else
     m_UAEncoder.WriteArray<UInt32>(this, (Array)value, Write, BuiltInType.UInt32);
       break;
     case BuiltInType.UInt64:
       if (producerBinding.Encoding.ValueRank < 0)
     Write((UInt64)value);
       else
     m_UAEncoder.WriteArray<UInt64>(this, (Array)value, Write, BuiltInType.UInt64);
       break;
     case BuiltInType.Guid:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (Guid)value);
       else
     m_UAEncoder.WriteArray<Guid>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.Guid);
       break;
     case BuiltInType.ByteString:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (byte[])value);
       else
     m_UAEncoder.WriteArray<byte[]>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.ByteString);
       break;
     case BuiltInType.XmlElement:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (XmlElement)value);
       else
     m_UAEncoder.WriteArray<XmlElement>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.XmlElement);
       break;
     case BuiltInType.NodeId:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (INodeId)value);
       else
     m_UAEncoder.WriteArray<INodeId>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.NodeId);
       break;
     case BuiltInType.ExpandedNodeId:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (IExpandedNodeId)value);
       else
     m_UAEncoder.WriteArray<IExpandedNodeId>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.ExpandedNodeId);
       break;
     case BuiltInType.StatusCode:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (IStatusCode)value);
       else
     m_UAEncoder.WriteArray<IStatusCode>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.StatusCode);
       break;
     case BuiltInType.QualifiedName:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (IQualifiedName)value);
       else
     m_UAEncoder.WriteArray<IQualifiedName>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.QualifiedName);
       break;
     case BuiltInType.LocalizedText:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (ILocalizedText)value);
       else
     m_UAEncoder.WriteArray<ILocalizedText>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.LocalizedText);
       break;
     case BuiltInType.ExtensionObject:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (IExtensionObject)value);
       else
     m_UAEncoder.WriteArray<IExtensionObject>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.ExtensionObject);
       break;
     case BuiltInType.DataValue:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (IDataValue)value);
       else
     m_UAEncoder.WriteArray<IDataValue>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.DataValue);
       break;
     case BuiltInType.Variant:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (IVariant)value);
       else
     m_UAEncoder.WriteArray<IVariant>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.Variant);
       break;
     case BuiltInType.DiagnosticInfo:
       if (producerBinding.Encoding.ValueRank < 0)
     m_UAEncoder.Write(this, (IDiagnosticInfo)value);
       else
     m_UAEncoder.WriteArray<IDiagnosticInfo>(this, (Array)value, x => m_UAEncoder.Write(this, x), BuiltInType.DiagnosticInfo);
       break;
     case BuiltInType.Null:
     default:
       throw new ArgumentOutOfRangeException($"Impossible to convert {value} of type {producerBinding.Encoding}");
       }
 }
예제 #15
0
 private void WriteValueVariant(IProducerBinding producerBinding)
 {
     object value = producerBinding.GetFromRepository();
       Variant _variant = new Variant(producerBinding.Encoding, value);
       m_UAEncoder.Write(this, _variant);
 }
        /// <summary>
        /// Gets the producer binding.
        /// </summary>
        /// <param name="repositoryGroup">The repository group.</param>
        /// <param name="processValueName">The name of a variable that is the source of the values forwarded by a message over the network.
        /// Must be unique in the context of the group named by <paramref name="repositoryGroup" /></param>
        /// <param name="fieldTypeInfo">The <see cref="T:UAOOI.Configuration.Networking.Serialization.BuiltInType" />of the message field encoding.</param>
        /// <returns>IProducerBinding.</returns>
        /// <exception cref="System.ArgumentNullException">repositoryGroup</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">encoding</exception>
        IProducerBinding IBindingFactory.GetProducerBinding(string repositoryGroup, string processValueName, UATypeInfo fieldTypeInfo)
        {
            string _name = CreateKey(repositoryGroup, processValueName);

            m_TraceSource.TraceData(TraceEventType.Information, 60, $"Starting {nameof(IBindingFactory.GetProducerBinding)} for the process variable {_name}");
            IProducerBinding _return = null;

            switch (fieldTypeInfo.BuiltInType)
            {
            case BuiltInType.Boolean:
                _return = AddBinding <Boolean>(_name, fieldTypeInfo);
                break;

            case BuiltInType.SByte:
                _return = AddBinding <SByte>(_name, fieldTypeInfo);
                break;

            case BuiltInType.Byte:
                _return = AddBinding <Byte>(_name, fieldTypeInfo);
                break;

            case BuiltInType.Int16:
                _return = AddBinding <Int16>(_name, fieldTypeInfo);
                break;

            case BuiltInType.UInt16:
                _return = AddBinding <UInt16>(_name, fieldTypeInfo);
                break;

            case BuiltInType.Int32:
                _return = AddBinding <Int32>(_name, fieldTypeInfo);
                break;

            case BuiltInType.UInt32:
                _return = AddBinding <UInt32>(_name, fieldTypeInfo);
                break;

            case BuiltInType.Int64:
                _return = AddBinding <Int64>(_name, fieldTypeInfo);
                break;

            case BuiltInType.UInt64:
                _return = AddBinding <UInt64>(_name, fieldTypeInfo);
                break;

            case BuiltInType.Float:
                _return = AddBinding <float>(_name, fieldTypeInfo);
                break;

            case BuiltInType.Double:
                _return = AddBinding <Double>(_name, fieldTypeInfo);
                break;

            case BuiltInType.String:
                _return = AddBinding <String>(_name, fieldTypeInfo);
                break;

            case BuiltInType.DateTime:
                _return = AddBinding <DateTime>(_name, fieldTypeInfo);
                break;

            case BuiltInType.Guid:
                _return = AddBinding <Guid>(_name, fieldTypeInfo);
                break;

            case BuiltInType.ByteString:
                _return = AddBinding <byte[]>(_name, fieldTypeInfo);
                break;

            case BuiltInType.Null:
            case BuiltInType.XmlElement:
            case BuiltInType.NodeId:
            case BuiltInType.ExpandedNodeId:
            case BuiltInType.StatusCode:
            case BuiltInType.QualifiedName:
            case BuiltInType.LocalizedText:
            case BuiltInType.ExtensionObject:
            case BuiltInType.DataValue:
            case BuiltInType.Variant:
            case BuiltInType.DiagnosticInfo:
            case BuiltInType.Enumeration:
            default:
            {
                m_TraceSource.TraceData(TraceEventType.Error, 60, $"Cannot get binding for {_name}");
                throw new ArgumentOutOfRangeException($"{_name}");
            }
            }
            m_TraceSource.TraceData(TraceEventType.Information, 60, $"Created binding for the process variable {_name}");
            return(_return);
        }
        /// <summary>
        /// Gets the producer binding.
        /// </summary>
        /// <param name="repositoryGroup">The repository group.</param>
        /// <param name="variableName">Name of the variable.</param>
        /// <param name="encoding">The encoding.</param>
        /// <returns>IProducerBinding.</returns>
        /// <exception cref="System.ArgumentNullException">repositoryGroup</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">variableName</exception>
        /// <exception cref="System.NotImplementedException"></exception>
        IProducerBinding IBindingFactory.GetProducerBinding(string repositoryGroup, string processValueName, UATypeInfo fieldTypeInfo)
        {
            if (repositoryGroup != m_RepositoryGroup)
            {
                throw new ArgumentNullException("repositoryGroup");
            }
            string           _name   = $"{ repositoryGroup}.{ processValueName}";
            IProducerBinding _return = null;

            if (m_NodesDictionary.ContainsKey(processValueName))
            {
                _return = m_NodesDictionary[processValueName];
            }
            else
            {
                switch (fieldTypeInfo.BuiltInType)
                {
                case BuiltInType.Boolean:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <Boolean>(_name, Inc, false, fieldTypeInfo) : AddBinding <Boolean[]>(_name, x => Inc(y => (y & 1) == 0, x.Length), new bool[] { false }, fieldTypeInfo);
                    break;

                case BuiltInType.SByte:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <SByte>(_name, Inc, sbyte.MinValue, fieldTypeInfo) : AddBinding <sbyte[]>(_name, x => Inc(y => (sbyte)y, x.Length), new sbyte[] { sbyte.MinValue }, fieldTypeInfo);
                    break;

                case BuiltInType.Byte:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <Byte>(_name, Inc, Byte.MinValue, fieldTypeInfo) : AddBinding <Byte[]>(_name, x => Inc(y => (Byte)y, x.Length), new Byte[] { Byte.MinValue }, fieldTypeInfo);
                    break;

                case BuiltInType.Int16:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <Int16>(_name, Inc, Int16.MinValue, fieldTypeInfo) : AddBinding <Int16[]>(_name, x => Inc(y => (Int16)y, x.Length), new Int16[] { Int16.MinValue }, fieldTypeInfo);
                    break;

                case BuiltInType.UInt16:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <UInt16>(_name, Inc, UInt16.MinValue, fieldTypeInfo) : AddBinding <UInt16[]>(_name, x => Inc(y => (UInt16)y, x.Length), new UInt16[] { UInt16.MinValue }, fieldTypeInfo);
                    break;

                case BuiltInType.Int32:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <Int32>(_name, Inc, Int32.MinValue, fieldTypeInfo) : AddBinding <Int32[]>(_name, x => Inc(y => (Int32)y, x.Length), new Int32[] { Int32.MinValue }, fieldTypeInfo);
                    break;

                case BuiltInType.UInt32:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <UInt32>(_name, Inc, UInt32.MinValue, fieldTypeInfo) : AddBinding <UInt32[]>(_name, x => Inc(y => (UInt32)y, x.Length), new UInt32[] { UInt32.MinValue }, fieldTypeInfo);
                    break;

                case BuiltInType.Int64:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <Int64>(_name, Inc, Int64.MinValue, fieldTypeInfo) : AddBinding <Int64[]>(_name, x => Inc(y => (Int64)y, x.Length), new Int64[] { 0 }, fieldTypeInfo);
                    break;

                case BuiltInType.UInt64:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <UInt64>(_name, Inc, UInt64.MinValue, fieldTypeInfo) : AddBinding <UInt64[]>(_name, x => Inc(y => (UInt64)y, x.Length), new UInt64[] { 0 }, fieldTypeInfo);
                    break;

                case BuiltInType.Float:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <float>(_name, Inc, -10.12345678f, fieldTypeInfo) : AddBinding <float[]>(_name, x => Inc(y => (float)y, x.Length), new float[] { -10.12345678f }, fieldTypeInfo);
                    break;

                case BuiltInType.Double:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <Double>(_name, Inc, -10.12345678, fieldTypeInfo) : AddBinding <Double[]>(_name, x => Inc(y => (Double)y, x.Length), new Double[] { 0 }, fieldTypeInfo);
                    break;

                case BuiltInType.String:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <String>(_name, Inc, String.Empty, fieldTypeInfo) : AddBinding <String[]>(_name, x => Inc(y => $"#{y}", x.Length), new String[] { }, fieldTypeInfo);
                    break;

                case BuiltInType.DateTime:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <DateTime>(_name, Inc, DateTime.Now, fieldTypeInfo) : AddBinding <DateTime[]>(_name, x => Inc(y => DateTime.Now, x.Length), new DateTime[] { }, fieldTypeInfo);
                    break;

                case BuiltInType.Guid:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <Guid>(_name, Inc, Guid.NewGuid(), fieldTypeInfo) : AddBinding <Guid[]>(_name, x => Inc(y => Guid.NewGuid(), x.Length), new Guid[] { }, fieldTypeInfo);
                    break;

                case BuiltInType.ByteString:
                    _return = fieldTypeInfo.ValueRank < 0 ? AddBinding <byte[]>(_name, Inc, new byte[] { 0 }, fieldTypeInfo) : AddBinding <byte[][]>(_name, x => Inc(y => new byte[] { 0, 1, 2, 3, 4 }, x.Length), new byte[][] { new byte[] { } }, fieldTypeInfo);
                    break;

                case BuiltInType.Null:
                case BuiltInType.XmlElement:
                case BuiltInType.NodeId:
                case BuiltInType.ExpandedNodeId:
                case BuiltInType.StatusCode:
                case BuiltInType.QualifiedName:
                case BuiltInType.LocalizedText:
                case BuiltInType.ExtensionObject:
                case BuiltInType.DataValue:
                case BuiltInType.Variant:
                case BuiltInType.DiagnosticInfo:
                case BuiltInType.Enumeration:
                default:
                    throw new ArgumentOutOfRangeException("encoding");
                }
            }
            return(_return);
        }