Problem beim Senden und Empfangen auf gleicher Connection

Comprehensive CAN monitor for Windows® and its add-ins: Plotter, CANdb Import, Instruments Panel, and J1939
Christopher
Posts: 10
Joined: Wed 24. Apr 2013, 16:29

Re: Problem beim Senden und Empfangen auf gleicher Connectio

Post by Christopher » Wed 6. Nov 2013, 11:53

U.Wilhelm wrote:OK, Sie lesen nicht richtig
Besten Dank für den Hinweis.

Code: Select all

   ' Hier lesen Sei in einer loop die queue des Treiber solange bis eine Nachricht in der Queue gefunden wurde
   ' genau eine wird dann gelesen und in die CAN Datenstruktur "RcvMsg" kopiert 
   ' #Einverstanden
   Do While not RcvMsg.Read  ' Eingehende Msg im 10 ms Takt
      Wait 10 ' wenn 10 ms dann auch 10 ms verwenden
   Loop
   ' Jetzt haben Sie eine Nachricht empfangen und müssen sehen ob diese gültig war und ob das Datenbyte 1 den Wert 01 hat
   ' #Einverstanden
    If (RcvMsg.LastError = pcanErrorOk) And (RcvMsg.Data(0) = &H01) Then
      'jetzt schreiben den Inhalt des Datenbyte 2 in die Variable Wert
      ' #Einverstanden
      Wert= RcvMsg.Data(1) ' Wert aus DB1 lesen
    End If
   ' Wenn das lesen beim ersten Durchlauf nicht OK war, oder das Datenbyte 1 nicht 0x01, dann steht in Wert "irgendwas"
    ' #Nein, nicht "irgendetwas" sondern der letzte gültige Wert - oder täusche ich mich da?
    ' #Es ist die Absicht, dass der letzte gültige Wert bleibt bis ein neuer gültiger Wert kommt.
    msg.Data(0) = Wert ' Diese Zeile hatte ich, wie mehrmals oben erwähnt, nachträglich eingeführt 
   ' ja ist ja schön - aber was für ein Sinn hat das? msg ist doch eine komplette andere CAN Msg Struktur - Sie schreiben da jetzt halt den Wert rein ..OK?
   ' #Ja, ich kopiere den Wert von der Empfangs-Struktur in die Sende-Stuktur, wo liegt das Problem darin?
   ' #Siehe auch Frage weiter unten.
   ' wenn das zweite mal durch die Loop gegangen wird ist da auch noch der Altwert drin - sie löschen die Werte ja nicht nach einer Loop...
    'PrintToOutputWindow "Wert : " & Wert 
    If (Wert < 6) Then ' Nur wenn Wert <6
      If (MyClient.XmtQueueEmpty) Then ' und die Queue leer (macht keinen Sinn Queue ist 32.000 Nachrichten groß - wenn Sie die erreicht haben haben sie ein anders Problem)
      ' # Es geht gar nicht darum, dass ich Angst habe vor einem vollen Buffer, aber um die Echtzeit.
      ' # D.h. lieber kein Wert als ein alter Wert auf dem Bus. Trotzdem danke für den Hinweis.
        msg.Write PcanConn, 0   ' so -- und nun schreiben Sie die CAN Struktur "msg" NICHT die "RcvMsg" - das sind doch 2 verschiedene Variabeln ...ist doch logisch oder
      ' # Ja, wo liegt das Problem? Siehe unten.
      ' klar sendet er jetzt den Wert raus wenn Sie vorher den Wert in diese CAN MSG Struktur geschrieben haben , ansonsten wird er "irgendwas" schreiben - sie haben ja nichts eingestellt 
        msg.Write PcanConn, (MyClient.GetSystemTime + 5) ' und hier nochmal , halt nur 5ms später
      End If
    End If
Sie haben mir nun mehrmals deutlich zu verstehen gegeben, dass offenbar ein grosses Problem besteht, wenn ich für das Empfangen eine andere Struktur verwende als für das Senden und dabei einen empfangenen Wert (ob nun aktuell oder "veraltet") in die zu sendende Struktur kopiere. Ich wäre Ihnen wirklich dankbar, wenn sie dieses Problem genauer erläutern könnten. Es ist mir weder klar, weshalb das die Ursache für mein Problem sein könnte, noch weshalb es auch sonst problematisch ist. Die zu empfangende CAN message und die zu sendende CAN message haben nun Mal eine unterschiedliche Form (z.B. DLC), weshalb sollte ich dafür nicht eigene Strukturen verwenden?

K.Wolf
Software Development
Software Development
Posts: 141
Joined: Wed 22. Sep 2010, 15:37

Re: Problem beim Senden und Empfangen auf gleicher Connectio

Post by K.Wolf » Thu 7. Nov 2013, 12:39

Hallo,

ich habe das auch mal ausprobiert. Ich nehme den Code aus dem ersten Beitrag und baue die fehlende Zeile

Code: Select all

msg.Data(0) = Wert

ein, dann funktioniert bei mir alles wie erwartet.
Hier ein Ausschnitt aus einem Trace, aufgenommen mit PCAN-View:

Code: Select all

  1271)      4453.4  Tx         0400  2  01 00 
  1272)      4455.7  Rx         0181  2  00 00 
  1273)      4460.7  Rx         0181  2  00 00 
  1274)      4463.5  Tx         0400  2  01 00 
  1275)      4465.8  Rx         0181  2  00 00 
  1276)      4470.6  Rx         0181  2  00 00 
  1277)      4473.4  Tx         0400  2  01 00 
  1278)      4475.8  Rx         0181  2  00 00 
  1279)      4480.7  Rx         0181  2  00 00 
  1280)      4483.6  Tx         0400  2  01 03 <- Änderung von 0 auf 3
  1281)      4485.8  Rx         0181  2  03 00 
  1282)      4490.7  Rx         0181  2  03 00 
  1283)      4493.6  Tx         0400  2  01 03 
  1284)      4495.8  Rx         0181  2  03 00 
  1285)      4500.7  Rx         0181  2  03 00 
  1286)      4503.5  Tx         0400  2  01 03 
  1287)      4505.8  Rx         0181  2  03 00 
  1288)      4510.7  Rx         0181  2  03 00 
PCAN-View sendet im 10ms Takt die 400h über einen CAN-Bus über PCAN-PCI. Auf der anderen Seite läuft das Makro in PCAN-Explorer und sendet jeweils 2 Antworten 181h im Abstand von 5ms. Dabei wird der Inhalt von Datenbyte 1 jeweils in Datenbyte 0 der Antwort kopiert.
In Zeile 1280 wurde anstatt der 0 die 3 in Datenbyte 1 gesendet, was auch prompt vom Makro übernommen und in die Anwort eingebaut wurde. Wo genau liegt das Problem?
Man kann den gesendeten Wert beliebig von 0 bis 5 ändern, das Makro übernimmt immer den neuen Wert in die Antwort.
Wenn man jetzt irgendwelche IDs ändert muss man natürlich aufpassen, dass in Empfangsrichtung der Filter angepasst wird, bzw. beim Senden nicht andere Module am Bus sind, welche die gleiche ID senden.

Hier nochmal der komplette Code:

Code: Select all

Sub Versuch()

  Dim MyClient, PcanConn
  Set MyClient = CreateObject("PCAN3.PCANClient")
  MyClient.Device = "pcan_pci"
  MyClient.Name = "Macro"
  Set PcanConn = MyClient.Connections.Add("PCI2")
  
  Dim msg
  Set msg = MyClient.Messages.Add
  With msg
     .ID = &H181
     .DLC = 2
     .Data(0) = &H00
     .Data(1) = &H00
  End With
  
  PcanConn.RegisterMsg &H400, &H400, False, False
  Dim RcvMsg
  Set RcvMsg = MyClient.Messages.Add
  
  Dim Wert
  
  Wait 1000
  
  While true
  ' Endless loop
  
    Do While not RcvMsg.Read  ' Eingehende Msg im 10 ms Takt
      Wait 1
    Loop
    If (RcvMsg.LastError = pcanErrorOk) And (RcvMsg.Data(0) = &H01) Then
      'read Wert
      Wert= RcvMsg.Data(1)
    End If

    msg.Data(0) = Wert   ' Diese Zeile hat gefehlt

    If (Wert < 6) Then
      If (MyClient.XmtQueueEmpty) Then
        msg.Write PcanConn, 0
        msg.Write PcanConn, (MyClient.GetSystemTime + 5)
      End If
    End If
    
  Wend ' Endless Loop
  
End Sub

User avatar
PEAK-Support
Sales & Support
Sales & Support
Posts: 1646
Joined: Fri 10. Sep 2010, 19:34

Re: Problem beim Senden und Empfangen auf gleicher Connectio

Post by PEAK-Support » Mon 11. Nov 2013, 01:57

Das "Problem" das keines war ist gelöst. Thread geschlossen.
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Locked