/// <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);
        }
Exemple #2
0
        /// <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));
        }
Exemple #4
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);
        }
        /// <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;
        }