Ciao, vorrei scrivere un piccolo programma in VB.NET che simuli il numero di giri del tachimetro VDO NEC 24c32/64, ad esempio per modelli come Passat 3C, Golf 6, T5.2, ecc.
Purtroppo, funziona solo per 4-5 secondi e poi non succede più nulla! La luce LED lampeggia allora in rosso/verde. Probabilmente ho commesso un errore nel programma. Qualcuno ha esperienza con questo problema?
Il mio codice:
Codice:
Imports System
Imports System.Threading
Imports System.IO.Ports
Imports System.ComponentModel
Public Class Form1
Dim myPort As Array
Dim valuehex As String
Dim x280 As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myPort = IO.Ports.SerialPort.GetPortNames() 'Array mit den COM Ports füllen
ComboBox1.Items.AddRange(myPort) 'Array in Combo Box laden
Timer1.Start() 'timer 1 Starten
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'open Button
Try
SerialPort1.PortName = ComboBox1.SelectedItem
SerialPort1.Open() 'Serial Port 1 öffnen
Button2.Enabled = True
Button1.Enabled = False
SerialPort1.Write("S6" & vbCr) 'RKS CAN auf 500hBit/s
Catch ex As Exception
MsgBox("Bitte COM-Port auswählen!")
End Try
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'close Button
Timer1.Stop()
SerialPort1.Write("C" & vbCr) 'CAN Channal schliesen
SerialPort1.Close()
Button1.Enabled = True
Button2.Enabled = False
End Sub
Private Sub Timer1_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If SerialPort1.IsOpen Then 'abfragen ob Serial Port geöffnet ist
If TrackBar1.Value > 0 Then
'Trackbar Value in drehzahl umrechnen
valuehex = Hex(TrackBar1.Value * 4)
If valuehex.Length = 1 Then
valuehex = "000" & valuehex
ElseIf valuehex.Length = 2 Then
valuehex = "00" & valuehex
ElseIf valuehex.Length = 3 Then
valuehex = "0" & valuehex
End If
Motivo: Purtroppo, non stai valutando i codici di ritorno dei comandi "apri", "chiudi" e "invia". L'apertura e la chiusura dell'interfaccia CAN potrebbero richiedere un po' di tempo.
Probabilmente, con tutte queste operazioni di apertura e chiusura, si arriverà a una situazione in cui il sistema sarà aperto e dovrà essere riaperto, e a quel punto succederanno solo cose senza senso.
La procedura corretta sarebbe:
- Aprire (O), dopo aver impostato la velocità di trasmissione corretta sul bus CAN.
- Successivamente, trasmettere e ricevere solo messaggi CAN.
- Se il tuo programma termina o se devi modificare altri parametri, chiudi prima la connessione CAN (C) e attendi brevemente.
La mia proposta è la seguente:
Sostituisci.
Codice:
SerialPort1.Write("S6" & vbCr) 'RKS CAN auf 500hBit/s
attraverso
Codice:
SerialPort1.Write("C" & vbCr)
Threading.Thread.Sleep(50)
SerialPort1.Write("S6" & vbCr) 'RKS CAN auf 500kBit/s
SerialPort1.Write("O" & vbCr)
Ho riflettuto ancora una volta sul tuo problema e ho modificato ulteriormente il messaggio precedente.
Il commento che ti ho fornito inizialmente riguardo al driver di Windows non era appropriato nel tuo caso, mi sono confuso.
Teoricamente, la maggior parte delle chiamate a "Threading.Thread.Sleep(5)" dovrebbe essere superflua, dato che si spera che la funzione per scrivere sulla porta seriale funzioni correttamente.
Riguardo a:
Citazione:
Die LED blinkt dann rot/grün.{MARCATORE}
Purtroppo la descrizione non è sufficientemente precisa: il lampeggio rosso/verde indica diversi stati a seconda del tipo di lampeggio, inclusi anche lo stato operativo normale con il CAN aperto. Potrebbe registrare il comportamento dei LED e caricarlo qui come allegato?
Certo, fornisci il testo che desideri tradurre e le tue modifiche proposte. Sarò felice di fornirti la traduzione in italiano e di valutare se le tue modifiche hanno risolto il problema.
Ciao,
Purtroppo, potrò testare la tua proposta solo oggi. Sfortunatamente, non funziona. Ho anche caricato un video. Con la prima versione del mio programma, il lampeggio era lento e alternato, circa 1/2 secondo tra rosso e verde. Ora, nel video, è difficile da vedere: si vede principalmente il colore rosso e il verde lampeggia brevemente in mezzo, come se venissero ancora inviati messaggi CAN, ma l'indicatore rimane a 0 giri al minuto.
L'ho provato anche su altri computer, ma il risultato è sempre lo stesso.
Credo di inviare troppi dati alla porta seriale quando simulo i tasti multifunzione tramite pulsanti. Se invece di inviare tutti i messaggi CAN ogni 100 millisecondi con un timer, apro e chiudo il canale CAN solo quando viene premuto un pulsante e invio i dati in quel momento, funziona senza problemi.
Saluti, David.
Simulazione di velocità con errore in VB - VID_20151121_150335.mp4
Come vedo io, l'interfaccia funziona normalmente; quando il sistema CAN viene aperto, le spie passano da verde fisso a rosso, con un lampeggio intermittente del verde.
Ecco lo stato dei LED del dispositivo RKS+CAN (firmware 1070):
LED1: rosso.
LED2: verde.
LED_SELFTEST: LED 1 accesa, LED 2 accesa (LED rossa e verde accese).
LED_BOOT: I LED 1 e 2 lampeggiano contemporaneamente (le luci LED rossa e verde lampeggiano insieme).
LED_OK: LED 1 spenta, LED 2 accesa (stato normale quando collegato tramite USB, la luce verde è accesa).
LED_HWFAILURE: I LED 1 e 2 lampe alternativamente (rosso-verde-rosso-verde...).
LED_CANOPEN: LED 1 accesa, LED 2 lampeggiante (LED rossa accesa, LED verde lampeggiante).
LED_CANERR: LED 1 lampe, LED 2 accesa (il LED rosso lampeggia, il LED verde è acceso).
LED_SWFAILURE: LED 1 accesa, LED 2 spenta (LED rossa accesa).
Citazione:
Credo di inviare troppi dati alla porta seriale quando, tramite i pulsanti, simulo i tasti multifunzione e non invio tutti i messaggi CAN alla porta seriale con il timer ogni 100 ms.
Inviare alcuni messaggi ogni 100 millisecondi non dovrebbe essere un problema.
Cosa succede se si interrompe la connessione CAN? La spia LED torna a illuminarsi di verde fisso?
Se invii nuovamente i tuoi messaggi, l'indicatore del regime di giri torna a indicare 4000 rpm?
Quale versione di Visual Studio utilizzi? Le versioni 2008 e 2015 sarebbero utili per testare il tuo programma in Visual Basic.
Oggi, per caso, ho scoperto che quando l'interfaccia non è collegata al tachimetro, tutto funziona normalmente! Quindi, il problema deve essere dovuto ai messaggi CAN in entrata. Ora, ad ogni ciclo del timer, svuoto il buffer di input del driver seriale e tutto funziona come dovrebbe.
Codice:
SerialPort1.DiscardInBuffer()
Vielen Dank für deine Hilfe!!
Ecco il mio esempio di progetto realizzato con VB .NET 2010.
Saluti.
David.
RKS CAN Test 2.zip
Descrizione:
Beispiel Ansteuerung Kombiinstrument/Instrumentenbrett mit RKS+CAN, Visual Basic .NET 2010
Per completezza, chi desidera semplicemente testare un'intelligenza artificiale può configurare anche i messaggi CAN da inviare direttamente in KCANMonitor. Non è necessario programmare nulla, ma è sufficiente inserire i messaggi che si desidera trasmettere in KCANMonitor. Questo "mini-programma" può quindi essere salvato (ad esempio come "Test IA-XY") e ricaricato successivamente.