Nieuws:

Nu in MSM 249 BAAN: Saint-Hilaire * RĂ¼gen kustbaan

Hoofdmenu

Lenz en Visual Basic

Gestart door h.evering, 17 februari 2008, 10:11:05 AM

h.evering


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 ?
 

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

ysbeer

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

h.evering

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

 

eve

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 :



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


h.evering

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


 

eve

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

h.evering

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
 

INFO

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.

Alleen de waarheid ligt in het midden.

eve

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

eve

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

h.evering

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
 

eve

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

GeM

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.
Gert
HO, 3-rail, NMBS/DB, III, Ecos I

INFO

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.
Alleen de waarheid ligt in het midden.