private ServiceResult OnWriteValueDiscrete( ISystemContext context, NodeState node, NumericRange indexRange, QualifiedName dataEncoding, ref object value, ref StatusCode statusCode, ref DateTime timestamp) { MultiStateValueDiscreteState variable = node as MultiStateValueDiscreteState; TypeInfo typeInfo = TypeInfo.Construct(value); if (variable == null || typeInfo == null || typeInfo == Opc.Ua.TypeInfo.Unknown || !TypeInfo.IsNumericType(typeInfo.BuiltInType)) { return(StatusCodes.BadTypeMismatch); } if (indexRange != NumericRange.Empty) { return(StatusCodes.BadIndexRangeInvalid); } Int32 number = Convert.ToInt32(value); if (number >= variable.EnumValues.Value.Length || number < 0) { return(StatusCodes.BadOutOfRange); } if (!node.SetChildValue(context, BrowseNames.ValueAsText, variable.EnumValues.Value[number].DisplayName, true)) { return(StatusCodes.BadOutOfRange); } node.ClearChangeMasks(context, true); return(ServiceResult.Good); }
/// <summary> /// Creates a new variable. /// </summary> private DataItemState CreateMultiStateValueDiscreteItemVariable(NodeState parent, string path, string name, params string[] enumNames) { MultiStateValueDiscreteState variable = new MultiStateValueDiscreteState(parent); variable.NodeId = new NodeId(path, NamespaceIndex); variable.BrowseName = new QualifiedName(path, NamespaceIndex); variable.DisplayName = new LocalizedText("en", name); variable.WriteMask = AttributeWriteMask.None; variable.UserWriteMask = AttributeWriteMask.None; variable.Create( SystemContext, null, variable.BrowseName, null, true); variable.SymbolicName = name; variable.ReferenceTypeId = ReferenceTypes.Organizes; variable.DataType = DataTypeIds.UInt32; variable.ValueRank = ValueRanks.Scalar; variable.AccessLevel = AccessLevels.CurrentReadOrWrite; variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite; variable.Historizing = false; variable.Value = (uint)0; variable.StatusCode = StatusCodes.Good; variable.Timestamp = DateTime.UtcNow; // variable.OnWriteValue = OnWriteDiscrete; // there are two enumerations for this type: // EnumStrings = the string representations for enumerated values // EnumValues = the actual enumerated value // set the enumerated strings LocalizedText[] strings = new LocalizedText[enumNames.Length]; for (int ii = 0; ii < strings.Length; ii++) { strings[ii] = enumNames[ii]; } //variable.EnumStrings = new PropertyState<LocalizedText[]>( variable ); //variable.EnumStrings.Value = strings; //variable.EnumStrings.AccessLevel = AccessLevels.CurrentReadOrWrite; //variable.EnumStrings.UserAccessLevel = AccessLevels.CurrentReadOrWrite; // set the enumerated values EnumValueType[] values = new EnumValueType[enumNames.Length]; for (int ii = 0; ii < values.Length; ii++) { values[ii] = new EnumValueType(); values[ii].Value = ii; values[ii].Description = strings[ii]; values[ii].DisplayName = strings[ii]; } variable.EnumValues.Value = values; variable.EnumValues.AccessLevel = AccessLevels.CurrentReadOrWrite; variable.EnumValues.UserAccessLevel = AccessLevels.CurrentReadOrWrite; variable.ValueAsText.Value = strings[0]; if (parent != null) { parent.AddChild(variable); } return variable; }
/// <summary> /// Creates a new variable. /// </summary> private DataItemState CreateMultiStateValueDiscreteItemVariable(NodeState parent, string path, string name, NodeId nodeId, params string[] enumNames) { MultiStateValueDiscreteState variable = new MultiStateValueDiscreteState(parent); variable.NodeId = new NodeId(path, NamespaceIndex); variable.BrowseName = new QualifiedName(path, NamespaceIndex); variable.DisplayName = new LocalizedText("en", name); variable.WriteMask = AttributeWriteMask.None; variable.UserWriteMask = AttributeWriteMask.None; variable.Create( SystemContext, null, variable.BrowseName, null, true); variable.SymbolicName = name; variable.ReferenceTypeId = ReferenceTypes.Organizes; variable.DataType = (nodeId == null) ? DataTypeIds.UInt32 : nodeId; variable.ValueRank = ValueRanks.Scalar; variable.AccessLevel = AccessLevels.CurrentReadOrWrite; variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite; variable.Historizing = false; variable.Value = (uint)0; variable.StatusCode = StatusCodes.Good; variable.Timestamp = DateTime.UtcNow; variable.OnWriteValue = OnWriteValueDiscrete; // there are two enumerations for this type: // EnumStrings = the string representations for enumerated values // ValueAsText = the actual enumerated value // set the enumerated strings LocalizedText[] strings = new LocalizedText[enumNames.Length]; for (int ii = 0; ii < strings.Length; ii++) { strings[ii] = enumNames[ii]; } // set the enumerated values EnumValueType[] values = new EnumValueType[enumNames.Length]; for (int ii = 0; ii < values.Length; ii++) { values[ii] = new EnumValueType(); values[ii].Value = ii; values[ii].Description = strings[ii]; values[ii].DisplayName = strings[ii]; } variable.EnumValues.Value = values; variable.EnumValues.AccessLevel = AccessLevels.CurrentReadOrWrite; variable.EnumValues.UserAccessLevel = AccessLevels.CurrentReadOrWrite; variable.ValueAsText.Value = variable.EnumValues.Value[0].DisplayName; if (parent != null) { parent.AddChild(variable); } return(variable); }