Ampelschaltung mit Visual Basic

Guten Tag,

ich habe mir das Experimentierset: „Experimente mit USB“ des Franzis-Verlages gekauft- bin aber noch völliger Elektronik-Laie. Die ersten Experimente mit LED an/aus habe ich alle hinbekommen, wo es nun aber ans programmieren mit Visual Basic geht komme ich leider nicht weiter- ab da nämlich, wo es um das programmieren der Ampelschaltung geht. Da ich auch keinerlei Ahnung von VB-Script habe, schickte ich dem Autor eine Mail mit der Anfrage wie ich das denn machen soll da in der Anleitung dieser Teil wohl absichtlich ausgelassen wurde (man soll selbst draufkommen).
Er schrieb mir zurück ich solle die Codezeilen der Softwareampel (im Besipiel 8) mit dem Code des Eperimentes indem man eine LED über den TXT-Kanal ansteuert (Beispiel 6) zusammennehmen, einzelne Befehle aus der Tabelle der Anleitung nehmen und dazwischen einen Sleep-Befehl setzen- nur weiß ich nicht wo ich was einfügen soll. An welche Stelle im VB-Script kommt denn ein Timer und wo die einzelnen Befehle zur Steuerung der LEDS?

Dies sind die Befehle die ich einsetzen soll:

1 (gelbe und grüne LED aus)
rote LED an
FT_ClrRts
FT_ClrDtr
FT_SetBreakOn
2 gelbe LED zuschalten FT_SetRts
3 rote und gelbe LED aus- und grüne
LED einschalten
FT_ClrRts
FT_SetBreakoff
FT_SetDtr
4 grüne LED aus- und gelbe LED
einschalten
FT_ClrDtr
FT_SetRts
1 Gelbe LED aus- und rote LED
einschalten
FT_ClrRts
FT_SetBreakOn

Aber wie formuliert man FT_XYZ innerhalb des Codes und an welcher Stelle?

Vielleicht kennt jemand von Euch das Lernpaket und weiß was ich meine.

Lieber Gruß und vielen Dank.

Hallo,

vorweg, ich kenne den Bausatz, den Du da hast nicht.
Wenn ich Dir helfen kann, dann nur mit ein paar Kleinigkeiten in VBS.
Einen brauchbaren Code kann ich Dir deshalb nur schreiben, wenn Du mir alles das über Deinen bausatz erzählst, was ich dafür wissen muss.

ich habe mir das Experimentierset: „Experimente mit USB“ des
Franzis-Verlages gekauft- bin aber noch völliger
Elektronik-Laie. Die ersten Experimente mit LED an/aus habe
ich alle hinbekommen

Das ist toll! Kannst Du kurz erzählen wie? Hat das auch schon mit VBS funktioniert?

1 (gelbe und grüne LED aus)
rote LED an
FT_ClrRts
FT_ClrDtr
FT_SetBreakOn

Dann schreib mal im Editor nur:

FT\_ClrRts
FT\_ClrDtr
FT\_SetBreakOn

Speichere das als ‚Rot.vbs‘ und klicke das doppelt an.
Geht dann die rote LED an?

Wenn das so funktioniert, muss ich nicht unbedingt verstehen warum, dann kann ich sicher weiterhelfen. Wenn das so nicht funktioniert, dann fehlen Informationen, dann müssen wir da erst hin kommen.

Gruß Rainer

Hallo Rainer, vielen Dank für Deine schnelle Antwort.
Ich poste hier mal die Scripte:

Script 1 ist das Beispiel für LED an /aus das ich umschreiben soll, bzw. in das ich die einzelnen Befehle einsetzen soll.

Hier also Script 1
___________________________________________________________

  1. Teil Beispiel (Bsp.frm)

’ Private Declare Sub Sleep Lib „kernel32“ (ByVal dwMilliseconds As Long)

Dim lngNumDevices As Long

Dim strSerienNummer As String * 16
Dim strBeschreibung As String * 256

Private Sub CbTxD_Click()

On Error GoTo CbTxD_Click_fehler

’ Anzeige bereinigen
LoggerList.Clear

’ Anzahl angeschlossener USB Geräte

If FT_GetNumDevices(lngNumDevices, vbNullString, FT_LIST_BY_NUMBER_ONLY) FT_OK Then
LoggerList.AddItem („Fehler bei Aufruf: FT_GetNumDevices funktionierte nicht“)
Exit Sub
Else
LoggerList.AddItem ("Anzahl vorhandener USB Geräte: " & lngNumDevices)
End If

strBeschreibung = Trim(Me.DeviceName.Text) & Chr(0)

If FT_OpenEx(strBeschreibung, FT_OPEN_BY_DESCRIPTION, lngHandle) FT_OK Then
LoggerList.AddItem „Fehler bei Aufruf: FT_OpenEx“
Exit Sub
Else
LoggerList.AddItem „----“
End If

If Me.CbTxD.Value Then
If FT_SetBreakOn(lngHandle) = FT_OK Then
LoggerList.AddItem „Break ON - LED an?“
End If
Else
If FT_SetBreakOff(lngHandle) = FT_OK Then
LoggerList.AddItem „Break OFF“
End If
End If

If FT_Close(lngHandle) FT_OK Then
LoggerList.AddItem „Fehler bei Aufruf: FT_Close“
Exit Sub
Else
LoggerList.AddItem „----“
End If

CbTxD_Click_fehler_ende:
Exit Sub

CbTxD_Click_fehler:
MsgBox Err.Description
Resume CbTxD_Click_fehler_ende
End Sub

Private Sub DeviceName_Change()

End Sub

Private Sub Form_Load()

End Sub

Private Sub Label2_Click()

End Sub

_____________________________________________________

  1. Teil Beispiel (Module.bas)

Option Explicit
'====================================
'INTERFACE DEKlarationen für FTDI DLL
'====================================
Public Declare Function FT_ListDevices Lib „FTD2XX.DLL“ ( _
ByVal arg1 As Long, _
ByVal arg2 As String, _
ByVal dwFlags As Long) As Long

Public Declare Function FT_GetNumDevices Lib „FTD2XX.DLL“ Alias „FT_ListDevices“ ( _
ByRef arg1 As Long, _
ByVal arg2 As String, _
ByVal dwFlags As Long) As Long

Public Declare Function FT_Open Lib „FTD2XX.DLL“ ( _
ByVal intDeviceNumber As Integer, _
ByRef lngHandle As Long) As Long

Public Declare Function FT_OpenEx Lib „FTD2XX.DLL“ ( _
ByVal arg1 As String, _
ByVal arg2 As Long, _
ByRef lngHandle As Long) As Long

Public Declare Function FT_Close Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long) As Long

Public Declare Function FT_Read Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal lpszBuffer As String, _
ByVal lngBufferSize As Long, _
ByRef lngBytesReturned As Long) As Long

Public Declare Function FT_Write Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal lpszBuffer As String, _
ByVal lngBufferSize As Long, _
ByRef lngBytesWritten As Long) As Long

Public Declare Function FT_WriteByte Lib „FTD2XX.DLL“ Alias „FT_Write“ ( _
ByVal lngHandle As Long, _
ByRef lpszBuffer As Any, _
ByVal lngBufferSize As Long, _
ByRef lngBytesWritten As Long) As Long

Public Declare Function FT_SetBaudRate Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal lngBaudRate As Long) As Long

Public Declare Function FT_SetDataCharacteristics Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal byWordLength As Byte, _
ByVal byStopBits As Byte, _
ByVal byParity As Byte) As Long

Public Declare Function FT_SetFlowControl Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal intFlowControl As Integer, _
ByVal byXonChar As Byte, _
ByVal byXoffChar As Byte) As Long

Public Declare Function FT_SetDtr Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long) As Long

Public Declare Function FT_ClrDtr Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long) As Long

Public Declare Function FT_SetRts Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long) As Long

Public Declare Function FT_ClrRts Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long) As Long

Public Declare Function FT_GetModemStatus Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByRef lngModemStatus As Long) As Long

Public Declare Function FT_SetChars Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal byEventChar As Byte, _
ByVal byEventCharEnabled As Byte, _
ByVal byErrorChar As Byte, _
ByVal byErrorCharEnabled As Byte) As Long

Public Declare Function FT_Purge Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal lngMask As Long) As Long

Public Declare Function FT_SetTimeouts Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal lngReadTimeout As Long, _
ByVal lngWriteTimeout As Long) As Long

Public Declare Function FT_GetQueueStatus Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByRef lngRxBytes As Long) As Long

Public Declare Function FT_SetBreakOn Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long) As Long

Public Declare Function FT_SetBreakOff Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long) As Long

Public Declare Function FT_GetStatus Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByRef lngRxBytes As Long, _
ByRef lngTxBytes As Long, _
ByRef lngEventsDWord As Long) As Long

Public Declare Function FT_SetEventNotification Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal dwEventMask As Long, _
ByVal pVoid As Long) As Long

Public Declare Function FT_ResetDevice Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long) As Long

Public Declare Function FT_GetBitMode Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByRef intData As Any) As Long

Public Declare Function FT_SetBitMode Lib „FTD2XX.DLL“ ( _
ByVal lngHandle As Long, _
ByVal intMask As Byte, _
ByVal intMode As Byte) As Long

Public Declare Function FT_SetLatencyTimer Lib „FTD2XX.DLL“ ( _
ByVal Handle As Long, _
ByVal pucTimer As Byte) As Long

Public Declare Function FT_GetLatencyTimer Lib „FTD2XX.DLL“ ( _
ByVal Handle As Long, _
ByRef ucTimer As Long) As Long

’ Return codes
Public Const FT_OK = 0
Public Const FT_INVALID_HANDLE = 1
Public Const FT_DEVICE_NOT_FOUND = 2
Public Const FT_DEVICE_NOT_OPENED = 3
Public Const FT_IO_ERROR = 4
Public Const FT_INSUFFICIENT_RESOURCES = 5
Public Const FT_INVALID_PARAMETER = 6
Public Const FT_INVALID_BAUD_RATE = 7
Public Const FT_DEVICE_NOT_OPENED_FOR_ERASE = 8
Public Const FT_DEVICE_NOT_OPENED_FOR_WRITE = 9
Public Const FT_FAILED_TO_WRITE_DEVICE = 10
Public Const FT_EEPROM_READ_FAILED = 11
Public Const FT_EEPROM_WRITE_FAILED = 12
Public Const FT_EEPROM_ERASE_FAILED = 13
Public Const FT_EEPROM_NOT_PRESENT = 14
Public Const FT_EEPROM_NOT_PROGRAMMED = 15
Public Const FT_INVALID_ARGS = 16
Public Const FT_NOT_SUPPORTED = 17
Public Const FT_OTHER_ERROR = 18

’ Flags für FT_OpenEx
Public Const FT_OPEN_BY_SERIAL_NUMBER = 1
Public Const FT_OPEN_BY_DESCRIPTION = 2

’ Flags für FT_ListDevices
Public Const FT_LIST_BY_NUMBER_ONLY = &H80000000
Public Const FT_LIST_BY_INDEX = &H40000000
Public Const FT_LIST_ALL = &H20000000

’ IO buffer
Public Const FT_In_Buffer_Size = 1024
Public Const FT_Out_Buffer_Size = 1024

Public FT_In_Buffer As String * FT_In_Buffer_Size
Public FT_Out_Buffer As String * FT_Out_Buffer_Size
Public FT_IO_Status As Long
Public FT_Result As Long
Public FT_Device_Count As Long
Public FT_Device_String_Buffer As String * 50
Public FT_Device_String As String

Global lngHandle As Long

Public FT_HANDLE As Long

Public Sub FT_Error_Report(ErrStr As String, PortStatus As Long)
’ Fehlermeldungen
Dim Str As String

Select Case PortStatus
Case FT_INVALID_HANDLE
Str = ErrStr & " - Invalid Handle"
Case FT_DEVICE_NOT_FOUND
Str = ErrStr & " - Device Not Found"
Case FT_DEVICE_NOT_OPENED
Str = ErrStr & " - Device Not Opened"
Case FT_IO_ERROR
Str = ErrStr & " - General IO Error"
Case FT_INSUFFICIENT_RESOURCES
Str = ErrStr & " - Insufficient Resources"
Case FT_INVALID_PARAMETER
Str = ErrStr & " - Invalid Parameter"
Case FT_INVALID_BAUD_RATE
Str = ErrStr & " - Invalid Baud Rate"
Case FT_DEVICE_NOT_OPENED_FOR_ERASE
Str = ErrStr & " - Device not opened for Erase"
Case FT_DEVICE_NOT_OPENED_FOR_WRITE
Str = ErrStr & " - Device not opened for Write"
Case FT_FAILED_TO_WRITE_DEVICE
Str = ErrStr & " - Failed to write Device"
Case FT_EEPROM_READ_FAILED
Str = ErrStr & " - EEPROM read failed"
Case FT_EEPROM_WRITE_FAILED
Str = ErrStr & " - EEPROM write failed"
Case FT_EEPROM_ERASE_FAILED
Str = ErrStr & " - EEPROM erase failed"
Case FT_EEPROM_NOT_PRESENT
Str = ErrStr & " - EEPROM not present"
Case FT_EEPROM_NOT_PROGRAMMED
Str = ErrStr & " - EEPROM not programmed"
Case FT_INVALID_ARGS
Str = ErrStr & " - Invalid Arguments"
Case FT_NOT_SUPPORTED
Str = ErrStr & " - not supported"
Case FT_OTHER_ERROR
Str = ErrStr & " - other error"
End Select

End Sub
____________________________________________________

Diese Datei soll ich also modifizieren und dort die Befehle einsetzen die ich zuvor beschrieben habe. ZUsätzlich soll ich aus dem folgenden Script den Timer und die Sleepfunktion hier einsetzen.

Hier nun also das zweite Script mit dem Timer (es ist eine SOftwareampelschaltung aber eben noch ohne direkte Befehle an den Ausgang. Das ganze wird über einen USB-RS232 gesteuert, da ist ein zusätzliches Steckbord dran in das man die drei LEDs einstecken muss. Schade dass man hier keine BIlder schicken kann.
________________________________________________
Hier also Scipt 2 (Softwareampelschaltung)
(Ampelf.frm)der des Projektes Ample.vbp

Option Explicit

Private ModusLicht As Boolean

Private AmpelLichtNummer As Integer
Private AmpelBlinkNummer As Integer

Private Sub comStartAmpelLicht_Click()
If comStartAmpelLicht.Caption = „Start“ Then
comStartAmpelLicht.Caption = „Stopp“
comStartAmpelBlink.Enabled = False
ModusLicht = True
AmpelLichtNummer = 0
Timer1.Enabled = True
Else
Timer1.Enabled = False
comStartAmpelLicht.Caption = „Start“
comStartAmpelLicht.Enabled = True
comStartAmpelBlink.Enabled = True
End If

labRot.ForeColor = vbBlack
labGelb.ForeColor = vbBlack
labGrün.ForeColor = vbBlack
End Sub

Private Sub comStartAmpelBlink_Click()
If comStartAmpelBlink.Caption = „Start“ Then
comStartAmpelBlink.Caption = „Stopp“
comStartAmpelLicht.Enabled = False
ModusLicht = False
AmpelLichtNummer = 0
Timer1.Enabled = True
Else
Timer1.Enabled = False
comStartAmpelLicht.Enabled = True
comStartAmpelBlink.Caption = „Start“
comStartAmpelBlink.Enabled = True
End If

labRot.ForeColor = vbBlack
labGelb.ForeColor = vbBlack
labGrün.ForeColor = vbBlack
End Sub

Private Sub Timer1_Timer()

AmpelLichtNummer = AmpelLichtNummer + 1

If ModusLicht Then
Select Case AmpelLichtNummer

Case 1 'Rot
labRot.ForeColor = vbRed
labGelb.ForeColor = vbBlack
labGrün.ForeColor = vbBlack

Case 11 'Rot gelb
labGelb.ForeColor = vbYellow

Case 21 'Grün
labGrün.ForeColor = vbGreen
labRot.ForeColor = vbBlack
labGelb.ForeColor = vbBlack

Case 41 'Grün nach Gelb
labGrün.ForeColor = vbBlack
labGelb.ForeColor = vbYellow

Case 51 'zurück nach rot
AmpelLichtNummer = 0
End Select

Else
Select Case AmpelLichtNummer
Case 1 'an
labGelb.ForeColor = vbYellow

Case 6 'aus
labGelb.ForeColor = vbBlack

Case 8 ’ zurück nach an
AmpelLichtNummer = 0
End Select
End If
End Sub
_______________________________________

Ich hoffe das hier ist verständlich.
Lieber Gruß

Hallo,

das ist verständlich genug. :smile:

Das ist ein Visual Basic Projekt.
Ich hab’s erst mal nur überflogen, das sieht nach VB6 aus, wird bei mir also laufen.

Das ist aber nicht VBS !

Hast Du denn VB6? Für VBS ist das ein paar Nummern zu groß.

Gruß Rainer

Hallo Rainer,

ja ich habe Visual Basic 6.0 die Portable Edition

Hallo,

ja ich habe Visual Basic 6.0 die Portable Edition

Super! Dann wird’s leicht. :smile:

Die Version kenne ich zwar nicht, aber hierfür ist das unerheblich, denke ich.

Was passiert denn, wenn Du das Projekt Ampel.vbp öffnest?

Steht dann oben rechts das Projekt Ampel.vbp, die Form Ampel.frm und darunter auch das Modul?

Dann müsste das doch so schon laufen.

Wenn das läuft, dann erklär noch mal kurz, was genau Du möchtest. :smile:

Soll die Ampel Zeitgesteuert laufen oder möchtest Du Schaltzustände per Mausklick einstellen?

Was gut gehen würde, wäre das Ganze so weit zu kapseln, daß Du mit dem Programm nichts mehr zu tun hast, nur in eine Textdatei Parameter schreibst. Beispiel:

g 3
gy 1
r 3
ry 1

Übersetzt: Die Ampel wird für 3 Sekunden grün, dann für 1 Sekunde grün/gelb, dann für drei Sekunden rot, dann für eine Sekunde rot/gelb und dann das Spiel von vorn. :smile:

Ich weiß ja nicht genau, was Du vor hast.
Willst Du nur Deine Ampel steuern, doer willst Du programmieren lernen?

Gruß Rainer
PS. Mit Deiner Bezeichnung ‚Script‘ für das Programm hast Du mich am Anfang etwas in die Irre geführt. :smile:

Hallo Rainer,
nein, das Modul ist darin nicht enthalten- was läuft ist eben eine reine Softwareampel die keinen Kontakt zum FT232 aufbaut.
Entschuldige ja ich meinte natürlich Programm und nicht Script.
Was ich eigendlich machen möchte oder versuche ist 3 oder mehr LEDs steuern zu können, das was Du gerade vorgeschlagen hast mit der Textdatei den Farben und der Leuchtdauer wäre natürlich super, aber wie bekommt man das hin?

hallo,

nein, das Modul ist darin nicht enthalten- was läuft ist eben
eine reine Softwareampel die keinen Kontakt zum FT232 aufbaut.

ach so. :smile: Dann klick mal oben im Menü auf ‚Projekt‘, dort auf ‚Modul‘ und dann ‚vohandene‘. Dann kannst du das vorhandene Modul auswählen, auf ‚OK‘ klicken und das Modul, in dem die gesamte steuerung steckt, ist in das Projekt eingebunden.

Was ich eigendlich machen möchte oder versuche ist 3 oder mehr
LEDs steuern zu können, das was Du gerade vorgeschlagen hast
mit der Textdatei den Farben und der Leuchtdauer wäre
natürlich super, aber wie bekommt man das hin?

Da nehmen wir das erste Projekt, in dem das Modul ja schon vorhanden ist, in dem Deine Hardware schon erkannt wird …

Zuerst legst Du in Dein VB-Verzeichnis eine Textdatei mit dem Namen ‚Ampeldaten.txt‘ Das Programm erwartet, daß die Textdatei im selben Verzeichnis liegt, wie das Programm. der Inhalt sollte so aussehen:

g 3
ry 1
r 3
ry 1

Dann legst Du auf die Form noch zwei weitere Buttons.
Wenn Du das nicht änderst, wird der Erste davon ‚Command1‘ heißen und der zweite ‚Command2‘

Dann legst Du in die Deklaration oben, wo schon sleep deklariert ist noch folgendes dazu:

Dim Fa() As String
Dim Tm() As String
Dim Flag As Boolean

Und unten fügst Du ein:

Private Sub Command1\_Click()
 Dim Na As String, Pfd As String
 Dim ff As Integer, l As Long, i As Long
 Dim Txt As String
 Dim Zl() As String
 Dim Wt() As String

 Me.Show
 Call CbTxD\_Click

 Pfd = App.Path
 If Right(Pfd, 1) "\" Then
 Pfd = Pfd & "\"
 End If
 Na = Pfd & "Ampeldaten.txt"
 l = FileLen(Na)
 Txt = Space(l)
 Open Na For Binary As #ff
 Get #ff, , Txt
 Close #ff
 Zl = Split(Txt, vbCrLf)
 ReDim Fa(UBound(Zl))
 ReDim Tm(UBound(Zl))
 For i = LBound(Zl) To UBound(Zl)
 Wt = Split(Zl(i), " ")
 Fa(i) = Wt(0)
 Tm(i) = Wt(1)
 Next
 Flag = True
 Ampel
End Sub

Private Sub Command2\_Click()
 Flag = False
End Sub

Private Sub Ampel()
 Dim Flag As Boolean
 Dim n As Long
 While Flag = True
 Select Case Fa(n)
 Case r
 FT\_ClrRts
 FT\_ClrDtr
 FT\_SetBreakOn
 Case y
 FT\_SetRts
 FT\_ClrDtr
 FT\_SetBreakOff
 Case g
 FT\_ClrRts
 FT\_SetDtr
 FT\_SetBreakOff
 Case ry
 FT\_SetRts
 FT\_ClrDtr
 FT\_SetBreakOn
 Case gy
 FT\_SetRts
 FT\_ClrDtr
 FT\_SetBreakOff
 Case Else
 FT\_ClrRts
 FT\_ClrDtr
 FT\_SetBreakOff
 End Select
 Sleep Tm(n) \* 1000
 n = n + 1
 If n \> UBound(Tm) Then n = 0
 Wend
End Sub

Der Code ist nicht getestet!

Ich habe weder die nötige Dll noch die Hardware, testen kann ich nicht. Wenn ich nicht gerade einen Knoten im Gehirn habe sollte das aber funktionieren.

Wenn Deine Hardware erkannt ist, klickst Du auf den ersten Button, dann sollte deine Ampel anfangen nach der Vorschrift in der Textdatei zu arbeiten. Beim Klick auf den zweiten Button sollte sie damit wieder aufhören.

Gruß Rainer

Nachtrag
Hallo,

da ist mir etwas aufgefallen … :smile:
das Anhalten wird nicht funktionieren, da fehlt ein Doevents an dieser Stelle …

 Sleep Tm(n) \* 1000
 n = n + 1
 If n \> UBound(Tm) Then n = 0
 Wend

 Sleep Tm(n) \* 1000
 n = n + 1
 If n \> UBound(Tm) Then n = 0
 DoEvents
 Wend

Gruß Rainer

Vielen Dank Rainer,

habe es so eingefügt, bekomme aber wenn ich eine Exe erstellen möchte die Fehlermeldung: Compile Error Argument is not optional und dabei ist
der Befehl FT_ClrRts markiert.

Ich habe Deinen Code

Dim Fa() As String
Dim Tm() As String
Dim Flag As Boolean

nach:

’ Private Declare Sub Sleep Lib „kernel32“ (ByVal dwMilliseconds As Long)

eingefügt und den anderen Code nach:

CbTxD_Click_fehler:
MsgBox Err.Description
Resume CbTxD_Click_fehler_ende
End Sub

also beides in der .frm - oder muss das in das Module.bas?

Hallo,

habe es so eingefügt, bekomme aber wenn ich eine Exe erstellen
möchte die Fehlermeldung: Compile Error Argument is not
optional und dabei ist
der Befehl FT_ClrRts markiert.

oops. :smile: ich habe den Aufruf nur aus Deinem ersten Beitrag genommen, ohne nachzusehen, ob das auch richtig ist. Sorry.
Jetzt habe ich noch mal in das Modul gesehen, da muss noch ein Handle mit übergeben werden. wo das steht muss ich erst suchen, einen Moment …

Ich habe Deinen Code

Dim Fa() As String
Dim Tm() As String
Dim Flag As Boolean

nach:

’ Private Declare Sub Sleep Lib „kernel32“ (ByVal
dwMilliseconds As Long)

eingefügt und den anderen Code nach:

CbTxD_Click_fehler:
MsgBox Err.Description
Resume CbTxD_Click_fehler_ende
End Sub

also beides in der .frm - oder muss das in das Module.bas?

Nein, das ist alles richtig so. Den Fehler habe ich eingebaut. :smile:
Das sind die Fallen, die lauern, wenn man nicht testen kann.

Bis gleich.

Gruß Rainer

Hallo,

also ich bin mir da etwas unsicher, da hilft nur ausprobieren. :smile:
Entweder muss da eingefügt werden ‚FT_HANDLE‘ oder ‚lngHandle‘.

Wahrscheinlicher scheint mit ‚FT_HANDLE‘, deshalb habe ich das mal im Beispiel so gemacht.

Wenn das nicht funktioniert, ersteze das bitte durch ‚lngHandle‘.

Ob da eine Klammer rum muss, weiß ich auch nicht sicher, ich nehme an, nein.

Erster Versuch …

Private Sub Ampel()
 Dim Flag As Boolean
 Dim n As Long
 While Flag = False
 Select Case Fa(n)
 Case r
 FT\_ClrRts FT\_HANDLE
 FT\_ClrDtr FT\_HANDLE
 FT\_SetBreakOn FT\_HANDLE
 Case y
 FT\_SetRts FT\_HANDLE
 FT\_ClrDtr FT\_HANDLE
 FT\_SetBreakOff FT\_HANDLE
 Case g
 FT\_ClrRts FT\_HANDLE
 FT\_SetDtr FT\_HANDLE
 FT\_SetBreakOff FT\_HANDLE
 Case ry
 FT\_SetRts FT\_HANDLE
 FT\_ClrDtr FT\_HANDLE
 FT\_SetBreakOn FT\_HANDLE
 Case gy
 FT\_SetRts FT\_HANDLE
 FT\_ClrDtr FT\_HANDLE
 FT\_SetBreakOff FT\_HANDLE
 Case Else
 FT\_ClrRts FT\_HANDLE
 FT\_ClrDtr FT\_HANDLE
 FT\_SetBreakOff FT\_HANDLE
 End Select
 Sleep Tm(n) \* 1000
 n = n + 1
 If n \> UBound(Tm) Then n = 0
 DoEvents
 Wend
End Sub

Zweiter versuch dann jeweils mit Klammer, also etwa so …

FT\_ClrRts (FT\_HANDLE)

oder eben …

FT\_ClrRts lngHandle

FT\_ClrRts (lngHandle)

Was davon richtig ist, findest Du schneller heraus als ich. :smile:

Gruß Rainer

nun meldet er wieder compile Error und markiert dabei das Sleep unter End select- in beiden Fällen, d.h. wenn ich die Klammer benütze oder sie weglasse erhalte ich die Fehlermeldung und er markiert das Sleep

Hallo,

nun meldet er wieder compile Error und markiert dabei das
Sleep unter End select- in beiden Fällen, d.h. wenn ich die
Klammer benütze oder sie weglasse erhalte ich die
Fehlermeldung und er markiert das Sleep

Dann prüf mal die Deklaration von Sleep.

Direkt unter ‚Option explicit‘ auf der Form sollte stehen:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Deim Aufruf von Sleep darf keine Klammer stehen.

Gruß Rainer

Halt !!!
schon wieder mein Fehler! Tm() ist doch ein String! Sleep will aber ein Long …

Ersetze das bitte durch:

Sleep CLng(Tm(n)) \* 1000

Gruß Rainer

also die Option Explizit wird ja im Module.bas aufgeführt, dort ist aber der Befehl private Declare Sub Sleep nicht - der steht in der .frm als erster Eintrag:

’ Private Declare Sub Sleep Lib „kernel32“ (ByVal dwMilliseconds As Long)

bei Sleep habe ich natürlich keine Klammer genommen, nur dort wo du es vorgeschlagen hast.

Hallo,

Du hast die Korrektur nicht gesehen?
Mein Fehler ist, daß ich Tm() als String deklariert habe und den String übergebe, wo Sleep ein Long erwartet.

Richtig muss da stehen:

Sleep CLng(Tm(n)) \* 1000

Mal sehen, ob noch ein paar Fehler lauern. :frowning:

Gruß Rainer

habe unter End select Sleep CLng(Tm(n)) * 1000 eingesetzt,
die FT-Befehle mit und ohne Klammer versucht aber es kommt immer noch dieselbe Fehlermeldung und Sleep wird markiert- der Haken muss also noch wo anders liegen.

Hallo,

habe unter End select Sleep CLng(Tm(n)) * 1000 eingesetzt,
die FT-Befehle mit und ohne Klammer versucht

die FT-Aufrufe haben mit dem Sleep nichts zu tun.

aber es kommt
immer noch dieselbe Fehlermeldung und Sleep wird markiert- der
Haken muss also noch wo anders liegen.

hmmm. Jetzt werden wir wohl debuggen müssen.
Auch gut, dann lernst Du den Debugger kennen. :smile:

Geh zu dem Code, eine Zeile vor das Sleep.
Das Editorfenster hat links neben dem Code einen grauen Rand.
Klick in der Zeile vor dem Sleep mal auf den grauen Rand.
Wenn Du das richtig hast, malt VB da einen dicken Punkt.
Das ist ein Stoppunkt. wenn Du jetzt das Programm startest, läuft es bis da hin, bleibt stehen und öffnet den Editor bei aktivem Programm.

Nun kannst Du den Mauszeiger auf eine variable stellen und VB wird Dir in einem ToolTipText den Inhalt der Variablen zeigen.
Welchen Wert hat ‚n‘? Welchen Inhalt Tm(n)? Da soll eine Zahl stehen.

Wenn da keine Zahl steht, dann such mal eine Zeile wo Ubound(zl) steht. Ist das größer als Null? Wenn nein, wurde Deine Textdatei nicht gelesen, das Array enthält gar keine Zahl.

Falls Du mit dem Pfad nicht zurecht kommst, alss App.Path weg schreib die Textdatei direkt nach C:\ und setze den Pfad konstant nach C:.

Gruß Rainer

Hallo,

ich habe mal ein Testprogramm zum Thema Sleep gebaut.

Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Dim tm(5) As String

Private Sub Command1\_Click()
 Dim i As Integer
 For i = 0 To 5
 tm(i) = CStr(i + 1)
 Next
End Sub

Private Sub Command2\_Click()
 Dim i As Integer
 For i = 0 To 5
 Sleep CDbl(tm(i)) \* 1000
 Me.Caption = i
 Next
End Sub

Das funktioniert.

Wenn ich aber die Null durch ‚nichts‘ ersetze, funktioniert es nicht mehr.

Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Dim tm(5) As String

Private Sub Command1\_Click()
 Dim i As Integer
 For i = 0 To 5
 tm(i) = CStr(i + 1)
 Next
 tm(0) = ""
End Sub

Private Sub Command2\_Click()
 Dim i As Integer
 For i = 0 To 5
 Sleep CDbl(tm(i)) \* 1000
 Me.Caption = i
 Next
End Sub

Meldung: ‚Typen unverträglich‘

Wenn das der Fehler ist, dann steht in Tm(n) keine Zahl.
Entweder weil die Textdatei nicht gefunden wurde, oder weil sie sich nicht an die Vorschrift hält, die ich festgelegt habe.
Jede Zeile muss vorn Zeichen enthalten. Entweder r oder y oder g oder ry oder gy. Dann genau ein leerzeichen, dann eine Zahl, die die Sekunden angibt, dann ein Zeilenvorschub.
Jede Zeile muss genau ein Leerzeichen enthalten. Nicht mehr und auch nicht weniger.

Gruß Rainer