Problem ADS Kommunikation zwischen Beckhoff IPC und Linux IPC

LPunktHPunkt

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich scheitere momentan an einer ADS Kommunikation zwischen einem Beckhoff C6915-000 und einem Linux Rechner.
Der Linux-Rechner (ECU getauft) soll Lese- und Schreibzugriff auf ein paar definierte globale Variablen der SPS haben.
Die ECU wird mit einem C++ Code und die SPS mit TwinCat2 PLC programmiert.
Das unverständliche ist, dass wenn der C++ Code für Windows kompiliert wird die Software funktioniert.
D.h. wenn ich mit dem Rechner, der im selben Netzwerk wie die SPS und die ECU ist, das für Windows kompilierte Programm starte bekomme ich keinen Fehler.
Wenn ich den selben Code auf der ECU ausführe bekomme ich den ADC Return Code 0x745 bzw. 1861. (ADSERR_CLIENT_SYNCTIMEOUT- Timeout ist aufgetreten)
Ping habe ich per SSH von der ECU zu SPS und per Remotedesktopverbindung von der SPS zur ECU getestet.
ADS Route habe ich in die SPS eingetragen.
remotezugriff ams router.PNG
Die ADS Route der ECU wird per Software erstellt und sollte funktionieren, da sie keine Fehlermeldung ausgibt.
Code:
[FONT= ][COLOR=#000000] 

        // add local route to your EtherCAT Master 
        if (AdsAddRoute(m_remoteNetId, m_remoteIp.c_str())) 
        { 
                traceError("") << "Adding ADS route failed, did you specify valid addresses?\n"; 
                return false; 
        } 
 
        // open a new ADS port 
        m_portId = AdsPortOpenEx(); 
        if (!m_portId) 
        { 
                traceError("") << "Opening ADS port failed\n"; 
                return false; 
        }

[/COLOR][/FONT]

Error in meinem Logfile der ECU ist: ADSDevice.cpp e732c51 () 317 Error Create handle for '.ActPoseMC' failed with: 0x745
ActPoseMC (ohne Punkt davor) ist eine der globalen Variablen auf die zugegriffen werden soll.Die passende Software Stelle dazu:
Code:
traceDebug("") << "Creating handle for: " << handleName << std::endl;
 const long handleStatus = AdsSyncReadWriteReqEx2(m_portId,
         &m_remote,
         ADSIGRP_SYM_HNDBYNAME,
         0,
         sizeof(*handlePtr),
         handlePtr,
         static_cast<uint32_t>(handleName.size()),
         handleName.c_str(),
         NULL);
 if (handleStatus)
 {
  traceError("") << "Create handle for '" << handleName << "' failed with: 0x" << std::hex << handleStatus << '\n';
  return false;
 }

Ich bin leider etwas ratlos und hoffe, dass ihr mir helfen könnt und ich nur eine Kleinigkeit wie z.B. eine ADS-Route vergessen habe.
Falls ich die Frage an die falsche Stelle im Forum gesetzt habe tut es mir leid.

Gruß


 
Damit die ADS Kommunikation funktioniert, muss der TwinCAT Message Router auf dem Rechner laufen. Da ich nicht davon ausgehe, dass auf dem Linux Rechner TwinCAT installiert ist (weil das nicht geht), wird auch der Message Router fehlen....
 
Hallo und danke schon einmal für die Antworten.
Die Kollegen, die den C++ Teil geschrieben haben haben hierauf zurückgegriffen:
https://github.com/Beckhoff/ADS
This library is intended to provide easy use as ADS client applications running on non-windows systems (e.g. Linux, Mac OS...) to communicate with TwinCAT devices via TCP/IP.
Das sollte dann doch diesen Message Router beinhalten. Ansonsten verstehe ich den Sinn der Library nicht.:sad:
 
Zuletzt bearbeitet:
Hallo L.H.,

der Errorcode 0x745 steht für Timeout, was auf eine fehlende Route hinweist.
Wurde die AMS Route mit richtiger AMS NetID und IP Addresse auf dem Zielsystem eingetragen?
Kontrollier mal ob die Route auch in der Registry korrekt eingetragen wurde.

Gruß, Neals
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Neals,
Die Route auf der SPS habe ich wie in dem Bild oben eingetragen. Die 192.168.100.182 ist die ECU und die 192.168.100.35 ist die der SPS. Die Net-ID jeweils noch mit 1.1 hinten dran.
AdsAddRoute(m_remoteNetId, m_remoteIp.c_str())) sollte eigentlich die richtige Route auf der ECU eintragen. Da es bei dem Code für Windows kompiliert klappt gehe ich mal davon aus, dass die Funktion läuft.
 
Hallo danke,
das Problem hat sich gestern tatsächlich über Wireshark geklärt. Die ECU wollte auf einen nicht geöffneten Port der SPS zugreifen.

Vielen Dank an alle.
 
Zurück
Oben