/// <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"); }
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); }
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); }
/// <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); }
/// <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; }