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
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 |