Namensräume von OPC UA/C++

OPCnoob

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Forum,

ich habe eine Verständnisfrage hinsichtlich der Namensräume von OPC UA bzw. geht es darum das ich z.Z. ein Praktikum mache und einen OPC UA Client entwickeln soll. Die Entwicklung geschieht in C++ und wird vom Softing Tutorial geleitet...Nun bin ich an der Stelle das ich mich wunderbar mit meinem OPC Server verbinden kann, jetzt gibt es die Möglichkeit einen Pfad im Server zu browsen anhand der translatebrowsepath Funktion...Problem ist das ich mir zigtausend kombinationen für die Syntax schon ausgedacht habe um den Pfad entlang zu gehen. Ich habe gestern in der Siemens Doku gelesen das der Ordner von dem ich runtergehen möchte den Namensraum "4" hat, hab auch schon im OPC Scout geguckt wie ich den Pfad weiter komme, aber das will einfach nicht funktionieren :( vielleicht kann mir einer von euch helfen?? Zur besseren verständlichkeit Poste ich mal den Auszug der translate Funktion:

Code:
// an array of borwse paths that shall be translated 
std::vector<tstring> browsePaths;
// the nodes where the paths shall start 
std::vector<tstring> startingNodes;
// and a result array for the call. 
std::vector<BrowsePathResult> browsePathResult;
        
        
        browsePaths.push_back(_T("/4:TEST/PLC/DAT_RD"));
        startingNodes.push_back(_T("ns=4;s=SYM:"));

Auf das Server Object was ja jeder OPC UA Server haben muss kann ich zugreifen, aber das will einfach nicht...

Aller besten Dank im voraus :D
 
der eine Ordner klappt der andere nicht

So,

auf den S7: Ordner kann ich browsen auf den SYM nicht!?!?einer ne Erklärung? hier mal das Codesnippet:
Code:
browsePaths.push_back(_T("/2:@LOCALSERVER/2:blocks/2:db/2:db1"));     //funktioniert
browsePaths.push_back(_T("/4:TEST/4:PLC"));                                           //funktioniert nicht

        
startingNodes.push_back(_T("ns=2;s=S7:"));       //funktioniert
startingNodes.push_back(_T("ns=4;s=SYM:"));     //funktioniert nicht

also ich verstehs einfach nicht xD das hat mich einfach mal übelst zeit gebraucht um mal auf die Idee zu kommen vor jedem Ordner den Namespace Index zu setzen....
und warum funktioniert das nicht für den SYM: Ordner ist der irgendwie anders??

im Endeffekt gehts mir eig. darum den Pfad zu finden(also in seiner korrekten schreibweise) um die read() funktion endlich benutzen zu können - weil die will auch nur mit dem richtigen string arbeiten...
 
Also ich selber habe den Server nicht aufgesetzt, aber soweit ich weiß(sofern ich mich jetzt nicht irre) wurden die Symbole alle durch eine .xdb datei geladen oder anders. Auf jedenfall sind Symbole und Variablen in dem oben angegebenen Pfad drin, welche ich auch mit dem OPC Scout sehen kann(sehen im sinne von die Werte ändern sich von 0 auf 1 ) im OPC Scout hab ich auch nochmals nach dem Namespace Index geguckt und er scheint wirklich "4" zu sein,also für den SYM: Ordner , deshalb verstehe ich nicht wie ich auf den S7: knoten browsen kann und auf den SYM: Ordner nicht?? Das Toolkit was hier verwendet wird ist ja das von Softing sprich ich hab auch ne Doku....aber das wird nicht beschrieben wie ich super auf den von Siemens spezifischen objects browsen bzw. lesen kann... heheh das is schon der knaller...

danke auf jedenfall erstmal für eine schnelle antwort die ich nciht in dem zeitrahmen angenommen habe!!! :D
 
So,

andere Frage: Was könnte denn der Grund dafür sein, das wenn ich versuche auf dem SYM: Ordner zu browsen, das er mir als Fehlermeldung "BadNodeIDunknown" ausgibt? Mir ist klar was die Fehlermeldung bedeutet, dennoch macht es meiner Meinung keinen Sinn das sie kommt,
da:

1) der korrekte namespace angegeben ist => welcher im OPCscout nachzulesen ist
2) der string auch korrekt angegeben wurde nämlich: SYM:
3) so und nun durch meine neue erkenntnis wie auch bei dem S7: Ordner jeden Pfad bzw. neuen Ordner mit dem Namespaceindex angegeben habe
zur einfachheit halber wollte ich sogar nur einen Ordner runter browsen, aber das will nicht.
Also was könnte das Problem sein??OPCScout zeigt mir ja den Ordner und dem sein Inhalt an, ich kann ja auch die Variablen sehen wie sie ihre Werte ändern...
Kann es sein das der SYM Ordner vllt wirklich nicht im Adressraum definiert ist, aber das macht doch auch keinen sinn...

Ok beste grüße
 
Zunächst mal würde ich Dir folgendes Dokument empfehlen:
Siemens Customer Support (http://support.automation.siemens.com) dort suchen nach: Beitrags-ID:42014088

Ich vermute stark das du den "SYM:" innerhalb des NodeIDStrings weglassen musst. Wenn der drin bleibt, geht es nicht und der Server Antwortet (völlig zurecht) das diese Node nicht existiert. Das mit dem Namespace Index solltest du auch verstehen, den darf man nicht hardcoden, denn (theoretisch) darf der sich auch ändern (nicht zur Laufzeit aber wenn der Sever neu startet).

Damit du nicht so viel rum probieren musst und raten, solltest du dir den UaExpert (Home*-*Unified Automation) runterladen. Der macht a) alles richtig und hat b) ein Fenster in dem man alle Attribute sehen kann wenn man auf einen Knoten browsed und c) in einem weiteren Fenster sehen kann welche Referenzen von diesem Knoten zum nächsten führen. Insgesamt sehr praktisch.
 
Zuletzt bearbeitet:
Also erstmal dickes danke!!!
Die PDF hatte ich auch schon gefunden bzw. halb gelesen.

Du hattest recht das man den "SYM:" string weg lassen muss, was ich daran aber nicht ganz verstehe ist das diese Angabe ja für den "S7:" Ordner geklappt hat, bloß nihct für den "SYM:" . Also das mit den hardcoden verstehe ich soweit, sofern es ein anderer Server als der von Siemens ist, da dort ja der Index fest vorgegeben ist. Sofern das ein anderer Anbieter ist verstehe ich das da ja das dann anders vergeben ist. Also du hast schon recht das man das nicht machen sollte!!

Ähm ja UaExpert schon längst ausprobiert und bin der Meinung dass von der Funktionalität die du oben angepriesen hast, dass das auch mit dem OPCScout V10 funktioniert.

Wenn wir gerade schon bei Probleme lösen sind, vllt hast du ja auf meine nächste Frage auch eine Antwort. Und zwar möchte ich ja auch die Variablen aus dem einen bestimmten Ordner auslesen, aber die readVariables Funktion bekommt es zur Zeit nicht einmal hin auf das Server Objects zulesen, obwohl das Lokal mit dem TestServer von Softing einwandfrei funktioniert hat. Hier mal der Auszug vom Code:

Code:
// find the folder containing the variables. 
     if(0 != findNodes(NodeId(0, EnumNumericNodeId_ObjectsFolder), res, browsedNodes, _T("Server"), EnumNodeClass_Object))
    {
        _tprintf(_T("Error finding \"\"nodes....\n"));
        return -1;
    }

also eig. will ich ja genau auf diesen Pfad hier lesen:
(_T("/4:TEST/4:pLC/4:DAT_RD"));

Ich danke Vielmals
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So das mit der readVariables Funktion klappt nun soweit erstmal, habs irgendwie verpeilt, das richtig mit dem Namespace Index und dem StartOrdner korrekt anzugeben. Hier wäre einmal das wie es nun erstmal richtig wäre, um die Variablen zu lesen:

Code:
// find the folder containing the variables. 
     if(0 != findNodes(NodeId(4, "TEST"), res, browsedNodes, _T("DAT_RD"), EnumNodeClass_Object))
    {
        _tprintf(_T("Error finding \"\"nodes....\n"));
        return -1;
    }

so jetzt kommt die eig. Aufgabe, das man das alles nicht hardcoded sondern im Terminal eingeben kann :D

Ok danke erstmal für die Tips!!
 
Zurück
Oben