Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Direkte Auswertung von Digitalen Zuständen mit OPC

  1. #11
    bloodymichael ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.09.2010
    Beiträge
    21
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,
    inzwischen ist fast ein Monat vergangen und muss euch sagen, es läuft so lala. Die Verbindung via C++ zur et200 Baugruppe läuft wie im Beispiel wunderbar. Nur alles was jetzt kommt, da tue ich mich sehr schwer. Bis zur Erstellung von einer kleinen Gui, die sich mit dem Et200M Modul verbindet lief alles ganz gut. Aber beim Ansprechen der einzelnen Bits bzw. Bytes komme ich einfach nicht mehr weiter und habe auch überhaupt keinen Ansatz mehr.
    Hab schon nebenbei ein bisschen mit WinCC rumgedokter und festgestellt, dass es damit sehr leicht gehen würde mein Programm zu realisieren. Leider würde das aufgrund der Lizenzen viel viel zu teuer werden.
    Habt ihr vielleicht noch ne Idee wie ich mir das Projekt kostengünstig vereinfachen kann?
    Was z.B ist Libnodave und wie funktioniert das?
    gruß Michael

  2. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Zitat Zitat von bloodymichael Beitrag anzeigen
    ... Nur alles was jetzt kommt, da tue ich mich sehr schwer ... Aber beim Ansprechen der einzelnen Bits bzw. Bytes komme ich einfach nicht mehr weiter und habe auch überhaupt keinen Ansatz mehr.
    Hallo,
    wo hängst du denn da konkret bzw. wo ist das Problem ?
    Ich glaube nicht, dass du es mit Libnodave wirklich einfacher hättest, da das im Wesentlichen einfach nur eine andere Sammlung von Methoden ist, um mit der SPS zu kommunizieren.
    Ich vermute, dass dein Problem die Visualisierung von Zuständen ist ...?

    Gruß
    Larry

  3. #13
    bloodymichael ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.09.2010
    Beiträge
    21
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Genau da stecke ich jetzt fest. Die Zustände aus der Et200M auszulesen und sie dann zu visualisieren. Ich habe mir eine List kontrol erstellt, Spalten eingefügt und würde jetzt z.B. gerne, wenn der Eingang xy kommt einen Text in diese Tabelle schreiben. Die frage ist nur, wie komme ich an die Abfrage von Eingang xy heran?

  4. #14
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    List-Control ?
    Also erstmal wirst du ja die Eingänge als BYTE oder ggf. sogar WORD haben. An die einzelnen Bits hiervon kommst du nur über Maskieren dran (myBit_0 = myBte and 1) .
    Um deren Zustand anzuzeigen würde ich eine Checkbox verwenden (je eine für jedes Bit) oder du baust dir ein eigenes Control zusammen (das ist auch nicht so schlimm ...).

    Gruß
    Larry

  5. #15
    Registriert seit
    27.10.2009
    Beiträge
    317
    Danke
    0
    Erhielt 64 Danke für 54 Beiträge

    Standard

    Genau, Du bist eigentlich schon sehr nah dran.

    Du hängst dich in den Eventhändler des OnDataChange (die Items müssen natürlich hinzugefügt sein in eine aktive Gruppe). In diesem EventHandler fummelst Du dir die Bits raus aus den Bytes/Words die da kommen und dann weist du sie den Feldern in deinem ListControl zu.

    Wenn Du Texte hinterlegt hast in einem StringArray kannst du auch über den Index (entsprechend dem Bit in dem Byte/Word) die Texte holen und die dann dem List (oder Grid-) Control zuweisen.

  6. #16
    bloodymichael ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.09.2010
    Beiträge
    21
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Was ich bis jetzt gemacht habe, ist das Projekt, das mir Dr. OPC am 08.09.2010 19:12 gezeigt hat zu öffnen und mich intensiv damit auseinander zu setzen. Hab es auch soweit hinbekommen, dass es mit meinen Ein und Ausgängen funktioniert. Jetzt bin ich halt dabei meine eigene GUI zu erstellen, was ich auch schon gemacht habe und nun müsste ich eigentlich die Ein und Ausgänge "nur" noch in Variablen einfügen, mit denen ich diese dann ausgeben, bzw. bearbeiten kann.
    Ich verstehe z.B. überhaupt nicht wo sich das Programm aktualisiert also sprich wo das Programm schaut, dass sich Eingänge geändert haben.
    Außerdem hab ich bis jetzt noch keine Variable in dem Beispiel von Dr. OPC gefunden wo man klar sagen kann, "DAS ist jetzt die Variable für E0.0". Vielleicht gibt es die schon aber ich habe auf jedenfall keine Ahnung wo und wie.
    Kann man vielleicht in ein paar Zeilen schon schreiben: Ruf den OPC-Server auf, erstelle eine Gruppe mit einem Item und dann schreib den Wert des Items in eine Variable?
    Es wäre echt nett wenn mir jemand mal einen kleinen Anstoss verpassen würde.

    gruß Michael

  7. #17
    Registriert seit
    27.10.2009
    Beiträge
    317
    Danke
    0
    Erhielt 64 Danke für 54 Beiträge

    Standard

    Bezugnehmend auf die Beitrags-ID:21045282

    in "ServerDefines.h" sind die Items für das Beispiel definiert worden
    in "UserInterface.cpp" siehst du im OnBtnConnectClick()
    Code:
    void CUserInterface::OnBtnConnectClick()
    hr = m_pOPCServerMgt->ConnectOPCServer(OPCCLIENT_SERVER_PROGID);
    //blabla
    hr = m_pOPCServerMgt->AddGroup(m_pOPCGroupMgt);
    //blabla vorbereiten der Itemstrukturen
    hr = m_pOPCGroupMgt->AddItems( //blabla
    dass die Verbindung zu OPC Server aufgebaut wird, eine Gruppe angelegt wird und die Items hinzugefügt werden. Wenn das Hinzufügen geklappt hat, wird der Callback am Objekt der Gruppe angemeldet
    Code:
    // Connect data callback to receive OnDataChange events from OPC server
                    hr = m_pOPCGroupMgt->ConnectCallback((CDataCallback*)this);
    und das war es schon!
    Nun wirst DU gerufen vom OPC Server wenn sich die Variablen ändern. In der "UserInterface.cpp" in der Methode CUserInterface:: DataChange kommen die Werte an und werden in die Controls der Oberfläche abgefüllt.
    Code:
    STDMETHODIMP CUserInterface::DataChange(HRESULT                hrMasterquality,
                                            UINT                dwCount,
                                            const CUIntArray   &aClientHandles,
                                            const CVARIANTArray&aValues,
                                            const CUIntArray   &aQualities,
                                            HRESULT*            pErrors)
    
    
    //blabla
    
                    if(aQualities[i] != OPC_QUALITY_GOOD)
                        SetDlgItemText(dwControlID,CErrorLookup::GetQuality(aQualities[i]));
                    else
                        SetDlgItemText(dwControlID,(CString)aValues[i].bstrVal);
    hier musst du nun auch deine GUI Controls befüllen

  8. #18
    bloodymichael ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.09.2010
    Beiträge
    21
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Super DANKE!! Das war auf jedenfall hilfreich. Jetzt hab ich halt noch ein Verständnis Problem bzgl. der erstellung der Items. Wenn ich z.B. nur ein Item erstellen möchte hab ich mir überlegt, folgenden code in der OnBtnConnectClick() zu verwenden.
    Code:
    CUIntArray anServerHandle;   // Array of client item handles - returned from AddItems
    CHRESULTArray ahrErrors;     // Array of result codes for each item - returned from AddItems
                CStringArray astrItems;
                CUIntArray anRequDatatypes;
                CUIntArray anClientHandles;
    
                astrItems.Add("DP:[CP 5613 A2]Slave005M00_IX0.0,1");
                anRequDatatypes.Add(VT_BOOL);
                anClientHandles.Add(1);
    
                // Add items to the group
                hr = m_pOPCGroupMgt->AddItems(  1,         // Item count 
                                                astrItems,               // ItemIDs
                                                anRequDatatypes,    // Requested datatyp
                                                anClientHandles, // Client handles
                                                anServerHandle, // Returned serv handles
                                                ahrErrors);     // Returnded item results
                if(SUCCEEDED(hr))
                hr = m_pOPCGroupMgt->ConnectCallback((CDataCallback*)this);
    Dann hab ich zum testen im DataChange an dieser Stelle:
    Code:
    for(UINT i=0; i < dwCount; i++)
        {
            // Get the ControlID for the item
            // Access with Client Handle
            DWORD dwControlID = m_aOPCItemMgt[aClientHandles[i]].ControlID;
                
            if(pErrors[i] == S_OK)
            {      
                // Get the requested data type
                VARTYPE vt = aValues[i].vt;
                
                if(vt == VT_BSTR)
                {
                    // Data Type is string -> Control is a text box
                    // Write value to the text box with the control ID from OPCItemMgt
                    if(aQualities[i] == OPC_QUALITY_GOOD)
    
                        SetDlgItemText(dwControlID,(CString)aValues[i].bstrVal);
                
                }
                else if(vt == VT_BOOL)
                {
                          CString strbla;
                            strbla.SetString("Läuft");
                            AfxMessageBox(strbla);  
                         ((CButton*)GetDlgItem(dwControlID))->SetCheck(aValues[i].boolVal);
                    // Invalidate the control to get a repaint
                    GetDlgItem(dwControlID)->Invalidate();
    
                }
    umgeändert, dass mir bei jeder Variablenänderung eine afxmessagebox ausgegeben wird. Leider funktioniert das immer noch nicht. Ich vermute mal, dass da irgendwo noch der Wurm in der Itemerstellung liegt. Ich verstehe halt nicht, wieso da so gar nichts passieren mag.
    Schönes Wochenend wünsch ich euch.
    gruß
    Michael

  9. #19
    Registriert seit
    27.10.2009
    Beiträge
    317
    Danke
    0
    Erhielt 64 Danke für 54 Beiträge

    Standard

    An der Stelle nach dem Anlegen des Items solltest du mal reindebuggen und dir anschauen ob das überhapt klappt.
    Code:
                // Add items to the group
                hr = m_pOPCGroupMgt->AddItems(  1,         // Item count 
                                                astrItems,               // ItemIDs
                                                anRequDatatypes,    // Requested datatyp
                                                anClientHandles, // Client handles
                                                anServerHandle, // Returned serv handles
                                                ahrErrors);     // Returnded item results
    
    if(SUCCEEDED(hr))
    hr = m_pOPCGroupMgt->ConnectCallback((CDataCallback*)this);
    selbst wenn der "hr" (vom AddItems) hier OK sein sollte, muss eigentlich auch noch der "ahrErrors" geprüft werden, auch hier könnte noch ein FehlerCode drin stehen.
    Nur wenn alles geklappt hat, kommt nachher auch ein Callback.
    Ich vermute das hier der "hr" schon einen Fehler gibt.

    Achso, und du solltest dich auch nicht auf den "OPC.SimaticNET.DP" sondern auf den "OPC.SimaticNET" verbinden (ProgID in der ServerDefines.h). Der Grund ist dass der "mit *.DP" ein sogenannter InprocServer ist, das ist zum Testen und Spielen eher ungünstig da immer nur ein Client verbunden sein kann (der Server ist eine DLL und wird in den Prozess des Client geladen, dass ist zwar sauschnell aber es kann sich immer nur ein Client verbinden). Der OutprocServer (ohne *.DP) ist auch noch schnell aber es können mehrere Clients verbunden sein und dann kannst du besser Spielen und mit dem OPCScout z.B. Werte schreiben und sehen ob bei dir was ankommt. Später wenn alles läuft, kannst du immer noch zurück auf den DLL-Server gehen, ist ja alles OPC und geht dann einfach, brauchst nur die ProgID zurückändern.

  10. #20
    bloodymichael ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.09.2010
    Beiträge
    21
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen!

    Hab mich heute wieder drangemacht und die Tipps von Dr. OPC berücksichtigt. Ich habe noch etwas nach dem folgenden Ausdruck beim Verbindungsaufruf
    Code:
    hr = m_OPCGroupMgt->ConnectCallback((CDataCallback*)this);
    folgendes hinzugefügt:
    Code:
    m_pOPCGroupMgt->SetActive(TRUE);
    Nach dem ich das getan hatte bekam ich nach einen diesen Fehler.
    Run-Time Check Failure #0 - The value of ESP was not
    properly saved across a function call. This is usually a
    result of calling a function declared with one calling
    convention with a function pointer declared with a
    different calling convention.
    Und das Programm bleibt in der STDMETHODIMP COPCDataCallback::OnDataChange(...) stehen. Und zwar genau an der stelle:
    hr = m_pDataCallback->DataChange(bla
    bla
    pErrors);
    Übergehe ich diesen fehler in dem ich auf "weiter" klicke, funktioniert das Programm und der Fehler taucht wieder auf, sobald ich ein TRUE am Eingang anliegen habe. Also reagiert es endlich. Nur nicht ganz so wie ich es will.
    Habt ihr ne Vermutung wo da der Fehler ist? Oder braucht ihr dazu mehr Code?
    gruß Michael

Ähnliche Themen

  1. Direkte Adresse aus dem FB benutzen
    Von Rici im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 21.10.2011, 07:07
  2. Direkte Flankenauswertung eines Eingangs
    Von Paule im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 11.10.2011, 00:12
  3. Antworten: 25
    Letzter Beitrag: 05.01.2011, 07:47
  4. Backupsoftware für direkte Datenübertragung
    Von Chriz im Forum PC- und Netzwerktechnik
    Antworten: 6
    Letzter Beitrag: 18.02.2007, 07:21
  5. direkte Adressierung in einer Multiinstanz
    Von psum im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.08.2006, 13:16

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •