Libnodave Baustein Zeitstempel ermittlen (.Block-> LastModified)

helem

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich beschäftige mich zur Zeit mit einem Tool für Softwarevergleiche und Versionskontrolle
verschiedener S7 Projekte. Ein Kriterium für die Vergleiche sind die Zeitstempel der Bausteine
mit letzten Codeänderung. Für das Zusammenstellen und Vergleichen der Bausteine
nutze ich die Libnodave und S7 DotNetToolbox. Leider bekomme ich beim Wert .LastModified mit
der GetBlock Funktion bei jeden Baustein den gleichen Zeitstempel (#12:00:00#) geliefert obwohl
im Simaticmanager ein anderes Datum angezeigt wird. Hat jemand eine Idee was ich vielleicht falsch
mache :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jochen,
habe es ausprobiert - funzt immer noch nicht. Ich habe mal
einen Auszug aus der Funktion beigefügt.

Der folgende Abschnitt liest das Datum zu ->weiter unten ist die Komplette Funktion

'------------------------------------------------------------------------------------------------
blkFld = tmp3 'S7 Bausteinordner
Blocks = blkFld.readPlcBlocksList 'liest alle Bausteine aus dem S7 Bausteinordner

Dim Test As Object '(Date)

For Each N In Blocks
BlockData = blkFld.GetBlock(N)

With BlockData
Test = .LastCodeChange
Test = .LastInterfaceChange
Test = .LastModified

End With
listBlockData.Add(BlockData)
Next N
'------------------------------------------------------------------------------------------------


Private Function GetFolderContent()

lblStep7ProjectFolder.Text = ""
blkFld = Nothing

If treeStep7Project.SelectedNode IsNot Nothing Then
'Ausgewählter Node in Typ ProjectFolder konvertieren
'Teil 1
'Class myTreeNode - enthält TreeNode und public myObject
'CType(treeStep7Project.SelectedNode, myTreeNode) gibt den ausgewählten Node als Objekt zurück
'
Dim tmp = CType(treeStep7Project.SelectedNode, myTreeNode)
Dim fld As ProjectFolder = CType((tmp).myObject, ProjectFolder)
Me.Text = "Step7 Projekt [" & fld.Project.ProjectFile & "] [" & fld.Project.ProjectDescription & "]"
lblStep7ProjectFolder.Text = "Step7 Projekt [" & fld.Project.ProjectFile & "] [" & fld.Project.ProjectDescription & "]"

'Dim tmp = CType(treeStep7Project.SelectedNode, myTreeNode)
If TypeOf tmp.myObject Is IBlocksFolder Then
blkFld = CType(tmp.myObject, IBlocksFolder)
End If

'Prüfe ob der alte ausgewählte Node nicht der neue Node ist
' If oldNode IsNot treeStep7Project.SelectedNode Then
Dim FT As Object = CType(tmp.myObject, Object).GetType

'Prüfe ob Bausteinordner ausgewählt wurde
Dim Ordner As String = ""
Ordner = UCase(FT.ToString)

If Ordner = UCase("DotNetSiemensPLCToolBoxLibrary.DataTypes.Projectfolders.Step7V5.S7ProgrammFolder") Then
'Wurde Verzeichnis Programmfolder gewählt, dann
'lies Symboltabelle, Bausteine und AWL-Quellenverzeichnis

'1. Symboltabelle übernehmen
Dim tmpSymb0 As S7ProgrammFolder = CType(tmp.myObject, S7ProgrammFolder)
Dim tmp2 As SymbolTable = CType(tmpSymb0.SymbolTable, SymbolTable)
dtaSymbolTable.Rows.Clear()
For Each step7SymbolTableEntry In tmp2.SymbolTableEntrys
dtaSymbolTable.Rows.Add(New Object() {step7SymbolTableEntry.Symbol, step7SymbolTableEntry.DataType, step7SymbolTableEntry.Operand, step7SymbolTableEntry.Comment})
Next step7SymbolTableEntry

'2. Bausteinliste übernehmen
Dim tmp3x As S7ProgrammFolder = CType(tmp.myObject, S7ProgrammFolder)
Dim tmp3 As BlocksOfflineFolder = CType(tmp3x.BlocksOfflineFolder, BlocksOfflineFolder)
Dim Blocks As List(Of DataTypes.Blocks.ProjectBlockInfo) 'Liste der Datenbausteine mit Datentyp Block ProjektBlockInfo
Dim BlockData As DataTypes.Blocks.Step7V5.S7Block 'Baustein Informationen
Dim listBlockData As New List(Of DataTypes.Blocks.Step7V5.S7Block) 'Liste Baustein Informationen
'------------------------------------------------------------------------------------------------
blkFld = tmp3 'S7 Bausteinordner
Blocks = blkFld.readPlcBlocksList 'liest alle Bausteine aus dem S7 Bausteinordner

Dim Test As Object '(Date)

For Each N In Blocks
BlockData = blkFld.GetBlock(N)

With BlockData
Test = .LastCodeChange
Test = .LastInterfaceChange
Test = .LastModified

End With
listBlockData.Add(BlockData)
Next N
'------------------------------------------------------------------------------------------------
Stop

For Each Info In listBlockData

Dim Symbol As String
Dim Datum As Object


Datum = Info.LastCodeChange
Symbol = String.Empty
Symbol = Info.Title

'Try
'Symbol = Info.SymbolTabelEntry.Symbol
'Catch e As Exception
'Symbol = e.ToString
'End Try

InfBausteine.Rows.Add(New Object() {Info.BlockName, Symbol, Datum})
Next Info

lstBoxBausteine.Items.AddRange(blkFld.readPlcBlocksList().ToArray()) 'Schreibt die ganze Baustein Liste in eine Listbox


'Bausteine zu Listbox hinzufügen
'3. AWL Quellen übernehmen
'Dim tmp4x As S7ProgrammFolder = CType(tmp.myObject, S7ProgrammFolder)
Dim tmp4x As Object = CType(tmp.myObject, Object)
'Dim tmp4 As SourceFolder = CType(tmp4x.SourceFolder, SourceFolder)
'src = CType(tmp4x, SourceFolder)
'lstBoxAWLBausteine.Items.Clear()
'lstBoxAWLBausteine.Items.AddRange(src.readPlcBlocksList().ToArray())
End If
'End If

'Prüfe ob das im Tree gespeicherte Objekt eine Symboltabelle ist
If tmp.myObject.GetType() Is GetType(SymbolTable) Then
'Gespeichertes Objekt ist eine Symboltabelle
Dim tmp2 = CType(tmp.myObject, SymbolTable)
lstBoxBausteine.Items.Clear()

dtaSymbolTable.Rows.Clear()

For Each step7SymbolTableEntry In tmp2.SymbolTableEntrys
dtaSymbolTable.Rows.Add(New Object() {step7SymbolTableEntry.Symbol, step7SymbolTableEntry.DataType, step7SymbolTableEntry.Operand, step7SymbolTableEntry.Comment})
Next step7SymbolTableEntry

lblToolStripFileSystemFolder.Text = tmp2.Folder

ElseIf blkFld IsNot Nothing Then
'Prüfe ob das Verzeichnis ein Bausteinverzeichnis vom Typ "IBlocksFolder" ist
'Prüfe ob der alte ausgewählte Node nicht der neue Node ist
If oldNode IsNot treeStep7Project.SelectedNode Then
If tmp.myObject.GetType() Is GetType(BlocksOfflineFolder) Then
'Lösche Inhalt der "viewBlockList"
lstBoxBausteine.Items.Clear()
'ProjectBlockInfo[] arr =
'NumericComparer nc = new NumericComparer();
'Array.Sort(arr, nc);
'Anzeige des gerade geöffneten Ordners im Statustrip
lblToolStripFileSystemFolder.Text = (CType(blkFld, BlocksOfflineFolder)).Folder
lstBoxBausteine.Items.AddRange(blkFld.readPlcBlocksList().ToArray())
'Anzeige Bausteinverzeichnis in "viewBlockList"
lstBoxBausteine.Visible = True
Else
'If tmp.myObject.GetType() Is GetType(SourceFolder) Then
'Prüfe ob das im Tree gespeicherte Objekt ein SourceFolder ist
'src = CType(tmp.myObject, SourceFolder)
'Prüfe ob der alte ausgewählte Node nicht der neue Node ist
'If oldNode IsNot treeStep7Project.SelectedNode Then
'Lösche Inhalt der "viewBlockList"
'lstBoxAWLBausteine.Items.Clear()
'lstBoxAWLBausteine.Items.AddRange(src.readPlcBlocksList().ToArray())
'End If
'Anzeige AWL Verzeichnis in "viewBlockList"
'lstBoxAWLBausteine.Visible = True

'Anzeige des gerade geöffneten Ordners im Statustrip
'lblToolStripFileSystemFolder.Text = src.Folder
'End If
End If
End If

Else
' Dim FldOjc As Object = tmp.myObject.GetType
' MsgBox("Type=" & tmp.myObject.GetType.ToString)
End If

End If

Return Nothing

End Function

Grüße Helem
 
Fixed...

Hat es für die Offline Blocks noch gar nicht implementiert (wurde nicht aus der DB gelesen!). Und auch bei den Online Blocks wars noch falsch. Nun gehts...
 
Hallo Jochen,
danke für das Bugfix. Aber leider
habe ich festgestellt, das GetBlock immer noch das Default
Datum zurückgibt. in der Funktion tmpBlock wird das Datum richtig convertiert und ausgegeben,
aber nicht an die public property.


Default.jpgReturn021.jpgReturn.jpg

Ich habe ein paar screenshots mit aktuellen Werten gemacht. Vielleicht kannt Du
dir das noch mal anschauen.
Gruße Helem
 
Zurück
Oben