AgLink Verbindungseinstellungen

Matze001

Level-3
Beiträge
2.814
Reaktionspunkte
573
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich nutze die aktuellste Version von AgLink (5.6.2) und bin gerade dabei diese etwas tiefer in meine Software zu integrieren.

Mein Ziel sieht wie folgt aus:
Ich möchte die Verbindungseinstellungen zu meiner SPS (Also Rack, Slot, IP, Typ) nicht über das Config-Menü einstellen, sondern über meine Software direkt einstellen.
Dafür wird es zunächst eine Config-Datei geben, die dann später aus der Oberfläche verändert werden soll.
Warum möchte ich dies machen? Ich möchte die Software bzw. die Verbindungen flexibel halten, und auch DAUs die Einstellungen teilweise ermöglichen, ohne das sie alles verstellen können. Vermutlich wird nur die IP-Adresse am Ende einstellbar sein, aber sei es drum.

Jetzt die Frage dazu: Wie mache ich das? Bei CreateInstance wird mir nichts passendes angeboten.

Und wenn wir dann eh schon bei den Verbindungsthemen sind.

Wie sieht denn die beste Vorgehensweise für Connect/Reconnect/Disconnect aus. Gerade beim Reconnect bin ich aktuell noch etwas planlos.
Ich könnte die Verbindung überwachen (OnConnectionError) und dann disconnect und connect aufrufen, aber vielleicht gibt es ja auch hier etwas elegantes.

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Marcel,
es gibt eine ganze Reihe von Funktionen zum Verändern der Parameter. AGLink40_Config nutzt übrigens auch nur diese Funktionalität.
Ich würde GetParas aufrufen (dann sind Standardwerte bereits eingetragen), dann die Modifikationen vornehmen, SetParas aufrufen und zum Schluss noch mittes SetDevType den Gerätetyp einstellen.
Alternativ kannst Du auch die XML-Konfigurationsdateien verwenden. Dafür gibt es auch Funktionen zum Lesen und Schreiben. Die Persistenz Deiner Einstellung ist damit gesichert.
Bei Fragen einfach melden oder support@deltalogic.de kontaktieren.
 
Bei uns sieht der connect grob so aus:

C#:
                    _agLinkConnection._connectionState = ConnectionState.Connecting;

                    int result = 0;

                    if (logConnError)
                        TraceSystem.Instance.Info(serviceName, _name + " - AGL - Open Device " + _deviceNumber);

                    if (_aglConnectionState == AGL_ConnectionState.NotInit)
                    {
                        result = AGL4.OpenDevice(_deviceNumber);
                        if (result != AGL4.AGL40_SUCCESS)
                        {
                            ErrorHelper.ShowError(result, "OpenDevice");
                        }
                        else
                            _aglConnectionState = AGL_ConnectionState.DevOpened;
                    }

                    if (logConnError)
                        TraceSystem.Instance.Info(serviceName, _name + " - AGL - DialUp " + _deviceNumber);

                    if (_aglConnectionState == AGL_ConnectionState.DevOpened)
                    {
                        result = AGL4.DialUp(_deviceNumber, TIMEOUT_MS);
                        if (result != AGL4.AGL40_SUCCESS)
                        {
                            ErrorHelper.ShowError(result, "DialUp");
                        }
                        else
                            _aglConnectionState = AGL_ConnectionState.DialedUp;
                    }

                    if (logConnError)
                        TraceSystem.Instance.Info(serviceName, _name + " - AGL - InitAdapter " + _deviceNumber);

                    if (_aglConnectionState == AGL_ConnectionState.DialedUp)
                    {
                        result = AGL4.InitAdapter(_deviceNumber, TIMEOUT_MS);
                        if (result != AGL4.AGL40_SUCCESS)
                        {
                            ErrorHelper.ShowError(result, "InitAdapter");
                        }
                        else
                            _aglConnectionState = AGL_ConnectionState.InitAdapter;
                    }

                    if (_aglConnectionState == AGL_ConnectionState.InitAdapter)
                    {
                        if (_plcNumber < 0)
                        {
                            TraceSystem.Instance.Info(serviceName, _name + " - AGL - GetLifeList ...");
                            byte[] lifeList = new byte[128];

                            result = AGL4.GetLifeList(_deviceNumber, lifeList, TIMEOUT_MS);
                            if (result != AGL4.AGL40_SUCCESS)
                            {
                                ErrorHelper.ShowError(result, "GetLifeList");
                            }

                            for (int i = 0; i < lifeList.Length; i++)
                            {
                                if (lifeList[i] == AGL4.LL_ACTIVE || lifeList[i] == AGL4.LL_PASSIVE)
                                {
                                    _plcNumber = i;
                                    break;
                                }
                            }

                            if (_plcNumber < 0)
                            {
                                result = AGL4.AGL40_PLC_NOT_FOUND;
                                ErrorHelper.ShowError(result, "GetLifeList");
                            }
                        }

                        result = AGL4.PLCConnect(_deviceNumber, _plcNumber, out _connectionNumber, TIMEOUT_MS);

                        if (logConnError)
                            TraceSystem.Instance.Info(serviceName, _name + " - Connection with DeviceNumber " + _deviceNumber + " has ConnectionNumber " + _connectionNumber);

                        if (result != AGL4.AGL40_SUCCESS)
                        {
                            string error;
                            AGL4.GetErrorMsg(result, out error);
                            var ex = new Exception(error + " - " + result);
                            if (logConnError || _connectionNumber >= 0)
                            {
                                TraceSystem.Instance.Error(serviceName, _name + " - Connection with DeviceNumber " + _deviceNumber + " ConnectionNumber " + _connectionNumber, ex);
                                if (_connectionNumber < 0)
                                {
                                    if (DateTime.UtcNow - lastErrorDateTime > TimeSpan.FromHours(1))
                                    {
                                        lastErrorDateTime = DateTime.UtcNow;
                                        logConnError = true;
                                    }
                                    else
                                    {
                                        if (logConnError)
                                            TraceSystem.Instance.Error(serviceName, _name + " - Error logging disabled for 1h", ex);
                                        logConnError = false;
                                    }
                                }
                            }
                            throw ex;
                        }
                        else
                        {
                            logConnError = true;
                            _aglConnectionState = AGL_ConnectionState.Connected;
                            _agLinkConnection.InternalRaiseConnectedChanged();

                            result = AGL4.ReadMLFBNr(ConnectionNumber, out _mlfb, TIMEOUT_MS);
                            if (result != AGL4.AGL40_SUCCESS)
                            {
                                string error;
                                AGL4.GetErrorMsg(result, out error);
                                throw new Exception(error + " - " + result);
                            }

                            
                            IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
                            TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();
                            foreach (TcpConnectionInformation c in connections)
                            {
                                Console.WriteLine("{0} <==> {1}",
                                                    c.LocalEndPoint.ToString(),
                                                    c.RemoteEndPoint.ToString());
                                
                            }
                            

                            LoadsymbolsFromPLCAndUpdateRootHandle(false, false);                           
                        }
                    }
                }
                catch (Exception)
                {
                    _agLinkConnection._connectionState = ConnectionState.None;
                    throw;
                }

                if (_agLinkConnection._connectionState != ConnectionState.Connected)
                    _agLinkConnection._connectionState = ConnectionState.None;
            }

und davor machen wir das:
C#:
            _name = name;
            _deviceNumber = deviceNumber;
            _agLinkConnection = agLinkConnection;
            this.serviceName = serviceName;
            _plcNumber = 0;

            AGL4.S7tcpipTia m_tiaParas = new AGL4.S7tcpipTia();
            AGL4.S7tcpipTia1 connSettingsPlc2 = m_tiaParas.Conn[_plcNumber];
            connSettingsPlc2.Address = ipAddress.ToString();
            connSettingsPlc2.ConnTypeEx = AGL4.ConnTypeEx.eCT_HMI;
            connSettingsPlc2.PLCClassEx = AGL4.PLC_ClassEx.ePLCEx_AUTO_TIA; //Autodetect PLC type
            connSettingsPlc2.PlcNr = (ushort)_plcNumber;
            connSettingsPlc2.TimeOut = timeOut; //Timeout in milliseconds

            TraceSystem.Instance.Info(serviceName, _name + " - AGL - SetDevType ...");
            int res = AGL4.SetDevType(_deviceNumber, AGL4.TYPE_S7_TCPIP_TIA);
            if (res != AGL4.AGL40_SUCCESS)
            {
                string error;
                AGL4.GetErrorMsg(res, out error);
                TraceSystem.Instance.Error(serviceName, _name + " - Constructor() - " + res + " - " + error);
            }

            TraceSystem.Instance.Info(serviceName, _name + " - AGL - SetParas ...");
            res = AGL4.SetParas(_deviceNumber, AGL4.TYPE_S7_TCPIP_TIA, (object)m_tiaParas);
            if (res != AGL4.AGL40_SUCCESS)
            {
                string error;
                AGL4.GetErrorMsg(res, out error);
                TraceSystem.Instance.Error(serviceName, _name + " - Constructor() - " + res + " - " + error);
            }

Und außen pflegen wir noch eine liste der DeviceNummern....

C#:
                    lock (usedDeviceNumbers)
                    {
                        _deviceNumber = 0;
                        for (int n = 0; n < int.MaxValue; n++)
                        {
                            if (!usedDeviceNumbers.Contains(n))
                            {
                                usedDeviceNumbers.Add(n);
                                _deviceNumber = n;
                                break;
                            }
                        }
                    }
 
Zurück
Oben