Hi Leute,
mit ach und krach habe ich es geschafft (dank VB-Paradise und Co.) halbwegs Multithreading zu verstehen.
Auch ein Testprojekt auf die Beine gestellt.
Nun was funktioniert ist:
Mit dem Designer Ovalshapes gezeichnet und benannt.
Diese sammele ich in
Die kann ich auch manipuieren, wei Backgroundcolor etc...
Kurzer Code Einsicht:
Das funktioniert auch einwandfrei. Desweiteren gibt es noch einen Thread für die Ausgänge, einen Thread für DB1 und einen Thread für DB2...
Nun in meinem Hauptprojekt weiß ich nicht welche und wieviele Eingänge ich abfrage muss, deshalb erzeuge ich zur Laufzeit anhand einer DataSet die Eingänge (allerding als Panels nicht mit Ovalshape), d.H. *.xml -> DataSet -> Eingänge Info
Die zur Laufzeit erzeugten Panels werden auf/in einer PictureBox gezeichnet. Die Zustände der Panels (also eig. nur BackGroundImage) sollen sich ändern,
d.H. SPS Eingang 0.0 = 1 -> Panel E0.0 = BackGroundImage (SensorEin.jpg (grün)) ansonsten wenn SPS Eingang 0.0 = 0 -> Panel E0.0 = BackGroundImage (SensorAus.jpg (gelb)) SensorEin und SensorAus sind selbst gezeichnete .jpg's...
Ich habe es schonmal hinbekommen, dass die Panels in einem extra Thread gezeichnet werden, aber sobald ich dann in der nächsten Sub die SPS-Verbindung aufbauen will um den Status(BackGroundImage) der Panels anzupassen hängt das Programm sich auf OHNE Fehlermeldung auf. Dann kann ich nur noch über "strg" + "alt" + "entf" -> Taskmanager abbrechen.
Hier mal ein Teil vom Code:
Vom Prinzip ist das ja das selbe wie das Testprojekt was bereit läuft, nur der Unterschied ist das die Panels zur Laufzeit erzeugt werden.
Was mach ich falsch oder was berücksichtige ich nicht?
Danke vorab für eure Antworten / Hilfe
MfG
newbie
mit ach und krach habe ich es geschafft (dank VB-Paradise und Co.) halbwegs Multithreading zu verstehen.
Auch ein Testprojekt auf die Beine gestellt.
Nun was funktioniert ist:
Mit dem Designer Ovalshapes gezeichnet und benannt.
Diese sammele ich in
List(Of Ovalshape)
, je in einem eigenen Thread.Die kann ich auch manipuieren, wei Backgroundcolor etc...
Kurzer Code Einsicht:
VB.NET-Quellcode
- Imports Microsoft.VisualBasic.PowerPacks
- Public Class frmSPS
- Dim osInputs As List(Of OvalShape)
- Dim SPS_IP As String = "192.168.1.100"
- Dim SPS_Link_Inputs As clsLibNoDave 'LibNoDave eine .dll zum Verbindungsaufbau zur einer SPS
- Dim Inputs_Thread As System.Threading.Thread
- Private Sub frmSPS_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Control.CheckForIllegalCrossThreadCalls = False
- Inputs_Thread = New System.Threading.Thread(AddressOf InputsList)
- Inputs_Thread.Start()
- End Sub
- Public Sub InputsList()
- osInputs = New List(Of OvalShape)
- osInputs.AddRange({OS_E00, OS_E01, OS_E02, OS_E03, OS_E04, OS_E05, OS_E06, OS_E07})
- osInputs.AddRange({OS_E10, OS_E11, OS_E12, OS_E13, OS_E14, OS_E15, OS_E16, OS_E17})
- osInputs.AddRange({OS_E20, OS_E21, OS_E22, OS_E23, OS_E24, OS_E25, OS_E26, OS_E27})
- osInputs.AddRange({OS_E30, OS_E31, OS_E32, OS_E33, OS_E34, OS_E35, OS_E36, OS_E37})
- osInputs.AddRange({OS_E40, OS_E41, OS_E42, OS_E43, OS_E44, OS_E45, OS_E46, OS_E47})
- osInputs.AddRange({OS_E50, OS_E51, OS_E52, OS_E53, OS_E54, OS_E55, OS_E56, OS_E57})
- osInputs.AddRange({OS_E60, OS_E61, OS_E62, OS_E63, OS_E64, OS_E65, OS_E66, OS_E67})
- osInputs.AddRange({OS_E70, OS_E71, OS_E72, OS_E73, OS_E74, OS_E75, OS_E76, OS_E77})
- osInputs.AddRange({OS_E80, OS_E81, OS_E82, OS_E83, OS_E84, OS_E85, OS_E86, OS_E87})
- osInputs.AddRange({OS_E90, OS_E91, OS_E92, OS_E93, OS_E94, OS_E95, OS_E96, OS_E97})
- SPS_Inputs()
- End Sub
- Public Sub SPS_Inputs()
- SPS_Connection_Inputs()
- Do
- Dim i = 0
- Dim bit(7) As Boolean
- For iByte As Integer = 0 To 9 'Eingangsbytes 0 - 9
- SPS_Link_Inputs.EB(iByte, bit)
- For iBit As Integer = 0 To 7
- If bit(iBit) Then
- osInputs(i).FillColor = Color.LimeGreen
- Else
- osInputs(i).FillColor = Color.WhiteSmoke
- End If
- i += 1
- Next
- Next
- Loop
- End Sub
- Private Sub SPS_Connection_Inputs()
- SPS_Link_Inputs = New clsLibNoDave
- SPS_Link_Inputs.Connect(SPS_IP)
- End Sub
Das funktioniert auch einwandfrei. Desweiteren gibt es noch einen Thread für die Ausgänge, einen Thread für DB1 und einen Thread für DB2...
Nun in meinem Hauptprojekt weiß ich nicht welche und wieviele Eingänge ich abfrage muss, deshalb erzeuge ich zur Laufzeit anhand einer DataSet die Eingänge (allerding als Panels nicht mit Ovalshape), d.H. *.xml -> DataSet -> Eingänge Info
Die zur Laufzeit erzeugten Panels werden auf/in einer PictureBox gezeichnet. Die Zustände der Panels (also eig. nur BackGroundImage) sollen sich ändern,
d.H. SPS Eingang 0.0 = 1 -> Panel E0.0 = BackGroundImage (SensorEin.jpg (grün)) ansonsten wenn SPS Eingang 0.0 = 0 -> Panel E0.0 = BackGroundImage (SensorAus.jpg (gelb)) SensorEin und SensorAus sind selbst gezeichnete .jpg's...
Ich habe es schonmal hinbekommen, dass die Panels in einem extra Thread gezeichnet werden, aber sobald ich dann in der nächsten Sub die SPS-Verbindung aufbauen will um den Status(BackGroundImage) der Panels anzupassen hängt das Programm sich auf OHNE Fehlermeldung auf. Dann kann ich nur noch über "strg" + "alt" + "entf" -> Taskmanager abbrechen.
Hier mal ein Teil vom Code:
VB.NET-Quellcode
- Delegate Sub PicMV_Load([picmv] As String)
- Dim SPS_Link_Inputs As clsLibNoDave
- Private Sub frmMain_Load(sender As Object, e As System.EventArgs) Handles Me.Load
- Me.Inputs_Thread = New Threading.Thread(New ThreadStart(AddressOf Me.InputsList))
- Me.Inputs_Thread.Start()
- End Sub
- Private Sub InputsList()
- Me.LoadXML(MVPic)
- End Sub
- Public Sub LoadXML(ByVal [picmv] As String)
- If Me.PicMV.InvokeRequired Then
- Dim d As New PicMV_Load(AddressOf LoadXML)
- Me.Invoke(d, New Object() {[picmv]})
- Else
- Sensor_DataSet.Sensor_Table.Clear()
- Me.Sensor_DataSet.ReadXml(DataFile)
- Me.PicMV.Image = System.Drawing.Image.FromFile([picmv])
- Me.PicMV.Refresh()
- For Each row In Sensor_DataSet.Sensor_Table
- Dim newSensor As New Panel
- Dim loc, locProzet As Point
- locProzet.X = CInt(100 / CDbl(row.P_Width) * CDbl(row.Left)) ' Diese Berechnungen sind nur dafür da,
- locProzet.Y = CInt(100 / CDbl(row.P_Height) * CDbl(row.Top)) ' weil die vorher erzeugte .xml Datei in einer anderen Auflösung erzeugt wird
- loc.X = CInt((Me.PicMV.Width / 100 * locProzet.X) + (SensGr / 2)) ' Die PictureBox ist wesentlich kleiner hier
- loc.Y = CInt((Me.PicMV.Height / 100 * locProzet.Y) + (SensGr / 2)) ' Koordinaten werden wieder in Pixel umgerechnet.
- newSensor = newpanel.CreatePanel(SensGr, Me.PicMV.PointToScreen(Me.PicMV.PointToClient(loc)), SensorAus) 'CreatePanel Klasse (unwichtig)
- newSensor.Tag = row.Inv
- newSensor.Name = row.BMK
- Me.PicMV.Controls.Add(newSensor)
- newSensor.BringToFront()
- AddHandler newSensor.Paint, AddressOf newSensor_paint
- Next
- SPS_Inputs()
- End If
- End Sub
- Public Sub SPS_Inputs()
- SPS_Connection_Inputs()
- Do
- Dim EB As String
- For Each Sens As Panel In PicMV.Controls()
- EB = Strings.Mid(Sens.Name, 2)
- Dim SPS_Port() = Split(EB, ".")
- Dim Invert = CType(Sens.Tag, Boolean)
- If SPS_Link_Inputs.Eingang(CInt(SPS_Port(0)), CInt(SPS_Port(1))) Then
- If Invert Then
- Sens.BackgroundImage = SensorAus
- Else
- Sens.BackgroundImage = SensorEin
- End If
- Else
- If Invert Then
- Sens.BackgroundImage = SensorEin
- Else
- Sens.BackgroundImage = SensorAus
- End If
- End If
- Next
- Loop
- End Sub
- Public Sub SPS_Connection_Inputs()
- SPS_Link_Inputs = New clsLibNoDave
- SPS_Link_Inputs.Connect(SPS_IP)
- End Sub
Vom Prinzip ist das ja das selbe wie das Testprojekt was bereit läuft, nur der Unterschied ist das die Panels zur Laufzeit erzeugt werden.
Was mach ich falsch oder was berücksichtige ich nicht?
Danke vorab für eure Antworten / Hilfe
MfG
newbie