Example #1
0
 protected override ServiceResult Call(ISystemContext context, CallMethodRequest methodToCall, MethodState method, CallMethodResult result)
 {
     if (methodToCall.MethodId == new NodeId("Robot1_Stop", NamespaceIndex))
     {
         _mode.Value     = (short)1;
         _mode.Timestamp = DateTime.UtcNow;
         _mode.ClearChangeMasks(SystemContext, false);
         _laser.Value     = false;
         _laser.Timestamp = DateTime.UtcNow;
         _laser.ClearChangeMasks(SystemContext, false);
         result.StatusCode = StatusCodes.Good;
         return(StatusCodes.Good);
     }
     if (methodToCall.MethodId == new NodeId("Robot1_Multiply", NamespaceIndex))
     {
         try
         {
             var a = Convert.ToDouble(methodToCall.InputArguments[0].Value);
             var b = Convert.ToDouble(methodToCall.InputArguments[1].Value);
             result.OutputArguments.Add(new Variant(a * b));
             result.StatusCode = StatusCodes.Good;
             return(StatusCodes.Good);
         }
         catch (Exception e)
         {
             Console.WriteLine(e);
             result.StatusCode = StatusCodes.BadInvalidArgument;
             return(StatusCodes.BadInvalidArgument);
         }
     }
     return(base.Call(context, methodToCall, method, result));
 }
Example #2
0
        public virtual bool Update(ISystemContext systemContext)
        {
            bool valueSet = false;

            if (CanSetValue())
            {
                int  value     = 0;
                bool boolValue = false;
                GetValue(ref value, ref boolValue);

                Utils.LogInfo("AlarmController Update Value = {0}", value);

                if (m_isBoolean)
                {
                    m_variable.Value = boolValue;
                }
                else
                {
                    m_variable.Value = value;
                }
                m_variable.Timestamp = DateTime.UtcNow;
                m_variable.ClearChangeMasks(systemContext, false);

                valueSet = true;
            }

            return(valueSet);
        }
Example #3
0
 private void UpdateVariableValue()
 {
     Task.Run(() =>
     {
         while (true)
         {
             try
             {
                 int count = 0;
                 if (count > 0 && count != cfgCount)
                 {
                     cfgCount = count;
                     List <OpcuaNode> nodes = new List <OpcuaNode>();
                     UpdateNodesAttribute(nodes);
                 }
                 BaseDataVariableState node = null;
                 foreach (var item in _nodeDic)
                 {
                     node           = item.Value;
                     node.Value     = RandomLibrary.GetRandomInt(0, 99);
                     node.Timestamp = DateTime.Now;
                     node.ClearChangeMasks(SystemContext, false);
                 }
                 Thread.Sleep(1000 * 1);
             }
             catch (Exception ex)
             {
                 Console.ForegroundColor = ConsoleColor.Red;
                 Console.WriteLine("更新OPC-UA节点数据触发异常:" + ex.Message);
                 Console.ResetColor();
             }
         }
     });
 }
Example #4
0
 public void SetRobotMode(int mode)
 {
     if (0 < mode && mode < 4)
     {
         RobotMode.Value = mode;
         RobotMode.ClearChangeMasks(SystemContext, false);
     }
 }
Example #5
0
 public void SetEnable(bool enable)
 {
     if (SystemState != null)
     {
         SystemState.Value = enable;
         SystemState.ClearChangeMasks(SystemContext, false);
     }
 }
Example #6
0
        /// <summary>
        /// Sets value of VC property to OPCUA node
        /// </summary>
        private void vc_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            IProperty vcProperty = (IProperty)sender;

            // Get OPCUA node that will get its value updated
            string nodeNameParent            = String.Format("{0}-{1}", vcProperty.Name, vcProperty.Container);
            NodeId nodeId                    = NodeId.Create(nodeNameParent, Namespaces.vc2opcua, uaServer.NamespaceUris);
            BaseDataVariableState uaProperty = (BaseDataVariableState)nodeManager.FindPredefinedNode(nodeId, typeof(BaseDataVariableState));

            if (uaProperty == null)
            {
                // Unsubscribe to events
                vcProperty.PropertyChanged -= vc_PropertyChanged;
                return;
            }

            if (vcProperty.PropertyType == typeof(String))
            {
                if ((string)uaProperty.Value == (string)vcProperty.Value)
                {
                    return;
                }
                uaProperty.Value = (string)vcProperty.Value;
            }
            else if (vcProperty.PropertyType == typeof(Boolean))
            {
                if ((bool)uaProperty.Value == (bool)vcProperty.Value)
                {
                    return;
                }
                uaProperty.Value = (bool)vcProperty.Value;
            }
            else if (vcProperty.PropertyType == typeof(Double))
            {
                if ((double)uaProperty.Value == (double)vcProperty.Value)
                {
                    return;
                }
                uaProperty.Value = (double)vcProperty.Value;
            }
            else if (vcProperty.PropertyType == typeof(Int32))
            {
                if ((int)uaProperty.Value == (int)vcProperty.Value)
                {
                    return;
                }
                uaProperty.Value = (int)vcProperty.Value;
            }
            else
            {
                _vcUtils.VcWriteWarningMsg("VC property type not supported" + vcProperty.PropertyType.ToString());
                return;
            }

            uaProperty.Timestamp = DateTime.UtcNow;
            uaProperty.ClearChangeMasks(nodeManager.context, true);
        }
        /// <summary>
        /// 实时更新节点数据
        /// </summary>
        public void UpdateVariableValue()
        {
            Task.Run(() =>
            {
                while (true)
                {
                    try
                    {
                        /*
                         * 此处仅作示例代码  所以不修改节点树 故将UpdateNodesAttribute()方法跳过
                         * 在实际业务中  请根据自身的业务需求决定何时修改节点菜单树
                         */
                        int count = 0;
                        //配置发生更改时,重新生成节点树
                        if (count > 0 && count != cfgCount)
                        {
                            cfgCount = count;
                            List <OpcuaNode> nodes = new List <OpcuaNode>();

                            /*
                             * 此处有想过删除整个菜单树,然后重建 保证各个NodeId仍与原来的一直
                             * 但是 后来发现这样会导致原来的客户端订阅信息丢失  无法获取订阅数据
                             * 所以  只能一级级的检查节点  然后修改属性
                             */
                            UpdateNodesAttribute(nodes);
                        }
                        //模拟获取实时数据
                        BaseDataVariableState node = null;

                        /*
                         * 在实际业务中应该是根据对应的标识来更新固定节点的数据
                         * 这里  我偷个懒  全部测点都更新为一个新的随机数
                         */
                        foreach (var item in _nodeDic)
                        {
                            node           = item.Value;
                            node.Value     = RandomLibrary.GetRandomInt(0, 99);
                            node.Timestamp = DateTime.Now;
                            //变更标识  只有执行了这一步,订阅的客户端才会收到新的数据
                            node.ClearChangeMasks(SystemContext, false);
                        }
                        //1秒更新一次
                        Thread.Sleep(1000 * 1);
                    }
                    catch (Exception ex)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("更新OPC-UA节点数据触发异常:" + ex.Message);
                        Console.ResetColor();
                    }
                }
            });
        }
Example #8
0
        /// <summary>
        /// Sets the variable value.
        /// </summary>
        private void SetVariable(VarItem varItem, CnlData[] cnlData, int dataIndex, DateTime timestamp)
        {
            try
            {
                DeviceTag deviceTag  = varItem.DeviceTag;
                int       dataLength = deviceTag.DataLength;
                object    value      = 0.0;

                switch (deviceTag.DataType)
                {
                case TagDataType.Double:
                    value = deviceTag.IsArray ?
                            (object)CnlDataConverter.GetDoubleArray(cnlData, dataIndex, dataLength) :
                            CnlDataConverter.GetDouble(cnlData, dataIndex);
                    break;

                case TagDataType.Int64:
                    value = deviceTag.IsArray ?
                            (object)CnlDataConverter.GetInt64Array(cnlData, dataIndex, dataLength) :
                            CnlDataConverter.GetInt64(cnlData, dataIndex);
                    break;

                case TagDataType.ASCII:
                    value = CnlDataConverter.GetAscii(cnlData, dataIndex, dataLength);
                    break;

                case TagDataType.Unicode:
                    value = CnlDataConverter.GetUnicode(cnlData, dataIndex, dataLength);
                    break;
                }

                BaseDataVariableState variable = varItem.Variable;
                variable.Value      = value;
                variable.StatusCode = CnlDataConverter.GetStatus(cnlData, dataIndex, dataLength) > CnlStatusID.Undefined ?
                                      StatusCodes.Good : StatusCodes.Bad;
                variable.Timestamp = timestamp;
                variable.ClearChangeMasks(SystemContext, false);
            }
            catch (Exception ex)
            {
                log.WriteException(ex, Locale.IsRussian ?
                                   "Ошибка при установке значения переменной {0}" :
                                   "Error setting the variable {0}", varItem.Variable.NodeId);
            }
        }
Example #9
0
        private void OnScan(object state)
        {
            var dt = DateTime.UtcNow - _timestamp;

            _timestamp = DateTime.UtcNow;

            if ((short)_mode.Value != 2)  // if not in man mode
            {
                double period;
                switch ((short)_speed.Value)
                {
                case 1:
                    period = 20.0;
                    break;

                case 2:
                    period = 10.0;
                    break;

                case 3:
                    period = 5.0;
                    break;

                default:
                    period = 30.0;
                    break;
                }
                if ((short)_mode.Value == 0)                                      // auto mode
                {
                    _masterAxis = (_masterAxis + dt.TotalSeconds / period) % 1.0; // 0.0 to 1.0
                }
                _axis1.Value = (float)(Math.Sin(_masterAxis * 2.0 * Math.PI) * 45.0);
                _axis2.Value = (float)(Math.Cos(_masterAxis * 2.0 * Math.PI) * 45.0);
                _axis3.Value = (float)(Math.Sin(((_masterAxis * 2.0) % 1.0) * 2.0 * Math.PI) * 45.0);
                _axis4.Value = (float)(Math.Cos(_masterAxis * 2.0 * Math.PI) * -180.0);
            }
            _axis1.Timestamp = _timestamp;
            _axis1.ClearChangeMasks(SystemContext, false);
            _axis2.Timestamp = _timestamp;
            _axis2.ClearChangeMasks(SystemContext, false);
            _axis3.Timestamp = _timestamp;
            _axis3.ClearChangeMasks(SystemContext, false);
            _axis4.Timestamp = _timestamp;
            _axis4.ClearChangeMasks(SystemContext, false);
        }
Example #10
0
 public void SetUserArrayFloat(float[] data)
 {
     UserArrayFloat.Value = data;
     UserArrayFloat.ClearChangeMasks(SystemContext, false);
 }
Example #11
0
 public void SetUserArrayBool(bool[] data)
 {
     UserArrayBool.Value = data;
     UserArrayBool.ClearChangeMasks(SystemContext, false);
 }
Example #12
0
 public void SetRobotLocation(double[] location)
 {
     RobotLocation.Value = location;
     RobotLocation.ClearChangeMasks(SystemContext, false);
 }
Example #13
0
        private void UpdateVariables()
        {
            NodeState             node          = Find(m_NumberOfManufacturedProductsID);
            BaseDataVariableState variableState = node as BaseDataVariableState;

            if (variableState != null)
            {
                variableState.Value = m_numberOfManufacturedProducts;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_NumberOfDiscardedProductsID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_numberOfDiscardedProducts;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_ProductSerialNumberID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_productSerialNumber;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_ActualCycleTimeID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_actualCycleTime;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_EnergyConsumptionID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_energyConsumption;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_FaultyTimeID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_faultyTime;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_IdealCycleTimeID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_idealCycleTime;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_OverallRunningTimeID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_overallRunningTime;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_PressureID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_pressure;
                variableState.ClearChangeMasks(SystemContext, false);
            }

            node          = Find(m_StatusID);
            variableState = node as BaseDataVariableState;
            if (variableState != null)
            {
                variableState.Value = m_status;
                variableState.ClearChangeMasks(SystemContext, false);
            }
        }
Example #14
0
        /// <summary>
        /// 修改节点树(添加节点,删除节点,修改节点名称)
        /// </summary>
        /// <param name="nodes"></param>
        public void UpdateNodesAttribute(List <OpcuaNode> nodes)
        {
            //修改或创建根节点
            var scadas = nodes.Where(d => d.NodeType == NodeType.Scada);

            foreach (var item in scadas)
            {
                FolderState scadaNode = null;
                if (!_folderDic.TryGetValue(item.NodePath, out scadaNode))
                {
                    //如果根节点都不存在  那么整个树都需要创建
                    FolderState root = CreateFolder(null, item.NodePath, item.NodeName);
                    root.AddReference(ReferenceTypes.Organizes, true, ObjectIds.ObjectsFolder);
                    _references.Add(new NodeStateReference(ReferenceTypes.Organizes, false, root.NodeId));
                    root.EventNotifier = EventNotifiers.SubscribeToEvents;
                    AddRootNotifier(root);
                    CreateNodes(nodes, root, item.NodePath);
                    _folderDic.Add(item.NodePath, root);
                    AddPredefinedNode(SystemContext, root);
                    continue;
                }
                else
                {
                    scadaNode.DisplayName = item.NodeName;
                    scadaNode.ClearChangeMasks(SystemContext, false);
                }
            }
            //修改或创建目录(此处设计为可以有多级目录,上面是演示数据,所以我只写了三级,事实上更多级也是可以的)
            var folders = nodes.Where(d => d.NodeType != NodeType.Scada && !d.IsTerminal);

            foreach (var item in folders)
            {
                FolderState folder = null;
                if (!_folderDic.TryGetValue(item.NodePath, out folder))
                {
                    var par = GetParentFolderState(nodes, item);
                    folder = CreateFolder(par, item.NodePath, item.NodeName);
                    AddPredefinedNode(SystemContext, folder);
                    par.ClearChangeMasks(SystemContext, false);
                    _folderDic.Add(item.NodePath, folder);
                }
                else
                {
                    folder.DisplayName = item.NodeName;
                    folder.ClearChangeMasks(SystemContext, false);
                }
            }
            //修改或创建测点
            //这里我的数据结构采用IsTerminal来代表是否是测点  实际业务中可能需要根据自身需要调整
            var paras = nodes.Where(d => d.IsTerminal);

            foreach (var item in paras)
            {
                BaseDataVariableState node = null;
                if (_nodeDic.TryGetValue(item.NodeId.ToString(), out node))
                {
                    node.DisplayName = item.NodeName;
                    node.Timestamp   = DateTime.Now;
                    node.ClearChangeMasks(SystemContext, false);
                }
                else
                {
                    FolderState folder = null;
                    if (_folderDic.TryGetValue(item.ParentPath, out folder))
                    {
                        node = CreateVariable(folder, item.NodePath, item.NodeName, DataTypeIds.Double, ValueRanks.Scalar);
                        AddPredefinedNode(SystemContext, node);
                        folder.ClearChangeMasks(SystemContext, false);
                        _nodeDic.Add(item.NodeId.ToString(), node);
                    }
                }
            }

            /*
             * 将新获取到的菜单列表与原列表对比
             * 如果新菜单列表中不包含原有的菜单
             * 则说明这个菜单被删除了  这里也需要删除
             */
            List <string> folderPath = _folderDic.Keys.ToList();
            List <string> nodePath   = _nodeDic.Keys.ToList();
            var           remNode    = nodePath.Except(nodes.Where(d => d.IsTerminal).Select(d => d.NodeId.ToString()));

            foreach (var str in remNode)
            {
                BaseDataVariableState node = null;
                if (_nodeDic.TryGetValue(str, out node))
                {
                    var parent = node.Parent;
                    parent.RemoveChild(node);
                    _nodeDic.Remove(str);
                }
            }
            var remFolder = folderPath.Except(nodes.Where(d => !d.IsTerminal).Select(d => d.NodePath));

            foreach (string str in remFolder)
            {
                FolderState folder = null;
                if (_folderDic.TryGetValue(str, out folder))
                {
                    var parent = folder.Parent;
                    if (parent != null)
                    {
                        parent.RemoveChild(folder);
                        _folderDic.Remove(str);
                    }
                    else
                    {
                        RemoveRootNotifier(folder);
                        RemovePredefinedNode(SystemContext, folder, new List <LocalReference>());
                    }
                }
            }
        }
Example #15
0
        /// <summary>
        /// Sets value of VC signal to OPCUA node
        /// </summary>
        private void vc_SignalTriggered(object sender, SignalTriggerEventArgs e)
        {
            // Get OPCUA node that will get its value updated
            string nodeNameParent          = String.Format("{0}-{1}", e.Signal.Name, e.Signal.Node.Name);
            NodeId nodeId                  = NodeId.Create(nodeNameParent, Namespaces.vc2opcua, uaServer.NamespaceUris);
            BaseDataVariableState uaSignal = (BaseDataVariableState)nodeManager.FindPredefinedNode(nodeId, typeof(BaseDataVariableState));

            if (uaSignal == null)
            {
                // Unsubscribe to events
                e.Signal.SignalTrigger -= vc_SignalTriggered;
                return;
            }

            if (e.Signal.Type == BehaviorType.StringSignal)
            {
                if ((string)uaSignal.Value == (string)e.Signal.Value)
                {
                    return;
                }
                uaSignal.Value = (string)e.Signal.Value;
            }
            else if (e.Signal.Type == BehaviorType.ComponentSignal)
            {
                ISimComponent component = (ISimComponent)e.Signal.Value;

                if ((string)uaSignal.Value == component.Name)
                {
                    return;
                }
                uaSignal.Value = component.Name;
            }
            else if (e.Signal.Type == BehaviorType.BooleanSignal)
            {
                if ((bool)uaSignal.Value == (bool)e.Signal.Value)
                {
                    return;
                }
                uaSignal.Value = (bool)e.Signal.Value;
            }
            else if (e.Signal.Type == BehaviorType.RealSignal)
            {
                if ((double)uaSignal.Value == (double)e.Signal.Value)
                {
                    return;
                }
                uaSignal.Value = (double)e.Signal.Value;
            }
            else if (e.Signal.Type == BehaviorType.IntegerSignal)
            {
                if ((int)uaSignal.Value == (int)e.Signal.Value)
                {
                    return;
                }
                uaSignal.Value = (int)e.Signal.Value;
            }
            else
            {
                _vcUtils.VcWriteWarningMsg("VC signal type not supported" + e.Signal.Type.ToString());
                return;
            }

            uaSignal.Timestamp = DateTime.UtcNow;
            uaSignal.ClearChangeMasks(nodeManager.context, true);
        }