Ik bestuur mijn digitale (Lenz) modelbaan (de wissels en de seinen) met PIO-kaarten (gebaseerd op de 8255)met een zelf geschreven programma in Visual Basic. Het verkeert allemaal nog in een beginstadium.
Ik ben in het bezit van de Lenz de interface LI101F en wil daarmee ook wat treinbeinvloeding gaan programmeren. Ik heb de beschrijving van Lenz gelezen, maar ik ben te weinig ervaren om de eerste start te maken.
Wie helpt mij daarbij bv. met het beschikbaar stellen van broncode uit een zelfgeschreven programma, waaruit ik kan opmaken hoe ik de start moet maken ?
Ik rij met Lenz versie 2.3 en een programma zelf geschreven in VB 6.
Ik gebruik interface LI100 compoort 1 of 2.
De wisseldecoders en terugmelders zijn ook van Lenz.
Licht signaal dekoders van LDT.
Als ge een interface van Lenz koopt is de protocol op diskette bijgeleverd.(toen toch nu nog denk ik) . Het Lenz systeem is zeer betrouwbaar ik gebruik het 12jaar.
Wel 8 jaar aan het programma gewerkt.Het is alleen op mijn baan bruikbaar niet universeel.
Gr
Flip
Ik zelf gebruik ook pio kaarten (8255 met 48 uitgangen)echter programmeer ik met quick basic (geen Qbasic),
Quck basic heeft een compiler.
Lenz programmeren gaat vrij simpel,tenminste in qb.
qb heeft het voordel onder DOS te draaien en daar door veel stabieler te zijn dan VB.
Ook heeft QB meer functie die aansluiten bij besturings doeleinde,
Aansturig moet wel via RS232 wat ik kan geen USB sturen.
wim
Hallo Flip,
Ik heb weinig ervaring met programmeren, maar ik wil het wel graag leren. Ik schrijf ook in VB 6, rij met Lenz 3.0 en probeer aan de hand van een leerboek VB vooruit te komen. Het protocol van de interface staat als PDF op de bijgeleverde CD-ROM van Lenz. Ik heb dat gelezen, maar begrijp niet precies hoe ik moet beginnen. Ik heb de interface aangesloten op mijn PC en dat werkt wel. Hoe krijg ik verbinding met de interface en hoe schrijf ik die commando?s precies iun VB? Ik dacht aan de hand van een voorbeeld (geschreven code) wat meer inzicht te krijgen. Is dat zo ?
Bedankt voor de reacties en groet
Hans
citaat:
Geplaatst door Flip2
Ik rij met Lenz versie 2.3 en een programma zelf geschreven in VB 6.
Ik gebruik interface LI100 compoort 1 of 2.
De wisseldecoders en terugmelders zijn ook van Lenz.
Licht signaal dekoders van LDT.
Als ge een interface van Lenz koopt is de protocol op diskette bijgeleverd.(toen toch nu nog denk ik) . Het Lenz systeem is zeer betrouwbaar ik gebruik het 12jaar.
Wel 8 jaar aan het programma gewerkt.Het is alleen op mijn baan bruikbaar niet universeel.
Gr
Flip
Aan h.evering,
De langste reis begint met 1 stap.
Heb je al een MSComm1 op je Form staan?
Als er op je componentenbalk geen telefoon-icoon staat, moet je in "Projects", "Components" het vakje van "Microsoft Comm Control 6.0" aanvinken.
Het telefoonicoontje trek je dan naar je Form.
In "Properties" vind je dan zoiets :
(http://img515.imageshack.us/img515/1295/mscomm1yh0.jpg)
De verschillende waarden moeten nu ingevuld worden volgens het communicatieprotocol van Lenz.
Laat even weten of je al zover bent of hopelijk reeds verder...
Met vriendelijke groeten,
Erik
Hoi Erik,
Ik heb een nieuw project in VB aangemaakt. Ik heb de MSCOMM geladen. Ik heb instelling CommPort ingesteld op 2 (daarop zit de LI101F) Ik heb afgelopen weekend de "Befehlsbeschreibung" nog eens goed doorgelezen. Ik begin geloof ik te begrijpen hoe het werkt tussen de Lenzcentrale, de LI101F en de PC, maar hoe ik de communicatie in VB op moet zetten en met welke commando's is mij nog niet duidelijk. Hopelijk kun je mij verder helpen. Het ExpressNet Adres van de LI101F = 30.
Bedankt voor je ondersteuning en groet
Hans
Dag Hans,
Voor je verder gaat :
1. Heb je je interface goed ingesteld via de meegeleverde software van Lenz ?
2. Heb de de parameters van je MSCOMM1 correct ingesteld?
Om je een beginnend inzicht te geven van de bevelsstruktuur geeft ik ook even aan hoe je softwarematig deze MSCOMM1 parameters kan instellen.
Voorbeeld :
MSComm1.RThreshold = 2
MSComm1.InputLen = 2
MSComm1.Settings = "9600,N,8,1"
MSComm1.DTREnable = False
MSComm1.CommPort = 5
MSComm1.PortOpen = True
Als nu de parameters van je MSCOMM1 en de Lenz-interface gelijk zijn kan je praten met de Lenz-centrale via MSCOMM1 met een bevel van het volgende type :
MSComm1.Output = Chr(Adres) + Chr(Waarde) oid.
Waarbij Adres dan wijst naar het toestel (Lok, Wissel...) en Waarde naar wat dat toestel moet doen (Set, Reset, Snelheidsstap, Licht, enz...)
Dat moet je uit de Lenz-documentatie halen.
Eea. kan je ook hier vinden : http://www.rentron.com/receiving_data.htm
Niet wanhopen, volhouden.
Erik
Hallo Erik,
Ik heb op dit moment de volgende gegevens in mijn VB-project staan:
Private Sub Form_Load()
LI101F.RThreshold = 2
LI101F.InputLen = 2
LI101F.Settings = "9600,N,8,1"
LI101F.DTREnable = False
LI101F.CommPort = 2
LI101F.PortOpen = True
End Sub
Private Sub LI101F_OnComm()
LI101F.Output = Chr(33) & Chr(33) & Chr(0)
If LI101F.CommEvent = comEvReceive Then
Text1.Text = LI101F.Input ' Get data
End If
End Sub
Ik heb de naam van mijn MCCOMM1 gewijzigd in LI101F. Via de software van Lenz kan mijn systeem via compoort 2 uitlezen.
De getallen voor de output heb ik ontleend aan het Lenz Handboek.
Daarin staat het volgende:
PC sendet Befehl an LZ100: 33 / 33 / 00 (Anfrage Softwareversion)
PC erh?lt folgende Antworten: 66 / 05 / 74 / 13 (R?ckmelde-Broadcast)
66 / 05 / 75 / 12 (R?ckmelde-Broadcast)
99 / 33 / 53 / 0 / 119 (gew?nschte Antwort)
Hoe gaat het verder, wat doe ik goed en wat fout.
Met dank voor reacties
Groet
Has
In het de Sub On_Comm zou ik denk ik geen zend opdrachten zetten.
Iedere keer als het Lenz Systeem een antwoord geeft, zend je dan ook altijd een output, dit is denk ik niet de bedoeling
De On_comm kan op deze wijze vorm gegeven worden.
Private Sub Port_OnComm()
If Programmer.mnu_lenz.Checked Then
With Port
Select Case .CommEvent
Case comEvReceive
.RThreshold = 0
While .InBufferCount > 0
szData = szData & Chr(AscB(.Input))
DoEvents
Wend
Lezenlenz szData
.RThreshold = 1
Case comEvSend
Case comEvCTS
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "CTS " & .CTSHolding & vbCrLf
Case comEvCD
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "CDEvent" & vbCrLf
Case comEvDSR
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "DSREvent" & vbCrLf
Case comEvRing
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "Ring" & vbCrLf
'errors
Case comEventBreak
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "Break" & vbCrLf
Case comEventCDTO
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "CD Timeout" & vbCrLf
Case comEventCTSTO
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "CTS Timeout" & vbCrLf
Case comEventDSRTO
FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "DSR Timeout" & vbCrLf
Case comEventFrame
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "Framing Error" & vbCrLf
Case comEventOverrun
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "Overrun" & vbCrLf
Case comEventRxOver
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "RX Overflow" & vbCrLf
Case comEventRxParity
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "Parity Error" & vbCrLf
Case comEventTxFull
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "TX buffer full" & vbCrLf
Case comEventDCB
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & "DCB Error" & vbCrLf
End Select
End With
End If
End Sub
Waarbij de inkomende string in de SUB LezenLenz verder uitgeplozen wordt en verwerkt.
INFO heeft zeker gelijk : een Sub On_Comm is een aktie op een communicatie.
Maar ik geloof dat er initi?el fouten zitten : in de handleiding van de IF101F staat dat de kleinste baudrate 19200 is
LI101F.Settings = "9600,N,8,1"
kan dus nooit een correcte instelling zijn.
Eerst de juiste communicatieafspraken maken tussen PC en interface.
Erik
Hans,
Ik ken wat van VisualBasic6 maar weinig van Lenz.
Daarom heb ik mijn licht eens opgestoken bij Flip2, die kent beide.
Hij werkt nog met een LF100 en V.2.3 en is nog steeds tevreden.
Ten geleide stuur ik zijn instellingen :
Name MSCcomm1
Commport 2
DTREnable False
EOFEnable False
Handshaking 0-comNone
INBufferSize 1024
Index -
InputLen 1
InputMode Binary (belangrijk mag niet op text staan)
Left 9960 (onbelangrijk de plaats van de MScomm)
NullDiscard False
OutPutBufferSize 512
ParityReplace ?
RThreshold 1
RTSEnable False
Setting 9600,n,8,1
SThreshold 1
Tag -
Top 6360 (onbelangrijk de plaats van de MScomm)
Zoals ik deze nacht reeds schreef moet jij voor de settings de 9600 zeker wijzigen in 19200.
Flip2 leest vanaf nu mee en kan ook een goede inbreng leveren.
Of je nu in Qbasic, of Quickbasic programmmeert : het maakt niet veel uit.
Hopen we dat er iemand is die je kan helpen met de settings voor je LI101F en de bijgepaste softwareversie. Dat moet eerst in orde zijn voor we verder kunnen.
Erik
Hallo Erik en Flip2,
Op dit moment heb ik de volgende gegevens in mijn project opgenomen:
Private Sub Form_Load()
LI101F.CommPort = 2
LI101F.RThreshold = 1
LI101F.SThreshold = 1
LI101F.InputLen = 1
LI101F.InputMode = comInputModeBinary
LI101F.Settings = "19200,N,8,1"
LI101F.InBufferSize = 1024
LI101F.OutBufferSize = 512
LI101F.NullDiscard = False
LI101F.EOFEnable = False
LI101F.DTREnable = False
LI101F.RTSEnable = False
LI101F.PortOpen = True
End Sub
Private Sub LI101F_OnComm()
If LI101F.CommEvent = comEvReceive Then
Text1.Text = LI101F.Input ' Get data
End If
End Sub
Mijn bedoeling was om de softwareversie van de LZ 100 op te vragen, omdat dat het eerste beschreven commando in het Lenz handboek is.
Ik heb nu het send commando weggelaten.
Als ik dit programma'tje run krijg ik nog geen reactie in mijn textblok. Klopt dat? Hoe nu verder ???
De reactie van Info is voor mij nog een beetje hogere wiskunde.
Met vriendelijk groet en dank,
Hans
Hans,
Als je instellingen en je code al goed zouden zijn, is het zeer logisch dat je geen reaktie krijgt. Je moet eerst de vraag lanceren (met een MSCOMM1.Output ....).
Maak eens een cmdButton aan met Sub cmdButton_Click procedure waarin je die MSCOMM1.Output opdracht zet met de juiste parameters. Telkens je die button aanklikt stel je de vraag aan het systeem. Text vooraf leeg maken. Als je geen respons krijgt is er iets mis.
Erik
Dag Hans
Met de meeste seriele protocollen is het zo dat slechts een antwoord gestuurd wordt als er een vraag gesteld wordt. Met andere woorden : de centrale zal pas antwoorden op je vraag om softwareversie als je dat effectief gevraagd hebt.
Maak op je form even een commandbuytton met als code LI101F.Output = Chr(33) & Chr(33) & Chr(0)
In princiepe komt je antwoord even later binnen via het OnComm event.
Als je hiermee verder wil, raad ik je tevens aan een goede tool te zoeken die al je seriele verkeer monitored, op die manier kan je visualiseren welk verkeer er over en weer gaat, en kan je je software beter testen en debuggen.
Een andere mogelijkheid is de seriele lijn af te tappen via een 2de pc en daarop te monitoren wat er over de lijn gaat.
Tja Hans,
citaat:
De reactie van Info is voor mij nog een beetje hogere wiskunde.
Met vriendelijk groet en dank,
Hans
Het is ook maar een deel van de puzzel, dit is dus alleen maar het ontvangst deel. Er moet nog een verwerkingsdeel bij om de ontvangen info te verwerken.
En er moet nog een verzend deel bij, welke de data zend en het controle getal berekend.
Kan het je allemaal voorkauwen, maar daar leer je niets van.
Hans,
Op deze manier zal het ook niet werken.
citaat:
Private Sub LI101F_OnComm()
If LI101F.CommEvent = comEvReceive Then
Text1.Text = LI101F.Input ' Get data
End If
End Sub
Je hebt inputlen op 1 staan, dus er komt maar 1 teken binnen, je zult dus zoals ik je al liet zien dit via de inbuffercount en een while .. wend moeten oplossen. Om iedere keer 1 teken uit de buffer te lezen en te plakken aan de nog te verwerken string met inkomende informatie.
Inputlen = 1 is de juiste instelling.
Wat INFO aangeeft is juist. Ik zat er al op te wachten.
INFO beschrijft de procedure die te volgen is als je niet weet hoeveel tekens er gaan binnenkomen op een vraag.
Mijn systeem (Rautenhaus) antwoordt steeds met 2 tekens zodat InputLen op 2 staat. Een tragere While...wend langs Inbuffercount heb ik dus niet nodig.
Geeft de LENZ-centrale ook steeds een vast aantal tekens terug ?
Laten we Hans nu niet laten lopen als hij nog niet kan gaan.
Erik
Klopt Info ik heb het nog eens nagekeken .Dit is stof van mijn eerste "Lenz jaar " en dat is 12j geleden.
Ik heb versie 2.3.
Het eerste is altijd de Header hier tussen de bytes die verschillen naar gelang het geen binnen komt of buiten gaat en als laatste een Prufbyte (XOR).Aan de waarde van de Header kan men zien of het bv om een lokbevel gaat of bv een terugmelding.Bij een antwoord op een bevel is (B1)de header 1 geloof ik. De inkomende informatie zijn characters een string dus.
Deze moeten ??n voor ??n ingelezen worden en dan omgezet naar decimale waarde. Vb is header (B1) 66 dan gaat het om een terugmelding de volgende bytes bepalen adres en stand van de wissel of bezette sporen van een terugmeld module. Ik spreek hier over inkomende strings.
Flip2
Flip, dan heb jij wel een hele speciale versie. Het aantal tekens is onbekend, je weet namelijk niet wat het systeem gaat zenden.
Hans,
Maak een procedure voor het zenden.
maak een algemene array aan om je zend info in te plaatsen, en maak een algemene array aan om je te ontvangen string in te plaatsen.
Public znd(20) as integer
Public inbuf(50) as integer
Zijn beide groot genoeg en zullen nooit helemaal gevuld worden.
Public Sub Zend()
If Programmer.mnu_lenz.Checked And Programmer.Port.PortOpen Then
With Programmer.Port
If Not .PortOpen Then Exit Sub
X = 1 + (Znd(1) And 15): Znd(20) = 0: Zenden = ""
'In Znd(1) staat altijd de Header, en de Header bepaald het antal tekens welke volgen plus de controle.
For i = 1 To X
Znd(20) = Znd(20) Xor Znd(i)
Zenden = Zenden + Chr(Znd(i))
Next
?n Znd(20) staat de XOR van de te verzenden tekens.
Zenden = Zenden + Chr(Znd(20))
Temp = Zenden
If LenzLiUSB Then
.Output = Chr(&HFF) + Chr(&HFE) + Zenden
ElseIf LenzRoco Then
'geheim
Else
.Output = Zenden
End If
End With
End If
End Sub
Vanaf een andere plaats zend je de opdrachten b.v. het opvragen van de versie of iets anders.
Dus i.p.v. dit LI101F.Output = Chr(33) & Chr(33) & Chr(0), doe je dit
znd(1)= 33: znd(2) = 33 : Zend
Hoe je de inkomende string eventueel kunt verwerken.
Public Sub Lezenlenz(buffer)
''Of is het Je LenzLezen?
On Error Resume Next
If Programmer.mnu_lenz.Checked Then
Dim inbyte As String
Dim tel As Integer
HeaderFout = False
bezet$ = buffer
'If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & bezet$ & vbCrLf
Do
tel = 0
Inbuf(tel) = 0
melding$ = ""
Do
If bezet$ = "" Then Exit Sub
Inbuf(tel) = Asc(bezet$)
bezet$ = Mid$(bezet$, 2)
' Controle op geldige HEADER
'Check the header
Select Case Inbuf(0)
Case 1, 2, 33, 97, 98, 99, 129, 131, 132, 163, 164, 197, 198, 225, 226, 227, 228, 229, 230, 242
Case &HFF, &HFE
tel = -1
Case 66 To 78
Case Else
Inbuf(0) = 0: HeaderFout = True: szData = bezet$: bezet$ = "": LenzPM_Status = -1: Exit Sub
End Select
melding$ = melding$ + Str(Inbuf(tel))
tel = tel + 1
Loop Until 2 + (Inbuf(0) And 15) = tel Or bezet$ = ""
' Verwerken binnengekomen info
If 2 + (Inbuf(0) And 15) = tel Then
szData = bezet$
'Rest van de string onthouden, en via On_Comm eventueel laten aanvullen.
Else
Exit Sub
End If
If DBug Then FrmLenzLog.TxtLenzLog = FrmLenzLog.TxtLenzLog & melding$ & vbCrLf
Select Case Inbuf(0)
Case 66 To 78
'Terugmelding
Case 97
If Inbuf(0) = 97 And Inbuf(1) = 1 And Inbuf(2) = 96 Then
show_Ev2 (" System is active")
SysteemStart = False
End If
If Inbuf(0) = 97 And Inbuf(1) = 0 And Inbuf(2) = 97 Then
show_Ev2 (" Emergency off or SHORT")
End If
If Inbuf(0) = 97 And Inbuf(1) = 2 Then
FrmPT.LblTask.Caption = (" Program Modus")
LenzPM_Status = 0
DoEvents
End If
If Inbuf(0) = 97 And Inbuf(1) = &H1F Then
FrmPT.LblTask.Caption = (" PT is busy")
End If
If Inbuf(0) = 97 And Inbuf(1) = 18 Then
FrmPT.LblTask.Caption = (" SHORT on ProgramTrack")
LenzPM_Status = 3
End If
If Inbuf(0) = 97 And Inbuf(1) = 17 Then
FrmPT.LblTask.Caption = (" ProgramTrack available")
End If
If Inbuf(0) = 97 And Inbuf(1) = 19 Then
FrmPT.LblTask.Caption = (" No answer from decoder, or no decoder on PT ")
'FrmPT.Cmd_On
End If
If Inbuf(0) = 97 And Inbuf(1) = 128 Then
show_Ev2 (" Transmission Error")
End If
If Inbuf(0) = 97 And Inbuf(1) = 129 Then
show_Ev2 (" Command Station Busy")
End If
If Inbuf(0) = 97 And Inbuf(1) = 130 Then
show_Ev2 (" Command not available")
End If
If Inbuf(0) = 97 And Inbuf(1) = 163 Then
show_Ev2 (" Loc taken over by LH100")
End If
If Inbuf(0) = 97 And Inbuf(1) = 164 Then
show_Ev2 (" Loc taken over by LH100")
End If
Case 98
If Inbuf(1) = 33 Then
LenzVersie = (Inbuf(2) 16) * 10 + (Inbuf(2) And 15)
Versie = LenzVersie / 10
Programmer.LblMessage.Caption = " LZ100 SoftWare Versie " + Str$(Versie)
End If
If Inbuf(1) = 34 Then
With LenzStatus
If Sgn(Inbuf(3) And 2 ^ 0) Then
.Bit0 = "Command station is in Emergency Stop"
Else
.Bit0 = "Command station power On"
End If
If Sgn(Inbuf(3) And 2 ^ 1) Then
.Bit1 = "Command station is in Emergency Off"
Else
.Bit1 = "Command station power On"
End If
If Sgn(Inbuf(3) And 2 ^ 2) Then
.Bit2 = "Command station Start mode =1 (automatic mode)"
Else
.Bit2 = "Command station Start mode = 0 (manual mode)"
End If
If Sgn(Inbuf(3) And 2 ^ 3) Then
.Bit3 = "Command station is in service mode"
Else
.Bit3 = "Command station is in normal mode"
End If
If Sgn(Inbuf(3) And 2 ^ 6) Then
.Bit6 = "The command station is performing a power up"
Else
.Bit6 = "Power is On"
End If
If Sgn(Inbuf(3) And 2 ^ 7) Then
.Bit7 = "There was a RAM check error in the command station"
Else
.Bit7 = "RAM check OK"
End If
End With
'Frm_LenzStatus.Show
End If
Case 2
LiVersie = (Inbuf(1) 16) * 10 + (Inbuf(1) And 15)
LiVersie = LiVersie / 10
show_Ev2 " LI100 SoftWare Versie " & Str$(LiVersie) & "." & Str(Inbuf(2))
Case 99
If Inbuf(1) = 33 Then
LenzVersie = (Inbuf(2) 16) * 10 + (Inbuf(2) And 15)
Versie = LenzVersie / 10
Programmer.LblMessage.Caption = " LZ100 SoftWare Versie " + Str$(Versie)
show_Ev2 " Lenz Digital Plus ( SWVer. " + Str(Versie) + " )"
'
'
If Sgn(Inbuf(3) And 2 ^ 0) Then
show_Ev2 " Lenz Digital Plus ( SWVer. " + Str(Versie) + " )" + " LZ100"
ElseIf Sgn(Inbuf(3) And 2 ^ 1) Then
show_Ev2 " Lenz Digital Plus ( SWVer. " + Str(Versie) + " )" + " LH200"
'LenzStatus.VersieLZ = StatusBar1.Panels(2).Text
ElseIf Sgn(Inbuf(3) And 2 ^ 2) Then
show_Ev2 " Lenz Digital Plus ( SWVer. " + Str(Versie) + " )" + " Compact"
'LenzStatus.VersieLZ = StatusBar1.Panels(2).Text
End If
End If
If Inbuf(1) = 16 Or Inbuf(1) = 20 Then
LenzPM_Status = 1
'Antwoord programmeerrails
End If
'***************************************
Case 129
If Inbuf(0) = 129 And Inbuf(1) = 0 And Inbuf(2) = 129 Then
show_Ev2 (" Emergency Stop")
End If
Case 131, 163
'With lk(Inbuf(1))
'End With
Case 132, 164
With lk(Inbuf(1))
End With
Case 227
'Status report (XPressNet Only)
Case 228
'locomotive info normale lok (XpressNet Only)
Case 242
CurBaud = 0
If Inbuf(1) = 2 Then
Select Case Inbuf(2)
Case 1: CurBaud = 19200
Case 2: CurBaud = 38400
Case 3: CurBaud = 57600
Case 4: CurBaud = 115200
End Select
Programmer.LblStatus2.Caption = CurBaud
Programmer.LblMessage2.Caption = " LI101F " & CurBaud & " bps"
End If
Case 1
If Inbuf(0) = 1 And Inbuf(1) = 1 Then
show_Ev (" Fout tussen PC en Interface")
End If
If Inbuf(0) = 1 And Inbuf(1) = 2 Then
'show_Ev (" Fout tussen Interface en Centrale")
show_Ev ("Error between Interface and Command station")
End If
If Inbuf(0) = 1 And Inbuf(1) = 3 Then
'show_Ev (" Fout ONBEKEND")
show_Ev ("Error Unknown")
End If
If Inbuf(0) = 1 And Inbuf(1) = 4 Then
'show_Ev (" OK, de volgende gegevens verzenden")
show_Ev ("Ok, send next data")
FrmPT.LblTask.Caption = "Ok"
End If
If Inbuf(0) = 1 And Inbuf(1) = 5 Then
'show_Ev (" Centrale Antwoord niet")
show_Ev ("No answer from command station")
End If
End Select
'ENZOVOORT
Loop Until bezet$ = ""
End If
End Sub
citaat:
Geplaatst door ysbeer
Ik zelf gebruik ook pio kaarten (8255 met 48 uitgangen)echter programmeer ik met quick basic (geen Qbasic),
Quck basic heeft een compiler.
Dit kan even eenvoudig in Visual Basic, naar mijn mening eenvoudiger. Ik heb ook ooit Compiled DOS-Basic met PIO-kaarten gebruikt...
Ook Visual Basic wordt compiled.
citaat:
Geplaatst door ysbeer
Lenz programmeren gaat vrij simpel,tenminste in qb.
Gezien de praktisch gelijke syntax zie ik hier geen verschillen tov. Visual Basic.
citaat:
Geplaatst door ysbeer
qb heeft het voordel onder DOS te draaien en daar door veel stabieler te zijn dan VB.
Ik heb op een ervaringstijd van 8 jaar met VB6 geen problemen gehad.
citaat:
Geplaatst door ysbeer
Ook heeft QB meer functie die aansluiten bij besturings doeleinde,
Kan U daar een voorbeeld van geven ?
citaat:
Geplaatst door ysbeer
Aansturig moet wel via RS232 wat ik kan geen USB sturen.
wim
USB-drivers voor DOS bestaan. Een adapter USB-RS232 behandel je dan gewoon als een COM-port vanuit Quickbasic.
Erik
Dat is een heleboel informatie. Dat moet ik wat nader bestuderen met het VB-Handboek erbij. Dat kost wat meer tijd. Ik meld me weer.
Groet
Hans
Ik heb mijn eerste stappen in Qbasic gezet over 12j. Daarna begonnen met VB 4 toen 5 en nu de 6 onder XP sedert jaren al(Win 95 en win 98 ging even goed)
Wat INFO schrijft zal wel werken denk ik maar ik doe het totaal anders het principe van inlezen komt natuurlijk altijd terug. Het werkt bij mij al 8j zonder problemen. Ik ben begonnen met Qbasic te leren en dan VB met vallen en opstaan en altijd verbetert.Ik heb over 9j terug les gevolgd van VB5 vanalles geleerd maar niet hoe ik mijn treintjes moest sturen. De leraar kende daar ook niets van maar wist dat het "heel" moeilijk was.
Men vind ook weinig lektuur over hardware sturen met PC.
Welke gek stuurt er nu treinen met een PC???
Gr
Flip
citaat:
Geplaatst door Flip2
Wat INFO schrijft zal wel werken denk ik
Gr
Flip
Ja Flip, daar hoef je niet aan te twijfelen.
Ik ben bezig met een nadere studie van het bericht van INFO.
Ik heb de procedure aangemaakt voor het zenden zoals beschreven. Ik loop aan tegen het feit dat ik een object nodig heb voor de volgende commandoregels:
If Programmer.mnu_lenz.Checked And Programmer.Port.PortOpen Then
With Programmer.Port
If Not .PortOpen Then Exit Sub
Kan ik daar nog wat uitleg bij krijgen ?
Groet en dank
Hans
Tja, wat zal ik daar nu eens opzeggen??
Programmer is de naam van het hoofdformulier.
mnu_lenz is een onderdeel van een pulldownmenu op dat formulier.
en Port is een andere naam voor MSCOMM1. welke ook op hetzelfde formulier staat.
Het programma waaruit dit afkomstig is vind je hier http://people.zeelandnet.nl/rosoft/PT.exe
(http://i5.photobucket.com/albums/y200/xammax/image015.jpg)
http://i5.photobucket.com/albums/y200/xammax/image015.jpg
Ik moet proberen het wat eenvoudiger te houden, anders kom ik er niet uit. De reacties hebben al veel nieuwe wetenschap opgeleverd over VB, maar nog niet genoeg om alles te snappen. Ik begrij in ieder geval ook hoe ik de commando's in de "befehlsbeschreibung van Lenz zal moeten gebruiken.
Maar ik heb 'm nog niet goed aan de praat, m'n LI101F.
Ik heb nu de volgende code staan:
Dim znd(20) As Integer
Dim inbuf(50) As Integer
Public Sub Zend()
x = 1 + (znd(1) And 15): znd(20) = 0: Zenden = ""
For i = 1 To x
znd(20) = znd(20) Xor znd(i)
Zenden = Zenden + Chr(znd(i))
Next
Zenden = Zenden + Chr(znd(20))
Temp = Zenden
LI101F.Output = Chr(&HFF) + Chr(&HFE) + Zenden
End Sub
Private Sub cmdClose_Click()
Unload Me
End Sub
Private Sub Command1_Click()
znd(1) = 33: znd(2) = 33: Zend
End Sub
Private Sub Form_Load()
LI101F.CommPort = 2
LI101F.RThreshold = 1
LI101F.SThreshold = 1
LI101F.InputLen = 1
LI101F.InputMode = comInputModeBinary
LI101F.Settings = "19200,N,8,1"
LI101F.InBufferSize = 1024
LI101F.OutBufferSize = 512
LI101F.Handshaking = comNone
LI101F.NullDiscard = False
LI101F.EOFEnable = False
LI101F.DTREnable = False
LI101F.RTSEnable = False
LI101F.PortOpen = True
Timer1.Enabled = False
End Sub
Public Sub Lezenlenz(buffer)
Dim inbyte As String
Dim tel As Integer
bezet$ = buffer
tel = 0
inbuf(tel) = 0
melding$ = ""
inbuf(tel) = Asc(bezet$)
bezet$ = Mid$(bezet$, 2)
tel = tel + 1
Loop Until 2 + (inbuf(0) And 15) = tel Or bezet$ = ""
If 2 + (inbuf(0) And 15) = tel Then
szdata = bezet$
End If
End Sub
Hoe kom ik verder ????????
Groet en dank voor de genomen moeite
Hans
Hoe je nu verder moet staat reeds in Lezenlenz, of te wel het verwerken van de gegevens die je in de inbuf array hebt geplaatst.
Verder zul je de LI101F via een break procedure moeten opstarten om de juiste baudrate te kunnen instellen en of te kunnen veranderen.
Eigenlijk staat alles wat je nodig hebt om het te laten werken in het eerdere bericht.
Verder moet je in je procedure natuurlijk wel een controle op geldigheid uitvoeren, en de bij de LI101F de twee voorlopende tekens niet meenemen in de te verwerken info, dus die moet je weggooien.
Het staat er allemaal niet voor niets.
IF Tel < 1 then
Select Case Inbuf(0)
Case 1, 2, 33, 97, 98, 99, 129, 131, 132, 163, 164, 197, 198, 225, 226, 227, 228, 229, 230, 242
Case &HFF, &HFE
tel = -1
Case 66 To 78
Case Else
Inbuf(0) = 0: HeaderFout = True: szData = bezet$: bezet$ = "": LenzPM_Status = -1: Exit Sub
End Select
End If
Verder moet je ook de dubbele do..loop gebruiken, je moet namelijk wel de inkomende informatie scheiden en verwerken.
Verder mis ik de procedure On_Comm, hoe ontvang je nu de informatie??
Hans,
Ik lees nog steeds met belangstelling mee. Vermits de code van INFO is, zal ik me niet moeien met het inhoudelijke ervan.
Toch een algemene opmerking op gebied van Visual Basic zelf . Je schrijft :
Public Sub Lezenlenz(buffer)
Dim inbyte As String
Dim tel As Integer
Het is beter om de "dim" regels vooraan in het algemene stuk van je programma te plaatsen. Zoals jij het schrijft zal VB telkens je Lezenlenz oproept inbyte en tel initialiseren : dat kost tijd.
Erik
Tijd is er meer dan genoeg, de PC en het programma gaan vele male sneller dan dat Lenz de gegevens kan verwerken.
Maar je hebt natuurlijk gelijk. De code is al 25 jaar geleden geschreven toendertijd in QB 4.5 en is met heel weinig aanpassingen over gezet in VB6.0.
Het werkt, en als iets werkt moet je er vanaf blijven is mijn ervaring.
citaat:
Geplaatst door INFO
...
Het werkt, en als iets werkt moet je er vanaf blijven is mijn ervaring.
Dat is een gezonde redenering in de informaticawereld. [;)]
Hans,
Hier heb je een werkend voorbeeld, op basis van de eerder getoonde code.
Link verwijdert, hij heeft zijn werk gedaan, en is verder niet meer nodig.
Voor Visual Basic heb ik C++ gebruikt. Dat ging zeer snel. Na de overstap had ik bedenkingen bij de snelheid van Visual Basic. Ik optimaliseerde alles naar snelheid. Mijn opmerking is ??n van de mogelijkheden om tijd te winnen, niet zelf uitgevonden, maar gevonden in de literatuur terzake.
Latere metingen hebben geleerd dat er geen problemen zijn met de snelheid van Visual Basic -exe's. Toch blijf ik die zaken toepassen : tijd heb je nooit genoeg. Geheugenruimte ook niet.
Erik
Stringconcatenatie in Visual Basic :
Naam = Voornaam & Familienaam
Erik
citaat:
Geplaatst door buckfast_beekeeper
citaat:
Geplaatst door eve
Hans,
Ik heb het wel iets moeilijker met de naamgeving van de variabele
Dim inbyte As String
Dim tel As Integer
Dit is zeker geen coherente en logische naamgeving.
Dim strIn As String
Dim intTel As Integer
lijken me hier veel logischer.
Om code leesbaar te houden, zijn er nog wel wat basis regeltjes. Indien gewenst kan ik er nog wel wat toevoegen.
Dat hoeft niet, die regels zijn mij bekend, alleen zoals ik al zei, de code is al oud, en werkt dus verander ik daar niets aan.
Zie deze code, die zal meer voldoen aan jouw basis regeltjes. Of het leesbaarder is, daar verschillen de meningen over.
Public Sub OpenNieuwBaanPlanDeel2(ByVal p_bAborted As Boolean)
'Aanmaken directory structuur voor nieuwe baan
Dim sPathAndFile As String
Dim bDoorgaan As Boolean
Dim iCounter As Integer
If p_bAborted Then
'Cancel ingedrukt op het formulier
bDoorgaan = False
'zet oude baan weer terug (indien geladen) en toon deze
g_sGekozenBaan = m_sOudeGekozenBaan
If g_sGekozenBaan <> "" Then
Call ShowBaanPlanForm
End If
Else
bDoorgaan = True
End If
If bDoorgaan Then
'Nu het controleren van de directories en aanmaken van de directories voor de nieuwe baan
sPathAndFile = GetUserDocumentsAndSettingsPath(CSIDL_PERSONAL) & "" & App.ProductName & "Banen" & g_sGekozenBaan
If Dir(sPathAndFile, vbDirectory) <> "" Then
'Baan (if in ieder geval de directory) bestaat reeds
If MsgBox(GetText(LoadText(CInt(123)), g_sGekozenBaan) & vbCrLf & vbCrLf & LoadText(CInt(124)) & vbCrLf & vbCrLf & sPathAndFile, vbInformation + vbYesNo) = vbYes Then
'Overschijven, echt zeker weten ?
If MsgBox(GetText(LoadText(CInt(125)), g_sGekozenBaan), vbCritical + vbOKCancel) = vbOK Then
'Oude directory helemaal weggooien
Call KillBaanPlan(sPathAndFile)
Call MsgBox(GetText(LoadText(CInt(126)), g_sGekozenBaan), vbInformation + vbOKOnly)
Else
'Vertel gebruiker dat ie een andere naam moet gebruiken
Call MsgBox(LoadText(CInt(127)), vbInformation + vbOKOnly)
g_sGekozenBaan = ""
bDoorgaan = False
End If
Else
g_sGekozenBaan = ""
bDoorgaan = False
End If
End If
End If
If bDoorgaan Then
'Directory aanmaken
Call MkDir(sPathAndFile)
'Aanmaken INI file voor de nieuwe baan, beginnen met alleen
' de datum gemaakt en gewijzigd.
g_sINIFileName = GetUserDocumentsAndSettingsPath(CSIDL_PERSONAL) & "" & App.ProductName & "Banen" & g_sGekozenBaan & "" & g_sGekozenBaan & gsINIEXTENSION
Call WriteINI(gsINIGENERAL, gsINICREATED, CStr(Now()))
Call WriteBaanLastModified
Call WriteINI(gsINIGENERAL, gsININAME, g_sGekozenBaan)
Call WriteINI(gsINIGENERAL, gsINISCALE, IIf(frmBaanInstellingen.optSchaalN.Value = True, "N", "HO"))
Call WriteINI(gsINIGENERAL, gsINIGRIDVISIBLE, IIf(frmBaanInstellingen.chkShowGrid.Value = vbChecked, "True", "False"))
Call WriteINI(gsINIGENERAL, gsINITRACKFORMS, frmBaanInstellingen.txtBaanSchermen.Text)
Call WriteINI(gsINITRACKFORM & "000", gsININAME, LoadText(CInt(175)))
Call WriteINI(gsINITRACKFORM & "000", gsINISIZEHORIZONTAL, "20")
Call WriteINI(gsINITRACKFORM & "000", gsINISIZEVERTICAL, "10")
Call BaanPlanProperties(CInt(0))
Call OpenNieuwBaanPlanDeel3
Else
'Indien nodig, instellingen formulier unloaden
If IsFormLoaded("frmBaanInstellingen") Then
Unload frmBaanInstellingen
End If
'Menu tonen
Call SetMainMenu
End If
End Sub
Maar laten we het houden waar het hier eigenlijk omgaat, en dat is iemand met weinig basiskennis helpen iets voor elkaar te krijgen.
Liefst zo simpel en begrijpelijk mogelijk.
Beste forumleden,
Ik wil jullie bij deze heel veel dank zeggen. INFO met de intensieve, persoonlijke en succesvolle reacties. Erik voor z'n kennis en vooral z'n peptalk die mij de moed gaf om toch door te gaan ondanks m'n geringe basiskennis. Alle andere forumleden voor de moeite die ze genomen hebben om kennis aan mij over te dragen.
Met het laatste zip-bestand van INFO heb ik (heeft INFO) mijn LF101 aan de praat gekregen. Nu ga daarmee experimenteren en m'n basiskennis VB oppoetsen. Daar ben ik wel even druk mee denk ik. Ik zal met belangstelling de discussie over dit onderwerp blijven volgen.
Nogmaals dank en groet.
Hans
Beste bijenhouder, dat er in deze code niet wordt ingesprongen heeft te maken met copy en paste,dus ga er maar gerust van uit dat in het origineel ingesprongen wordt. Verder vind ik dit een nutteloze discussie, waarbij de vraagsteller zeker niet zijn voordeel mee zal doen.
Och ik zal de schouders nog maar eens ophalen me verbazen, en me dan maar omdraaien om verder te gaan met belangrijkere dingen dan deze nutteloze discussie waar niemand iets aan heeft.