TwinCat und die ADS-OCX

Majestic_1987

Level-1
Beiträge
270
Reaktionspunkte
22
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute.

Nachdem ich mich nun mal ein wenig in VB2008 eingearbeitet habe möchte ich eine Visualisierung für ein SPS-Programm schreiben.

Toll: Die ADS-OCX ist in Twincat ja schon integriert.

Nicht Toll: Offenbar ist das Information-System hier komplett veraltet.

Aber von vorne.
Synchrones Lesen aus der SPS habe ich halbwegs hinbekommen. Aber jetzt möchte ich ereignisgesteuert Lesen, wenn sich ein Wert in der SPS ändert.

Info-Sys sagt dazu beim Aufruf der AdsReadVarConnectEx:
Code:
AdsOcx1.AdsReadVarConnectEx(".PLCVarBoolean", ADSTRANS_SERVERONCHA, 100, hConnect(0), lblBoolean)
Wobei, laut dieser Definition:
1. Parameter = Variablenname als String (OK)
2. Parameter = Art des Datenaustauschs (auch OK)
3. Parameter = Lesezyklus in ms (soweit klar)
4. Parameter = Eindeutiger Handle für die Verbindung (auch klar, dazu hab ich dann ein Array)

der 5. Parameter ist Optional und stellt einen Übergabewert an die bei Änderung aufgerufene Methode AdsReadConnectUpdateEx dar.

Soweit, so gut. ABER wenn ich die Methode AdsReadVarConnectEx() aufrufe sagt mir Intellisense:
1. Parameter: Variablenname als String
2. Parameter: cbLength as Integer (???????)
3. Parameter: Art des Datenaustauschs
4. Parameter: Lesezyklus in ms
5. Parameter: var as Object

SO! Wo ist jetzt mein Handle hin? Im Beispiel oben ist das ja hConnect(0)...und jetzt kann ich es hier nirgendwo mehr eintragen.
Und was gehört in die cbLength? und ist "var as object" mein übergabewert, an welchem ist festmache welches Objekt meine UpdateEx-Methode anfasst?

Vielleicht ist hier ein schlauer Kopf, der mir hier weiterhelfen kann, ich werde nicht schlau daraus..erst recht nicht daraus, dass es hier offenbar 2 verschiedene Varianten gibt..die reale und die aus dem Info-Sys.

Ach ja: Returncode der ConnectEx() ist 1857 -> invalid parameter at service
Vielleicht sagt das ja jemandem hier mehr, als mir. Dass mit den Parametern was nicht stimmt war mir ja auch schon fast klar ;-)

Danke im Voraus.
 
Zuletzt bearbeitet:
Keine echte Hilfe, aber

Vielleicht kann ich dennoch helfen.

Intellisense bietet, wenn mehrere Möglichkeiten bestehen, eigentlich diese auch an. Siehe Bildchen



Kann man mal die Programmschnipsel und die OCX und alles, was dazu gehört, mal als eMail haben (Adresse per PN).

Das as object bedeutet hier, dass dieser Parameter "generisch" ist, man kann ihm alles unterschieben, was auf der basis class object basiert (d.h. in .NET u.a. alle Werte).
 

Anhänge

  • sps.JPG
    sps.JPG
    8,5 KB · Aufrufe: 36
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay. Aus irgendeinem Grund hatte er bei mir die Methode AdsReadVarConnect() verwendet, diese hat eine andere Parameterstruktur als die AdsReadVarConnectEx(). Selbige stimmt jetzt mit den Parametern im InfoSys überein.

mein Code schaut wie folgt:
Code:
Public Class Form1

    Dim hConnect(0 To 1) As Long
    Dim nErr As Long

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        nErr = AdsOcx1.AdsReadVarConnectEx(".SW1_HMI", ADSOCXLib.ADSOCXTRANSMODE.ADSTRANS_SERVERONCHA, 100, hConnect(0), lblSwitch)
        If (nErr > 0) Then Call MsgBox("Error AdsReadVarConnectEx -> .SW1_HMI: " & nErr)

    End Sub

    Private Sub AdsOcx1_AdsReadConnectUpdateEx(ByVal dateTime As Date, ByVal nMs As Long, ByVal hConnect As Long, ByVal data As Object, ByVal hUser As Object)

        hUser.Text = ("Date Time: " & dateTime & "," & nMs & "  Data: " & data)

    End Sub


    Private Sub Form1_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Leave

        Dim nIndex As Long
        For nIndex = 0 To 1
            Call AdsOcx1.AdsDisconnectEx(hConnect(nIndex))
        Next

    End Sub

    Private Sub cmdSettings_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSettings.Click

        AdsOcx1.ShowPropertyPages()

    End Sub

End Class
Die Funktionalität ist jetzt zumindest soweit gegeben, dass die AdsReadVarConnectEx Methode fehlerfrei funktioniert, ich bekomme also nciht mehr den beschriebenen Parameter-Fehler. Darüber hinaus habe ich die AdsOcx-Properties integriert. Wenn mein Programm in Betrieb ist kann ich also den Status des ADS-Servers sehen. Wenn ich TwinCat von Run auf Stop schalte ändert sich dort der Status, die Verbindung steht also.

Diese Methode sollte dann, laut Info-Sys, die AdsReadConnectUpdateEx() aufrufen, sobald sich die referenzierte Variable (.SW1_HMI) verändert hat.

Das hUser.Text steht in der Info-Sys Version als hUser.Caption, da die Beispiele dort aus VB6 stammen. Ich konnte herausfinden, dass da statt Caption nun Text hingehört ( VB2008 )

Allerdings kann ich in der SPS den Wert der Variablen ändern, wie ich will, es tut sich an meinem Label (lblSwitch) garnix.
 
Zuletzt bearbeitet:
Habe das Problem mittlerweile gelöst. Die ADS-OCX funktioniert nicht in Visual Basic 2008.NET.

Da ist dann die .Net-Komponente von Nöten.
 
Zurück
Oben