public override Task <WriteDataItemsResult> WriteDataItems(string group, IList <DataItemValue> writeValues, Duration?timeout) { var failed = new List <FailedDataItemWrite>(); for (int i = 0; i < writeValues.Count; ++i) { DataItemValue write = writeValues[i]; string id = write.ID; if (values.ContainsKey(id)) { values[id].Put(write.Value); } else { failed.Add(new FailedDataItemWrite(id, $"No data item with id '{id}' found.")); } } if (failed.Count == 0) { return(Task.FromResult(WriteDataItemsResult.OK)); } else { return(Task.FromResult(WriteDataItemsResult.Failure(failed.ToArray()))); } }
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) { if (!await TryConnect() || connection == null) { var failed = values.Select(div => new FailedDataItemWrite(div.ID, "No connection to server")).ToArray(); return(WriteDataItemsResult.Failure(failed)); } var writeMan = new WriteManager <VariableValue, VariableError>(values, request => { if (mapId2Info.ContainsKey(request.ID)) { ItemInfo info = mapId2Info[request.ID]; return(VariableValue.Make(info.VarRef, request.Value)); } else { throw new Exception("No Address defined"); } }); try { var dataItemsToWrite = writeMan.GetRefsList(); WriteResult res = await connection.WriteVariablesSyncIgnoreMissing(dataItemsToWrite, timeout); if (!res.IsOK()) { writeMan.AddWriteErrors(res.FailedVariables, failedVar => { VariableRef v = failedVar.Variable; int idx = dataItemsToWrite.FindIndexOrThrow(vv => vv.Variable == v); string id = writeMan.GetWriteRequest(idx).ID; return(new FailedDataItemWrite(id, failedVar.Error)); }); } } catch (Exception exp) { Task ignored = CloseConnection(); Exception e = exp.GetBaseException() ?? exp; string msg = $"Write exception: {e.Message}"; LogWarn("WriteExcept", msg, details: e.ToString()); var failed = values.Select(div => new FailedDataItemWrite(div.ID, msg)).ToArray(); return(WriteDataItemsResult.Failure(failed)); } return(writeMan.GetWriteResult()); }
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())); } }
public override Task <WriteDataItemsResult> WriteDataItems(string group, IList <DataItemValue> values, Duration?timeout) { var failed = values.Select(div => new FailedDataItemWrite(div.ID, "Write not implemented")).ToArray(); return(Task.FromResult(WriteDataItemsResult.Failure(failed))); }