/// <summary> /// Creates a new <see cref="Controller"/> instance. /// </summary> /// <param name="tagController">The tag controller used by the created controller.</param> /// <param name="controllerTag">The tag, the new controller is dependend on.</param> /// <param name="userDefinedInterfaces">User defined interfaces</param> /// <param name="tagListener">A tag listener instance</param> /// <returns>A new <see cref="Controller"/> instance.</returns> public Controller Create( ITagController tagController, IControllerTag controllerTag, IList <string> userDefinedInterfaces, ITagListener tagListener) { var controller = Create(tagController, controllerTag, tagListener); if (userDefinedInterfaces != null) { tagListener.AddUdtHandler <Command>(CmdList.PlcArrayDataType()); foreach (var userDefinedInterface in userDefinedInterfaces.Where(value => !string.IsNullOrWhiteSpace(value))) { var path = TagName.SpecificInterface(parent: null).AppendTagName(userDefinedInterface); var userDefinedInterfaceTags = ChildTagsFromPath(controllerTag, path); controller.AddUserDefinedInterface(path, userDefinedInterfaceTags); // create the commands foreach (var userDefinedInterfaceTag in userDefinedInterfaceTags) { var commands = CreateCommands(controllerTag, controller, userDefinedInterfaceTag, tagListener); controller.UpdateUserDefinedCommands(userDefinedInterfaceTag.NestedName, commands.ToList()); } } } return(controller); }
/// <summary> /// Imports all controllers from the specified path and port /// and searchs for user defined interfaces for each controller. /// </summary> public void ImportAllControllers(IList <string> userDefinedInterfaces) { _logger.Debug(string.Format("Import controller tree skeleton on '{0}:{1}'", _adsAddress, _adsPort)); _alarmsImporter.ImportAlarms(); IReadOnlyCollection <IControllerTag> controllerTags = _findControllerTags.FindControllerTags(); if (controllerTags.IsNullOrEmpty()) { return; } IControllerTag anyControllerTag = controllerTags.First(); _tagListener.AddUdtHandler <CtrlCommonInterface>(anyControllerTag.GetCommonInterfaceDataType()); foreach (IControllerTag controllerTag in controllerTags) { Tag commonInterfaceTag = controllerTag.GetCommonInterfaceTag(); if (commonInterfaceTag != null) { _tagListener.ReadTagSynchronously(commonInterfaceTag); } } Controller controller = ImportControllerWithChildren(_rootController, controllerTags, userDefinedInterfaces, MaxChildImportDepth); _controllerTree.Initialize(controller); _alarmsImporter.AlarmsChanged += alarms => _controllerTree.UpdateAlarms(alarms); _controllerTree.UpdateAlarms(_alarmsImporter.GetAllImportedAlarms()); _logger.Debug(string.Format("Finished import of controller skeleton tree on '{0}:{1}'", _adsAddress, _adsPort)); }
private Tag InitializeGlobalAlarmsTag() { var maxAlarmsTag = Alarm.PlcMaximumAlarmsTag(); _tagListener.ReadTagSynchronously(maxAlarmsTag); var arrayLength = (ushort)maxAlarmsTag.Value; string plcArrayDataType = Alarm.PlcArrayDataType(arrayLength); _tagListener.AddUdtHandler <PlcAlarmStruct>(plcArrayDataType); return(Alarm.PlcArrayTag(arrayLength)); }
/// <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; }