public override async Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos) { this.config = config; this.callback = callback; string appName = "Mediator.IO.OPC_UA"; appDescription = new ApplicationDescription { ApplicationName = appName, ApplicationUri = $"urn:{Dns.GetHostName()}:{appName}", ApplicationType = ApplicationType.Client }; //string pkiPath = Path.Combine( // Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), // "Mediator.IO.OPC_UA", // "pki"); //certificateStore = new DirectoryStore(pkiPath, acceptAllRemoteCertificates: true, createLocalCertificateIfNotExist: true); this.mapId2Info = config.GetAllDataItems().ToDictionary( item => /* key */ item.ID, item => /* val */ new ItemInfo(item.ID, item.Name, item.Type, item.Dimension, item.Address)); PrintLine(config.Address); await TryConnect(); return(new Group[0]); }
public override Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos) { this.config = config; this.callback = callback; return(Task.FromResult(new Group[0])); }
public override async Task <InitResult> Initialize(InitParameter parameter, AdapterCallback callback) { this.callback = callback; string code = parameter.Calculation.Definition; dt = parameter.Calculation.Cycle; if (!string.IsNullOrWhiteSpace(code)) { // We need to lock the init code in order to prevent concurrent compilation of csharp-libraries! bool lockWasTaken = false; object lockObj = handleInitLock; try { Monitor.Enter(lockObj, ref lockWasTaken); return(await DoInit(parameter, code)); } finally { if (lockWasTaken) { Monitor.Exit(lockObj); } } } else { return(new InitResult() { Inputs = new InputDef[0], Outputs = new OutputDef[0], States = new StateDef[0], ExternalStatePersistence = true }); } }
public override Task <InitResult> Initialize(InitParameter parameter, AdapterCallback callback) { CheckStarted(); var promise = new TaskCompletionSource <InitResult>(); queue.Post(new WorkItem(MethodID.Init, promise, parameter, callback)); return(promise.Task); }
public override Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos) { CheckStarted(); var promise = new TaskCompletionSource <Group[]>(); queue.Post(new WorkItem(MethodID.Init, promise, config, callback, itemInfos)); return(promise.Task); }
public override async Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos) { this.config = config; this.callback = callback; PrintLine(config.Address); await TryConnect(); return(new Group[0]); }
public override Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos) { List <DataItem> dataItems = config.GetAllDataItems(); var t = Timestamp.Now.TruncateMilliseconds(); foreach (DataItem di in dataItems) { if (string.IsNullOrEmpty(di.Address)) { values[di.ID] = new ValueStore(t, di); } else { values[di.ID] = new Function(di); } } return(Task.FromResult(new Group[0])); }
public override async Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos) { this.config = config; this.callback = callback; string appName = "Mediator.IO.OPC_UA"; appDescription = new ApplicationDescription { ApplicationName = appName, ApplicationUri = $"urn:{Dns.GetHostName()}:{appName}", ApplicationType = ApplicationType.Client }; this.mapId2Info = config.GetAllDataItems().Where(di => !string.IsNullOrEmpty(di.Address)).ToDictionary( item => /* key */ item.ID, item => /* val */ new ItemInfo(item.ID, item.Name, item.Type, item.Dimension, item.Address)); PrintLine(config.Address); await TryConnect(); return(new Group[0]); }
protected virtual byte GetModbusHeaderAddress(Adapter adapter, DataItem item) => 1; // doesn't seem to matter public override async Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos) { this.config = config; this.callback = callback; PrintLine(config.Address); foreach (var di in config.GetAllDataItems()) { try { if (!string.IsNullOrEmpty(di.Address)) { GetModbusAddress(di); } } catch (Exception exp) { throw new Exception($"Invalid Address '{di.Address}' for DataItem {di.Name}: {exp.Message}"); } } await TryConnect(); return(new Group[0]); }
public override async Task <InitResult> Initialize(InitParameter parameter, AdapterCallback callback) { this.callback = callback; this.adapterName = parameter.Calculation.Name; var config = new Config(parameter.ModuleConfig); string cmd = GetCommand(config); string args = GetArgs(config); if (!File.Exists(cmd)) { throw new Exception($"External adapter command '{cmd}' not found."); } const string portPlaceHolder = "{PORT}"; if (!args.Contains(portPlaceHolder)) { throw new Exception("Missing port placeholder in args parameter: {PORT}"); } var server = TcpConnectorServer.ListenOnFreePort(); int port = server.Port; args = args.Replace(portPlaceHolder, port.ToString()); try { var taskConnect = server.WaitForConnect(TimeSpan.FromSeconds(60)); process = StartProcess(cmd, args); while (!process.HasExited && !taskConnect.IsCompleted) { await Task.Delay(TimeSpan.FromMilliseconds(50)); } if (process.HasExited) { throw new Exception($"Failed to start command \"{cmd}\" with arguments \"{args}\""); } connection = await taskConnect; var parentInfo = new ParentInfoMsg() { PID = Process.GetCurrentProcess().Id }; Task ignored = SendVoidRequest(parentInfo); var initMsg = new InititializeMsg() { Parameter = parameter, }; Task <InitResult> tInit = SendRequest <InitResult>(initMsg); taskReceive = connection.ReceiveAndDistribute(onEvent); Task t = await Task.WhenAny(tInit, taskReceive); if (t != tInit) { if (process.HasExited) { throw new Exception("Adapter process terminated during Init call."); } else { throw new Exception("TCP connection broken to Adapter process during Init call."); } } InitResult res = await tInit; Task ignored2 = Supervise(); return(res); } catch (Exception) { if (connection != null) { connection.Close("Init failed."); } StopProcess(process); process = null; throw; } finally { server.StopListening(); } }
/// <summary> /// Called to initialize the adapter instance given its configuration. /// May return an empty array of groups, when there are no independent /// DataItems in the IO_Adapter configuration. /// </summary> /// <param name="config">The configuration for this adapter instance</param> /// <param name="callback">Used to notify DataItem changes or other events/alarms</param> /// <param name="itemInfos">Provides additional information about all DataItems with Read == true, /// e.g. the latest available value</param> public abstract Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos);
public abstract Task <InitResult> Initialize(InitParameter parameter, AdapterCallback callback);
public override Task <InitResult> Initialize(InitParameter parameter, AdapterCallback callback) { return(Task.FromResult(new InitResult())); }