Hallo
Ich habe zur Zeit ein Projekt zu vollenden und stecke in einer Sackgasse fest. die mir vorher noch nicht so untergekommen ist.
Grundlage des Projektes ist:
1. eine Anstuerung eines Messgeräts mit RS232
2. Ansteuerung einer SPS mit LPT1
die RS232-Kommunikation wurde in eine Unter-Klasse verlagert.
das ist der Datenempfang bei dem das Problem auftritt
Private Sub m_RS232_DataReceived(ByVal sender As Object, ByVal e As _
System.IO.Ports.SerialDataReceivedEventArgs) Handles m_RS232.DataReceived
SyncLock m_RS232
Dim Eingangspuffer As Byte() = Nothing
ReDim Eingangspuffer(m_RS232.BytesToRead) 'Puffer dimensionieren
m_RS232.Read(Eingangspuffer, 0, m_RS232.BytesToRead + 1)
RaiseEvent OnteilDatenstrom("RS232", Eingangspuffer)
End SyncLock
End Sub Hier startet das ganze:
#Region "Ladevorgang-Progammstart"
''' <summary>
''' Ermittlung der Kalibrierdaten des Digiforce, Kommunikation via RS232
' überprüfen, Voreinstellungen Zoombereich
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Me.Ionet1 = New IONET.IONET 'IONET.DLL - Kommunikation über LPT1
Ionet1.WriteAddress = &H378 'LPT1-Portadresse
Ionet1.WriteIO(0) 'setze alle Ausgänge auf Null
kommi.initialisieren_RS232(9600, 8, IO.Ports.Parity.None, _
IO.Ports.StopBits.One)
Dim i As Integer
Dim Datum(200) As Char
Dim Intervall(2) As Char
Dim NächsteDatum(10) As Char
i = 0
kommi.Senden(EOT & "01sr" & STX & "ir" & ETX) ' Hier
' startet der Fehler
If Puffer(0) = 6 Then
daten_warte.Reset()
kommi.Senden(EOT & "01po" & ENQ)
Array.Copy(Puffer_Char, Datum, Puffer_Char.Length)
Array.ConstrainedCopy(Datum, 1, Intervall, 0, 2)
Array.Clear(Datum, 0, 4)
RS232_Status.Text = "RS232-Status: online " 'Statusleiste
Do
If Datum(i) = S Then 'Leerzeichen durch Punkte ersetzen (für
' die Datumsangabe)
Datum(i) = CChar(".")
End If
i = i + 1
Loop Until (Datum(i) = ETX) 'Messwerte X zusammensetzen und
' umrechnen
Datumswert.Text = Convert.ToString(Datum)
Intervallwert.Text = Intervall
NächsteDatum = CType(Datum_Rechnung(Datum, Intervall), Char())
NächsteKalibrierung.Text = NächsteDatum
'Voreinstellungen-Zoonbereichs-Parameterübergabe
P1 = CDbl(Xmin.Text)
P2 = CDbl(Xmax.Text)
P3 = CDbl(Ymin.Text)
P4 = CDbl(Ymax.Text)
grafische_Darstellung(P1, P2, P3, P4)
Me.Enabled = True
Sensortyp.Enabled = False 'sperren der Programmoptionen
Messvorgang.Enabled = False
Schaltpunkt_1.Enabled = False
Schaltpunkt_2.Enabled = False
Zoombereich.Enabled = False
Einstellungen.Enabled = False
Schaltpunkte_senden.Enabled = False
Ende.Enabled = True
HAlt.Enabled = False
Start.Enabled = False
Quittierung.Enabled = False
Speichern.Enabled = True
Timer_Progressbar.Start() 'Erfassung von Ausgang 3
Else
MessageBox.Show("Digiforce 9306 antwortet nicht,Bitte überprüfen" & _
"Sie ihre Einstellungen und wiederholen Sie diesen Vorgang", _
"Fehler", MessageBoxButtons.OK)
End If
End Sub
#End Region An der Hervorgehobenen Stelle beginnt das Verhalten, welches ich abstellen möchte und zwar werden nach dem senden des Befehlscodes für das Messgerät der Code für die Datenerfassung und der Main Code parallel fortgeführt,
doch es soll an dieser Stelle erst auf das vollständige ausführen der Datenerfassung gewartet werden.
Ich habe dies schon mit threading.thread.sleep versucht, dies ist nicht möglich damit, aus dem Grund da es mir nicht im Programmcode verlaubt wurde, weil verschiedene Rechensysteme angeschlossen werden.
Ich habe es deshalb auch mir Eventwaithandler versucht, auch das gab es mehr schlecht als rechte Ergebnisse.
Wenn der vollständige Code benötigt wird, bitte ich dies per PM anzufragen, da dieser, wie die Aufgabenstellung verdeutlicht etwas umfangreicher ist.
Ich hoffe mir kann jemand weiterhelfen, danke im Vorraus.
mfg impy |