Modelspoormagazine forum

Modelspoor, praktijk => Modelspoor digitaal => Topic gestart door: h.evering op 17 februari 2008, 10:11:05 AM

Titel: Lenz en Visual Basic
Bericht door: h.evering op 17 februari 2008, 10:11:05 AM

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 ?
Titel: Lenz en Visual Basic
Bericht door: Flip2 op 17 februari 2008, 15:31:16 PM
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
Titel: Lenz en Visual Basic
Bericht door: ysbeer op 17 februari 2008, 16:28:17 PM
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
Titel: Lenz en Visual Basic
Bericht door: h.evering op 17 februari 2008, 17:15:38 PM
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

Titel: Lenz en Visual Basic
Bericht door: eve op 20 februari 2008, 19:34:48 PM
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

Titel: Lenz en Visual Basic
Bericht door: h.evering op 21 februari 2008, 00:00:45 AM
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


Titel: Lenz en Visual Basic
Bericht door: eve op 26 februari 2008, 13:55:55 PM
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
Titel: Lenz en Visual Basic
Bericht door: h.evering op 27 februari 2008, 20:12:03 PM
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
Titel: Lenz en Visual Basic
Bericht door: INFO op 28 februari 2008, 00:05:11 AM
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.

Titel: Lenz en Visual Basic
Bericht door: eve op 28 februari 2008, 00:17:00 AM
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
Titel: Lenz en Visual Basic
Bericht door: eve op 28 februari 2008, 10:09:33 AM
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
Titel: Lenz en Visual Basic
Bericht door: h.evering op 29 februari 2008, 17:58:08 PM
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
Titel: Lenz en Visual Basic
Bericht door: eve op 29 februari 2008, 19:32:24 PM
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
Titel: Lenz en Visual Basic
Bericht door: GeM op 29 februari 2008, 19:34:54 PM
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.
Titel: Lenz en Visual Basic
Bericht door: INFO op 29 februari 2008, 23:54:28 PM
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.
Titel: Lenz en Visual Basic
Bericht door: INFO op 01 maart 2008, 00:05:50 AM
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.


Titel: Lenz en Visual Basic
Bericht door: eve op 01 maart 2008, 09:49:40 AM
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
Titel: Lenz en Visual Basic
Bericht door: Flip2 op 01 maart 2008, 11:45:27 AM
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
Titel: Lenz en Visual Basic
Bericht door: INFO op 01 maart 2008, 12:44:52 PM
Flip, dan heb jij wel een hele speciale versie. Het aantal tekens is onbekend, je weet namelijk niet wat het systeem gaat zenden.
Titel: Lenz en Visual Basic
Bericht door: INFO op 01 maart 2008, 13:52:14 PM
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


Titel: Lenz en Visual Basic
Bericht door: eve op 01 maart 2008, 16:14:46 PM
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
Titel: Lenz en Visual Basic
Bericht door: h.evering op 01 maart 2008, 16:18:40 PM
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
Titel: Lenz en Visual Basic
Bericht door: Flip2 op 01 maart 2008, 16:42:44 PM
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
Titel: Lenz en Visual Basic
Bericht door: INFO op 01 maart 2008, 17:43:06 PM
citaat:
Geplaatst door Flip2

Wat INFO schrijft zal wel werken denk ik
Gr
Flip



Ja Flip, daar hoef je niet aan te twijfelen.

Titel: Lenz en Visual Basic
Bericht door: h.evering op 02 maart 2008, 11:47:17 AM
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
Titel: Lenz en Visual Basic
Bericht door: INFO op 03 maart 2008, 00:33:47 AM
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
Titel: Lenz en Visual Basic
Bericht door: h.evering op 04 maart 2008, 20:32:19 PM
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
Titel: Lenz en Visual Basic
Bericht door: INFO op 04 maart 2008, 22:27:24 PM
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??



Titel: Lenz en Visual Basic
Bericht door: eve op 05 maart 2008, 10:20:11 AM
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
Titel: Lenz en Visual Basic
Bericht door: INFO op 05 maart 2008, 16:42:17 PM
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.
Titel: Lenz en Visual Basic
Bericht door: doomslu op 05 maart 2008, 18:18:25 PM
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. [;)]
Titel: Lenz en Visual Basic
Bericht door: INFO op 05 maart 2008, 18:40:43 PM
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.
Titel: Lenz en Visual Basic
Bericht door: eve op 05 maart 2008, 19:38:15 PM
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

Titel: Lenz en Visual Basic
Bericht door: eve op 05 maart 2008, 19:45:19 PM
Stringconcatenatie in Visual Basic :

Naam = Voornaam & Familienaam

Erik
Titel: Lenz en Visual Basic
Bericht door: INFO op 05 maart 2008, 20:08:32 PM
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.
Titel: Lenz en Visual Basic
Bericht door: h.evering op 05 maart 2008, 21:15:25 PM
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
Titel: Lenz en Visual Basic
Bericht door: INFO op 05 maart 2008, 22:51:36 PM
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.
Titel: Lenz en Visual Basic
Bericht door: INFO op 06 maart 2008, 11:04:56 AM
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.