Beispiel #1
0
        public void CheckAllocatedCapabilities()
        {
            // We ignore faults for unused capabilities that are currently not used to improve general model checking efficiency
            // For DCCA efficiency, it would be beneficial, however, to check for faults of all capabilities and I/O relations;
            // this is also how the ODP seems to work

            // Using ToArray() to prevent modifications of the list during iteration...
            foreach (var capability in AvailableCapabilities.ToArray())
            {
                if (!CheckAllocatedCapability(capability))
                {
                    AvailableCapabilities.Remove(capability);
                }
            }

            foreach (var input in Inputs.ToArray())
            {
                if (!CheckInput(input))
                {
                    Disconnect(input, this);
                }
            }

            foreach (var output in Outputs.ToArray())
            {
                if (!CheckOutput(output))
                {
                    Disconnect(this, output);
                }
            }
        }
Beispiel #2
0
        public override void Process(ProcessCapability capability)
        {
            if (Resource == null)
            {
                return;
            }

            if (_currentCapability != capability)
            {
                // Switch the capability; if we fail to do so, remove all other capabilities from the available ones and
                // trigger a reconfiguration
                if (Robot.SwitchCapability(capability))
                {
                    _currentCapability = capability;
                }
                else
                {
                    AvailableCapabilities.RemoveAll(c => c != _currentCapability);
                    CheckConstraints();
                    return;
                }
            }

            // Apply the capability; if we fail to do so, remove it from the available ones and trigger a reconfiguration
            if (!Robot.ApplyCapability())
            {
                AvailableCapabilities.Remove(capability);
                CheckConstraints();
            }
            else
            {
                if (Resource.State.Count() == Resource.Task.Capabilities.Length)
                {
                    throw new InvalidOperationException();
                }

                Resource.OnCapabilityApplied();
            }
        }
 public override bool HasAvailableCapability(Capability capability) => AvailableCapabilities.Contains(capability);