[VB.net] Datagridview met structbindingsource niet editable

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor mij stage moet ik een .NET applicatie in VB schrijven die kan babbelen met een PLC (soort van industriele PC ;) ) via het ADS protocol.
Op zich is dit relatief simpel, alleen moeten er nogal vrij veel parameters uitgelezen/geschreven worden en zitten er enkele nogal 'uitgebreide' tabellen in de PLC.

Om het geheel dus doenbaar en overzichtelijk te houden heeft de PLC programmeur in VB al enkele structs geschreven die 1op1 gelijk zijn aan de structs in de PLC.
De gehele communicatie en de structs werken, alleen krijgen we de tabellen niet aan de praat :(
(er zitten wel structs-in-structs in, maar dat maakt niks uit)

Het hele zootje uitlezen op de PLC en weergeven in de tabbelen op de VB applicatie gaat, maar we kunnen de tabellen in géén geval aanpassen, wat wél zou moeten... :(
Als we de waarde in de tabel aanpassen, dan blijft deze op de originele waarde staan, tijdens de debug krijgen we de ingevoerde waarde ook niet te zien in het register.
(het ligt niet aan de PLC, want we zijn de tabellen aan het testen zonder communicatie met de PLC, alles gebeurd dus op de PC zelf)

Heeft er iemand enig idee hoe we dit kunnen oplossen?

hieronder enkele code-snippets :)
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 Imports TwinCAT.Ads
Imports System.Runtime.InteropServices
    Public Class Form1
        <StructLayout(LayoutKind.Sequential, Pack:=1)> _
        Public Structure STRUCT_StationData

            <MarshalAs(UnmanagedType.I1)> _
            Public bEnabled As Boolean

            'Status-variables*)
            Public Status As Integer

            'Station-parameters*)
            <MarshalAs(UnmanagedType.ByValArray, SizeConst:=60)> _
            Public sParams() As STRUCT_Params 'This array contains all the parameters of the station*)

            '***********************************
            'Definieren van de properties
            '***********************************
            Public Property pEnabled() As Boolean
                Get
                    Return bEnabled
                End Get
                Set(ByVal value As Boolean)
                    bEnabled = value
                End Set
            End Property
            Public Property pStatus() As Integer
                Get
                    Return Status
                End Get
                Set(ByVal value As Integer)
                    Status = value
                End Set
            End Property

        End Structure
        <StructLayout(LayoutKind.Sequential, Pack:=0)> _
        Public Structure STRUCT_Params
            Public Params As Single 'This array contains all the parameters of the station*)
            Public Property pParams() As Single
                Get
                    Return Params
                End Get
                Set(ByVal value As Single)
                    Params = value
                End Set
            End Property
        End Structure



 Dim tcClient As New TcAdsClient
    Dim hVar, hVarWrite As Integer
    Dim iAantalStations As Short
    Dim cManager As CurrencyManager
    Dim StationData As STRUCT_StationData
    Dim localStationDataSlotData As New BindingSource
    Dim sVarName As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            tcClient.Connect("10.108.103.53.1.1", 801)

            'tcClient.Connect("5.3.218.40.1.1", 801)
            sVarName = ".Max_Station_Quantity"
            hVar = tcClient.CreateVariableHandle(sVarName)
            iAantalStations = tcClient.ReadAny(hVar, GetType(Short))
            

            sVarName = ".Station_Data[" & cmbStationID.Text & "]"
            hVar = tcClient.CreateVariableHandle(sVarName)
            StationData = tcClient.ReadAny(hVar, GetType(STRUCT_StationData))

            cManager = CType(BindingContext(dgvParameters.DataSource), CurrencyManager)
            'AddHandler cManager.PositionChanged, AddressOf cManager_PositionChanged

            Me.STRUCTStationDataBindingSource.DataSource = StationData
            Me.STRUCTParamsBindingSource.DataSource = StationData.sParams

            localStationDataSlotData.DataSource = StationData.Slot_Data

            'tmrUpdate.Enabled = True
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

 Private Sub dgvParameters_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvParameters.CellEndEdit
        Try
            StationData.sParams(cManager.Position).Params = CSng(dgvParameters.Item(e.ColumnIndex, e.RowIndex).Value)
            sVarName = ".Station_Data[" & cmbStationID.Text & "].Params[" & cManager.Position + 1 & "]"
            hVarWrite = tcClient.CreateVariableHandle(sVarName)
            tcClient.WriteAny(hVarWrite, StationData.sParams(cManager.Position).Params)
            tcClient.DeleteVariableHandle(hVarWrite)
            'tmrUpdate.Enabled = True

        Catch ex As Exception

        End Try

    End Sub

Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 23-07 12:48

Armageddon_2k

Trotse eigenaar: Yamaha R6

Gezien het heen/weer schrijven naar je Ads wel gewoon werkt, ga ik ervanuit dat je connection deel ed. allemaal in orde zijn.
Je zal dus het deel wat ik onderin deze post heb staan moeten gaan debuggen.

Vragen:
Kan je de tabelwaarden wel benaderen als je een rechtstreekse koppeling hiermee maakt (dus niet via een datagrid).
Wordt je CellEndEdit event afgetrapt?
Wat voor waarde komt er terecht in je sVarName?

Je zou namelijk altijd je Ads value moeten kunnen benaderen via je "gebruikelijke" oplossing.
Kan je eventueel de opbouw van je TwinCat tabel posten?

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 

 Private Sub dgvParameters_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvParameters.CellEndEdit
        Try
            StationData.sParams(cManager.Position).Params = CSng(dgvParameters.Item(e.ColumnIndex, e.RowIndex).Value)
            sVarName = ".Station_Data[" & cmbStationID.Text & "].Params[" & cManager.Position + 1 & "]"
            hVarWrite = tcClient.CreateVariableHandle(sVarName)
            tcClient.WriteAny(hVarWrite, StationData.sParams(cManager.Position).Params)
            tcClient.DeleteVariableHandle(hVarWrite)
            'tmrUpdate.Enabled = True

        Catch ex As Exception

        End Try

    End Sub

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wij zijn intussen ook al een stap verder geraakt.
Ik vermoed wel dat dit een omweg is.
Het volgende heb ik opgemerkt:
Voordat er in de event CellEndEdit wordt gesprongen, worden eerst de properties doorlopen.
Zo wordt ook de property van de params doorlopen:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
        <StructLayout(LayoutKind.Sequential, Pack:=0)> _
        Public Structure STRUCT_Params
            Public Params As Single 'This array contains all the parameters of the station*)
            Public Property pParams() As Single
                Get
                    Return Params
                End Get
                Set(ByVal value As Single)
                    Params = value
                End Set
            End Property
        End Structure 

Hier zien we dat de variabele "value" de nieuwe waarde bevat.
Dus als er voorbij de regel "Params = value" wordt gesprongen zou je verwachten dat de parameter-waarde werd aangepast. Vervolgens wordt er naar de event CellEndEdit gesprongen.
Als hij hierin zit is de waarde van die parameter nog steeds de oude waarde.
Ik heb nu om te testen een extra variabele gemaakt namelijk:
dim ChangedSingle as single
Deze gebruik ik nu in mijn property als volgt:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
  <StructLayout(LayoutKind.Sequential, Pack:=0)> _
        Public Structure STRUCT_Params
            Public Params As Single 'This array contains all the parameters of the station*)
            Public Property pParams() As Single
                Get
                    Return Params
                End Get
                Set(ByVal value As Single)
                    Form1.ChangedSingle = value
                    Params = value
                End Set
            End Property
        End Structure 

Deze variabele gebruik ik nu in mijn CellEndEdit-event om de parameter te overschrijven.
Dit werkt wel.

Wat doen we dus nog fout?