Example #1
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
            };

            //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]);
        }
Example #2
0
        public override Task <Group[]> Initialize(Adapter config, AdapterCallback callback, DataItemInfo[] itemInfos)
        {
            this.config   = config;
            this.callback = callback;

            return(Task.FromResult(new Group[0]));
        }
Example #3
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);
        }
Example #5
0
        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);
        }
Example #6
0
        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]);
        }
Example #7
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]));
        }
Example #8
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]);
        }
Example #9
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]);
        }
Example #10
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();
            }
        }
Example #11
0
 /// <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);
Example #12
0
 public abstract Task <InitResult> Initialize(InitParameter parameter, AdapterCallback callback);
Example #13
0
 public override Task <InitResult> Initialize(InitParameter parameter, AdapterCallback callback)
 {
     return(Task.FromResult(new InitResult()));
 }