Ejemplo n.º 1
0
        public void Configure(SlaveInfo rootSlave = null)
        {
            var networkInterface = NetworkInterface
                                   .GetAllNetworkInterfaces()
                                   .Where(nic => nic.Name == _settings.InterfaceName)
                                   .FirstOrDefault();

            if (networkInterface?.OperationalStatus != OperationalStatus.Up)
            {
                throw new Exception($"Network interface '{_settings.InterfaceName}' is not linked. Aborting action.");
            }

            #region "PreOp"

            var actualSlave = EcUtilities.ScanDevices(this.Context, _settings.InterfaceName, null);

            if (rootSlave == null)
            {
                rootSlave = actualSlave;

                rootSlave.Descendants().ToList().ForEach(current =>
                {
                    EcUtilities.CreateDynamicData(_settings.EsiDirectoryPath, current);
                });
            }

            var slaves       = rootSlave.Descendants().ToList();
            var actualSlaves = actualSlave.Descendants().ToList();

            this.ValidateSlaves(slaves, actualSlaves);
            this.ConfigureSlaves(slaves);
            this.ConfigureIoMap(slaves);
            this.ConfigureDc();
            this.ConfigureSync01(slaves);

            #endregion

            #region "SafeOp"

            EcUtilities.CheckErrorCode(this.Context, EcHL.CheckSafeOpState(this.Context), nameof(EcHL.CheckSafeOpState));

            #endregion

            #region "Op"

            EcUtilities.CheckErrorCode(this.Context, EcHL.RequestCommonState(this.Context, (UInt16)SlaveState.Operational), nameof(EcHL.RequestCommonState));

            #endregion

            if (_watchdogTask == null)
            {
                _watchdogTask = Task.Run(() => this.WatchdogRoutine(), _cts.Token);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Download firmware file to slave.
        /// 1. All detected slaves are set to PREOP state.
        /// 2. Target slave is set to INIT state.
        /// 3. Target slave is set to BOOT state.
        /// 4. Firmware file is downloaded to target slave.
        /// 5. Target slave is set to INIT state regardless of whether
        /// the file download was successful or not.
        /// </summary>
        /// <param name="slaveIndex">Slave index.</param>
        /// <param name="fileName">Absolute path to firmware file.</param>
        /// <returns>True if operation was successful, false otherwise./returns>
        public bool DownloadFirmware(int slaveIndex, string fileName)
        {
            FileInfo fileInfo = new FileInfo(fileName);

            if (!fileInfo.Exists)
            {
                return(false);
            }

            bool success = false;

            if (EcHL.RequestCommonState(this.Context, (UInt16)SlaveState.PreOp) == 1)
            {
                UInt16 currentState = EcHL.RequestState(this.Context, slaveIndex, (UInt16)SlaveState.Init);
                if (currentState == (UInt16)SlaveState.Init)
                {
                    currentState = EcHL.RequestState(this.Context, slaveIndex, (UInt16)SlaveState.Boot);
                    if (currentState == (UInt16)SlaveState.Boot)
                    {
                        int currentPackageNumber = -1;
                        int totalPackages        = 0;
                        int remainingSize        = -1;

                        EcHL.FOECallback callback = (slaveIndex, packageNumber, datasize) =>
                        {
                            if (packageNumber == 0)
                            {
                                _logger.LogInformation($"FoE: Write {datasize} bytes to {slaveIndex}. slave");
                            }
                            else
                            {
                                _logger.LogInformation($"FoE: {packageNumber}. package with {remainingSize - datasize} bytes written to {slaveIndex}. slave. Remaining data: {datasize} bytes");
                            }

                            if (currentPackageNumber != packageNumber)
                            {
                                currentPackageNumber = packageNumber;
                                if (packageNumber != 0)
                                {
                                    totalPackages++;
                                }
                            }

                            remainingSize = datasize;
                            return(0);
                        };

                        EcHL.RegisterFOECallback(this.Context, callback);
                        GC.KeepAlive(callback);

                        int wk = EcHL.DownloadFirmware(this.Context, slaveIndex, fileName, (int)fileInfo.Length);

                        _logger.LogInformation($"FoE: {totalPackages} packages written");
                        success = (remainingSize == 0) && (wk > 0);

                        EcHL.RequestState(this.Context, slaveIndex, (UInt16)SlaveState.Init);
                    }
                }
            }

            return(success);
        }