TwinCat Load Symbol Data @camper


  • Mod

    In VersionHelpers.h scheint nichts für uns relevantes zu sein.
    Habe zum Test mal meine Version entfernt und einfach einen leeren Header VersionHelpers.h zum Projekt hinzugefügt, Projektverzeichnis zu zusätzlichen Includepfaden hinzugefügt (weil #include per <>), et voilà - kompiliert wieder. Das wäre also auch eine Möglichkeit.



  • - Die VersionHelpers.h habe ich nun zum Test einfach mal auskommentiert. Wie du sagst die braucht man nicht. Muss es dann auch so machen wie du sagtest.

    - Zu der Formatierung: Es gibt ja Resharper für c++. Der formatiert mir den Code auf Knopfdruck 😉

    - Hatte dich noch gefragt wieso du diesesmal die _impl.h weg gelassen hast. Und wo der Unterschied ist, den Code in eine _impl.h zu packen oder in die cpp in den unbenannten Namespace?

    - Was mich auch noch interessiert ist wieso die Ads.h und die TcAdsDef und TcAdsAPI.h viele doppelte definitionen beinhaltet.

    Da habe ich jetzt mal bei Beckhoff nachgefragt. Die Ordnerstruktur in der TwinCat 3.1 Installation ist auch noch mehr als verwirrend.



  • und noch ein Kompilierungsfehler:

    if (s[0] < '0' || s[0] > '9' || (std::numeric_limits<sizeType>::max() - (s[0] - '0')) / 10 < result)
    

    das max kennt er nicht;

    '(': illegal token on right side of '::'


  • Mod

    booster schrieb:

    und noch ein Kompilierungsfehler:

    if (s[0] < '0' || s[0] > '9' || (std::numeric_limits<sizeType>::max() - (s[0] - '0')) / 10 < result)
    

    das max kennt er nicht;

    '(': illegal token on right side of '::'

    unbedingt NOMINMAX in stdafx.h (wenn du hast) vor allen anderen Headern definieren.
    <windows.h> und Konsorten haben die Angewohnheit, sonst Macros für min und max zu definieren.



  • Hi camper

    unbedingt NOMINMAX in stdafx.h

    Klar. Ich hatte das NOMINMAX immer in den Projekteinstellungen drin. Ausgerechnet in diesem habe ich es nun vergessen. 👍

    Jetzt kennt er die Konstante ADSSYMBOLFLAG_STATIC nicht in:

    ref_property<symbol_entry_prop::isStatic, flag<
       AdsSymbolEntry, symbol_entry_prop::flags, ADSSYMBOLFLAG_STATIC>>,
    

    Die darüber liegenden sind ja alle in Ads.h drin. ADSSYMBOLFLAG_STATIC aber nicht.


  • Mod

    booster schrieb:

    Jetzt kennt er die Konstante ADSSYMBOLFLAG_STATIC nicht in:

    ref_property<symbol_entry_prop::isStatic, flag<
       AdsSymbolEntry, symbol_entry_prop::flags, ADSSYMBOLFLAG_STATIC>>,
    

    Die darüber liegenden sind ja alle in Ads.h drin. ADSSYMBOLFLAG_STATIC aber nicht.

    Dann kann ich nur vermuten, dass das neu und deine twincat Version zu alt ist. Bei mir ist sie drin (Dateidatum 22.02.2018 10:07 Uhr). Ich denke mir das ja nicht aus 😉

    Neue Version liest auch Attribute und Enums aus:
    adsData.h
    adsData.cpp
    main.cppund verzichtet praktisch gänzlich auf Zeigergefrickel.

    bzgl. _impl.h vs. Namespace - verstehe ich die Frage nicht so recht.
    Die _impl.h existierte, weil in diesem Code Teile des öffentlichen Headers private Typen benutzten, die dort schon vollständig definiert sein mussten. Das ist jetzt nicht mehr der Fall.



  • Dann kann ich nur vermuten, dass das neu und deine twincat Version zu alt ist. Bei mir ist sie drin (Dateidatum 22.02.2018 10:07 Uhr). Ich denke mir das ja nicht aus 😉

    Meine Ads.h ist vom 24.05.2017. Versteht wer will. Ich habe mir die neuste TwinCat Version letze Woche von der Hompage gezogen und installiert.


  • Mod

    Version? TC31-Full-Setup.3.1.4020.39.zip bei mir



  • Na dann ist meine neuer: 3.1.4022.16
    ??


  • Mod

    nvm. sehe gerade, dass ich auch Build 4022 habe, hatte die Datei nur verschoben.
    Evtl. funktionieren ja inplace Updates nicht so gut - also mal mit Deinstallation (schauen, dass die Verzeichnisse auch verschwinden) und dann Neuinstallation versuchen?



  • Evtl. funktionieren ja inplace Updates nicht so gut

    An dem scheint es gelegen zu haben. 😞



  • Funktioniert das ganze eigentlich auch noch für TwinCat2



  • Und noch einen Kompilierungsfehler:

    'adsData::datatypeInfo *const ': unknown size

    adsdata.h(102): note: see reference to class template instantiation 'std::vector<adsData::datatypeInfo,std::allocator<_Ty>>' being compiled


  • Mod

    booster schrieb:

    Und noch einen Kompilierungsfehler:

    'adsData::datatypeInfo *const ': unknown size

    adsdata.h(102): note: see reference to class template instantiation 'std::vector<adsData::datatypeInfo,std::allocator<_Ty>>' being compiled

    Ich habe keine Ahnung, in welcher Weise du meinen Code verändert hast.
    Die Zeilenangabe passt schon mal nicht. Allerdings ist das einzige in adsdata.h, dass mit datatypeInfo zu tun hat, die deklaration des privaten members types_
    Was ich nicht weiss, ist wo der Fehler auftritt.
    note: ist keine Fehlermeldung
    Bei einem Fehler steht immer error: da
    Note ist bloss eine Erläuterung in Ergänzung

    Da du umformatiert hast, wirst du zur Fehlermeldung immer auch das zugehörige Stück Code posten müssen, damit ich zuordnen kann.



  • Ja ok ich habe folgendes geändert:

    Ich habe das Laden der Symbole aus dem Konstruktor raus genommen.
    Weil ich die Verbindung zur SPS in einer anderen Klasse mache.

    Dafür habe ich einmal einen Standardkonstruktor
    und einen der die vectoren für syData und dtData übernimmt.

    explicit adsData() = default;
    
    adsData::adsData(const std::vector<char>& symData, const std::vector<char>& dtData)
    {
        initialize(symData, dtData);
    }
    

  • Mod

    explicit adsData() = default;
    

    Das ist dein Problem. Die implizite Instantiierung dieses Konstruktors instantiiert den Defaultkonstruktor von vector, was nur geht, wenn der Elementtyp vollständig definiert ist.
    Aus diesem Grund muss auch die Definition des Defaultkonstruktors in adsdata.cpp erfolgen - wie auch schon für Destruktor, Movekonstruktor und Move-Assignment op von adsData.

    Sauberer wäre nebenbei, einen Konstruktor, zu haben, der dieselben Parameter wie initialize nimmt. Vom Defaultkonstruktor halte ich nichts. Mit diesem hindert dich nichts, initialize mehrfach aufzurufen. initialize räumt aber nicht zunächst auf (weil es nur bei Objektkonstruktion aufgerufen werden soll).
    Falls du irgendwann später mal Datenn neuladen willst, kann das immer noch geschehen: einfach ein neues adsData-Objekt erzeugen und dem anderen Move-Zuweisen.



  • Achso. Wieder was gelernt. 🙂

    Tu mir ehrlich gesagt noch schwer den ganzen Code zu verstehen.

    Auch mein Resharper hat noch Schwierigkeiten mit dem Code 😃
    Der zeigt mir noch ziemlich viele Fehler an.

    Aber kompilieren tut es jetzt.

    Zum Speicherverbrauch kann ich noch nichts sagen. Aber der Code ist nun um einiges komplexer geworden.

    Oftopic: Gibts eigentlich gute Schulungen die einem c++ und im speziellen die Neuerungen von c++ 11 bis c++17 vorstellen.



  • Nochmals zur Ordnerstruktur von ADS. Hierzu habe ich mit Beckhoff Rücksprache gehalten.

    Hier wurde mitgeteit das die Dateien im Verzeichnis:

    C:\TwinCAT\3.1\sdk\Include
    

    nur für interne Zwecke vorgesehen sind.

    Bitte nehmen Sie nur die Dateien aus den AdsApi Ordner!

    Also diesem hier.

    C:\TwinCAT\AdsApi\TcAdsDll\Include
    

    Ich weiß jetzt nicht inwiefern das sich nun mit deinem Code verträgt. Ich sollte es aber tunlichst vermeiden irgendwas zu verwenden das von unserem SPS lieferanten nicht unterstützt wird.


  • Mod

    booster schrieb:

    Zum Speicherverbrauch kann ich noch nichts sagen.

    Sicher etwas größer als in meinem ursprünglichen Code, weil die Daten nicht mehr in der kompakten Form gehalten werden, in der sie vom Netzwerk kommen. Andererseits werden keine Duplikate erstellt, so dass der Speicherverbrauch der gesamten Datenstruktur nur linear von der Größe der Netzwerkdaten abhängt. Ein davongallopieren des Verbrauchs wie zuvor ist ausgeschlossen.

    booster schrieb:

    Aber der Code ist nun um einiges komplexer geworden.

    Dafür kann er auch mehr 🙂

    Irgendetwas habe ich beim Experimentieren kaputtgemacht. Egal wie mein POU aussieht, ich erhalte keine Daten mehr darüber, bloss die paar Systemvariablen, die immer da sind. Irgendeine Idee dazu?

    booster schrieb:

    Oftopic: Gibts eigentlich gute Schulungen die einem c++ und im speziellen die Neuerungen von c++ 11 bis c++17 vorstellen.

    Wenn du jetzt noch nach C++11 fragen musst, wären eher ein paar Bücher angesagt. Die Antwort dazu überlasse ich mal Anderen, die einen besseren Überblick über die aktuelle Literatur haben.


  • Mod

    booster schrieb:

    Hier wurde mitgeteit das die Dateien im Verzeichnis:

    C:\TwinCAT\3.1\sdk\Include
    

    nur für interne Zwecke vorgesehen sind.

    Bitte nehmen Sie nur die Dateien aus den AdsApi Ordner!

    C:\TwinCAT\AdsApi\TcAdsDll\Include
    

    Wenn diese Dateien gepflegt und intern konsistent wären, wäre das ja auch kein Problem.

    Beispiel:

    TcAdsDef.h schrieb:

    typedef struct
    {
    	ADS_UINT32		entryLength;	// length of complete datatype entry
    ...
    	// GUID			typeGuid;		// typeGuid of this type if ADSDATATYPEFLAG_TYPEGUID is set
    	// ADS_UINT8	copyMask[];		// "size" bytes containing 0xff or 0x00 - 0x00 means ignore byte (ADSIGRP_SYM_VALBYHND_WITHMASK)
    } AdsDatatypeEntry, *PAdsDatatypeEntry, **PPAdsDatatypeEntry;
    

    Schön und gut. Nur dass ADSDATATYPEFLAG_TYPEGUID eben nirgends definiert ist, wie auch ADSIGRP_SYM_VALBYHND_WITHMASK.

    Die Sachen in <ads.h> an denen wir interessiert sind, sind ausschliesslich diese Stukturdefinitionen und die zugehörigen Konstanten.


Anmelden zum Antworten