public override Task <WriteDataItemsResult> WriteDataItems(string group, IList <DataItemValue> values, Duration?timeout) { int N = values.Count; var failed = new FailedDataItemWrite[N]; for (int i = 0; i < N; ++i) { DataItemValue request = values[i]; string id = request.ID; failed[i] = new FailedDataItemWrite(id, "Write not supported."); } return(Task.FromResult(WriteDataItemsResult.Failure(failed))); }
public override async Task <WriteDataItemsResult> WriteDataItems(string group, IList <DataItemValue> values, Duration?timeout) { int N = values.Count; bool connected = await TryConnect(); if (!connected || connection == null) { var failed = new FailedDataItemWrite[N]; for (int i = 0; i < N; ++i) { DataItemValue request = values[i]; failed[i] = new FailedDataItemWrite(request.ID, "No connection to OPC UA server"); } return(WriteDataItemsResult.Failure(failed)); } List <FailedDataItemWrite>?listFailed = null; var dataItemsToWrite = new List <WriteValue>(N); for (int i = 0; i < N; ++i) { DataItemValue request = values[i]; string id = request.ID; if (mapId2Info.ContainsKey(id)) { ItemInfo info = mapId2Info[request.ID]; NodeId di = info.Node ?? NodeId.Null; try { //if (!di.IsWriteable) throw new Exception($"OPC item '{di.Name}' is not writeable"); dataItemsToWrite.Add(MakeWriteValue(di, request.Value.V, info.Type, info.Dimension)); } catch (Exception exp) { if (listFailed == null) { listFailed = new List <FailedDataItemWrite>(); } listFailed.Add(new FailedDataItemWrite(id, exp.Message)); } } else { if (listFailed == null) { listFailed = new List <FailedDataItemWrite>(); } listFailed.Add(new FailedDataItemWrite(id, $"No writeable data item with id '{id}' found.")); } } if (dataItemsToWrite.Count > 0) { WriteRequest req = new WriteRequest() { NodesToWrite = dataItemsToWrite.ToArray() }; WriteResponse resp = await connection.WriteAsync(req); // TODO: Check result! } if (listFailed == null) { return(WriteDataItemsResult.OK); } else { return(WriteDataItemsResult.Failure(listFailed.ToArray())); } }