TwinCat Load Symbol Data @camper



  • @camper

    Wahnsinn. Vielen Dank.

    Bevor ich da jetzt erst mal inhaltlich was dazu sagen kann muss ich mich erst mal eine Weile durchkämpfen.

    Frage: Wieso hast du jetzt keine _impl.h ->

    Für mich war zwar klar dass man dies macht um bestimmte Implemetierungsdetails zu verstecken. Aber das hast du ja auch mit dem namenlosen namespace gemacht. Und wann man nun was wo hin packt war nicht ganz so ersichtlich.



  • Den Code habe ich nun mal in mein Programm genommen.
    Kompiliert aber noch nicht folgender Fehler:

    Error	C1083	Cannot open include file: 'VersionHelpers.h': No such file or directory	c:\twincat\3.1\sdk\include\TcDef.h
    

  • Mod

    booster schrieb:

    Den Code habe ich nun mal in mein Programm genommen.
    Kompiliert aber noch nicht folgender Fehler:

    Error	C1083	Cannot open include file: 'VersionHelpers.h': No such file or directory	c:\twincat\3.1\sdk\include\TcDef.h
    

    verweist bei mir auf
    c:\Program Files\Windows Kits\10\Include\10.0.16299.0\um\VersionHelpers.h
    Evtl. musst du das Windows SDK noch mit dem Visual C++ Installer nachinstallieren.


  • Mod

    Neue Version mit ein paar zusätzlichen Kommentaren. Normaler C++ Code ab Zeile 760.



  • c:\Program Files\Windows Kits\10\Include\10.0.16299.0\um\VersionHelpers.h
    

    Evtl. musst du das Windows SDK noch mit dem Visual C++ Installer nachinstallieren

    Geht das auch bei Windows 7?

    Der Code ist jetzt etwas übersichtlicher 🙂
    Aber nur etwas. Darf ich meine Meinung kund tun:
    Ich finde es einfach nur schrecklich die öffnende Klammer { ans ende zu stellen und nicht in eine eigene Zeile. Und die funktionen ohne Leerzeilen aneinander gereeiht. Das mag vieleicht kompakt sein aber übersichtlich und lesbar nicht.


  • Mod

    booster schrieb:

    c:\Program Files\Windows Kits\10\Include\10.0.16299.0\um\VersionHelpers.h
    

    Evtl. musst du das Windows SDK noch mit dem Visual C++ Installer nachinstallieren

    Geht das auch bei Windows 7?

    Wieso meinst du, das wäre nicht möglich? Wie erstelltst du sonst Programme für Windows? Ich finde es eher seltsam, dass das Problem überhaupt auftritt. Der Include-Name deutet ja eher auf eine Datei hin, die schon immer in allen SDK-Versionen existiert hat, und das Vorhandensein irgendeiner Version ist nun mal essentiell.
    Habe testweise mal Windows SDK deinstalliert (ist ja eh eine Wegwerf-VM): Effekt ist, das das Verzeichnis verschwindet und der Compiler gleich mit einem fatalen Fehler aussteigt. Reinstallation per VS-Installer (Einzelkomponenten/SDKs, Bibliotheken und Frameworks) und alles funktioniert wieder.

    booster schrieb:

    Darf ich meine Meinung kund tun:
    Ich finde es einfach nur schrecklich die öffnende Klammer { ans ende zu stellen und nicht in eine eigene Zeile. Und die funktionen ohne Leerzeilen aneinander gereeiht. Das mag vieleicht kompakt sein aber übersichtlich und lesbar nicht.

    Darfst du, allerdings werde ich darauf nicht eingehen.
    Wir wissen alle, wie solche Diskussionen enden.
    Oder, wenn ich es mir recht überlege: nur komische Leute (Windowsprogrammierer) haben vertikal zuviel Platz 🙂



  • Darfst du, allerdings werde ich darauf nicht eingehen.
    Wir wissen alle, wie solche Diskussionen enden.
    Oder, wenn ich es mir recht überlege: nur komische Leute (Windowsprogrammierer) haben vertikal zuviel Platz 🙂

    😃 Schon klar dass du darauf nicht eingehst. War auch nicht meine Absicht.
    Und ich weiß nur die anderen komischen Leute (Linux Programmierer) haben horizontal zu viel Platz. Die würden am liebsten das ganze Programm in einer Zeile programmieren.

    Zurück zum Thema:

    Wieso meinst du, das wäre nicht möglich? Wie erstelltst du sonst Programme für Windows? Ich finde es eher seltsam, dass das Problem überhaupt auftritt.

    Ich meine natürlich das Windows 10 SDK...

    Ich habe folgendes Plattformtoolset eingestellt:
    Visual Studio 2017 - Windows XP (v141_xp)
    Weil wir noch XP Rechner unterstützen müssen.

    Als Windows SDK Version wird dann 7.0 ausgewählt. Dachte vielleicht ist die VersionHelpers.h da noch nicht definiert. Internet sagt aber gibt es schon seit VS 2013.

    Ich habe jetzt mal den Installer von VS2017 nochmals angeworfen. Dort kann man nur verschiedene Windows SDK in der Version 10 und 8.1 auswählen.
    Die sind aber installiert.


  • 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


Anmelden zum Antworten