/// <summary>
        /// Each tag must be unique.
        /// In case of Beckhoff PLC system the combination of tag scope, name and ads-port is required for identification.
        /// Therefore the tag listener should add the ads-port information to the tag, if not already set.
        /// </summary>
        public virtual void GivenTagWithoutAdsPort_WhenAddingTag_TagListenerMustAssignAdsPort()
        {
            var tag = new Tag("name", "scope", "BOOL");

            Testee.AddTag(tag);

            tag.AdsPort.Should().Be(AdsPort, "TagListener musst assign ads port to tag if not set, to have unique tags everywhere");
        }
예제 #2
0
        public virtual void WhenAddEqualTagTwice_TagListenerShouldOnlyContainOne()
        {
            var tag1 = new Tag("name", "scope", "BOOL", 850);
            var tag2 = new Tag("name", "scope", "BOOL", 850);

            Testee.AddTag(tag1);
            Testee.AddTag(tag2);

            Testee.GetTags().Count.Should().Be(1);
        }
 /// <summary>
 /// Initializes this alarms importer.
 /// </summary>
 /// <param name="tagListener">The tag listener to get used by this instance.</param>
 public void Initialize(ITagListener tagListener)
 {
     _logger.Debug(string.Format("Initializing alarms importer on '{0}'", tagListener));
     _tagListener    = tagListener;
     _alarmsArrayTag = InitializeGlobalAlarmsTag();
     _alarmsArrayTag.ValueChanged += HandleAlarmsChanged;
     _tagListener.AddTag(_alarmsArrayTag);
 }
예제 #4
0
        public void GivenTagInTagListener_WhenWriteAndReadValue_TagListenerShouldRaiseEvent()
        {
            _tagListener.AddTag(_tag);
            _tagListener.MonitorEvents();

            var writeAction = new Action(() => _tagController.WriteTag(_tag, 10).Wait());
            var readAction  = new Action(() => _tagListener.ReadTagSynchronously(_tag));

            writeAction.ShouldNotThrow();
            readAction.ShouldNotThrow();
            _tagListener.ShouldNotRaise("CommunicationProblemOccured");
            _tagListener.ShouldRaise("TagChanged");
            _tag.Value.Should().Be((uint)10);
        }
예제 #5
0
        /// <summary>
        /// Creates and sets the channel
        /// </summary>
        /// <param name="fbName">Generic Plc to Mosaic Datachannel Function Object Block Name</param>
        /// <param name="scope">Scope</param>
        /// <param name="typeName">PLC Struct name to load</param>
        /// <exception><cref>VP.FF.PT.Common.PlcCommunication.PlcCommunicationException</cref></exception>
        public void SetChannel(string fbName, string scope, string typeName)
        {
            _dataChannelStateTag = new Tag(fbName + "." + UdtHandshakeFieldName, scope, "INT", _tagListener.Port);
            _dataChannelStateTag.ValueChanged += DataChannelStateTagValueChanged;

            // initialize DataChannel on PLC side
            _tagController.WriteTag(_dataChannelStateTag, (short)DataStateEnum.DataChannelFree);

            _channelToLineTag = new Tag(fbName + "." + UdtDataFieldName, scope, typeName, _tagListener.Port);
            _tagListener.AddUdtHandler <TDataType>(_channelToLineTag.DataType);

            // try to read value for the first time (might throw an exception if symbol does not exist)
            _tagListener.ReadTagSynchronously(_dataChannelStateTag);
            _tagListener.AddTag(_dataChannelStateTag);
        }
예제 #6
0
        /// <summary>
        /// Sets the channel.
        /// </summary>
        /// <param name="channelToLineTag">The channel automatic line tag.</param>
        /// <exception cref="PlcCommunicationException">Data UDT must follow convention! It must contain a intDataState field and connection to PLC must be possible!</exception>
        public void SetChannel(Tag channelToLineTag)
        {
            // make sure that intDataState is set to 1
            var fields = typeof(TDataType).GetFields();

            if (fields.Length == 0 || fields[fields.Length - 1].Name != UdtHandshakeFieldName)
            {
                throw new PlcCommunicationException(
                          "Cannot set DataChannel " + channelToLineTag.Name + " because Data UDT does not follow convention! DataType Must contain a variable " +
                          UdtHandshakeFieldName + " as last field. Tag: " + channelToLineTag.Name, _tagListener.AddressAndPath, "");
            }

            var dataChannelStateTag = new Tag(channelToLineTag.Name + "." + UdtHandshakeFieldName, channelToLineTag.Scope, "INT", channelToLineTag.AdsPort);

            dataChannelStateTag.ValueChanged += DataChannelStateTagValueChanged;

            // initialize DataChannel on PLC side
            _tagController.WriteTag(dataChannelStateTag, (short)DataStateEnum.DataChannelFree);

            _tagListener.AddUdtHandler <TDataType>(channelToLineTag.DataType);
            _tagListener.AddTag(dataChannelStateTag);
            _channelToLineTag = channelToLineTag;
        }