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

Problem beim Senden und Empfangen auf gleicher Connection

Post by Christopher » Wed 23. Oct 2013, 10:14

Hallo

Muss ich beim Empfangen -> Auswerten -> Senden auf der gleichen Connection etwas bestimmtes beachten? Ich habe nämlich folgende Situation: Ich bekomme auf dem Bus eine Message im 10ms Takt. So lange ein Wert in einem bestimmten Bereich ist, möchte ich eine Nachricht im 5ms Takt absenden. Deshalb sende ich immer nach erfolgreichem Empfang zwei Messages, die eine sofort und die eine 5ms später.

Das Problem ist nun, dass es nur ohne die zweite Message funktioniert (siehe Code). Dann wird Wert scheinbar korrekt ausgelesen und interpretiert. Sobald ich aber auch die zweite Message sende, funktioniert das irgendwie nicht mehr, es wird zwar im 5ms Takt gesendet aber es scheint so als ob mit dem Empfang etwas nicht mehr funktionieren würde. Kann das ein Problem mit der leistungsfähigkeit des Rechners sein?

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("Versuchsbus")
  
  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

    If (Wert < 6) Then
      If (MyClient.XmtQueueEmpty) Then
        msg.Write PcanConn, 0
        msg.Write PcanConn, (MyClient.GetSystemTime + 5) 'OHNE DIESE ZEILE FUNKTIONIERT ES GRUNDSAETSLICH
      End If
    End If
    
  Wend ' Endless Loop
  
End Sub
Besten Dank,
Chris

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 » Wed 23. Oct 2013, 16:20

Ich habe das ganze hier mal ausprobiert und mir dabei mit einem PCAN-View als Tracer die Daten aufgezeichnet - funktioniert ohne Probleme ?!?

Code: Select all

;$FILEVERSION=1.1
;$STARTTIME=41570.6758391667
;
;   C:\Users\Support\Desktop\Trace.trc
;
;   Start time: 23.10.2013 16:13:12.504.0
;
;   Message Number
;   |         Time Offset (ms)
;   |         |        Type
;   |         |        |        ID (hex)
;   |         |        |        |     Data Length Code
;   |         |        |        |     |   Data Bytes (hex) ...
;   |         |        |        |     |   |
;---+--   ----+----  --+--  ----+---  +  -+ -- -- -- -- -- -- --
     1)      3955.2  Rx         0400  8  01 03 21 43 02 01 05 64 
     2)      3956.0  Rx         0181  2  00 00 
     3)      3960.9  Rx         0181  2  00 00 
     4)      6467.1  Rx         0400  8  01 03 21 43 02 01 05 64 
     5)      6468.0  Rx         0181  2  00 00 
     6)      6472.9  Rx         0181  2  00 00 
     7)     10770.7  Rx         0400  8  01 03 21 43 02 01 05 64 
     8)     10770.9  Rx         0181  2  00 00 
     9)     10775.9  Rx         0181  2  00 00 
    10)     13186.6  Rx         0400  8  01 03 21 43 02 01 05 64 
    11)     13187.0  Rx         0181  2  00 00 
    12)     13191.9  Rx         0181  2  00 00 
    13)     16722.5  Rx         0400  8  01 03 21 43 02 01 05 64 
    14)     16723.0  Rx         0181  2  00 00 
    15)     16728.0  Rx         0181  2  00 00 
    16)     17906.3  Rx         0400  8  01 03 21 43 02 01 05 64 
    17)     17907.2  Rx         0181  2  00 00 
    18)     17912.0  Rx         0181  2  00 00 
    19)     18874.3  Rx         0400  8  01 03 21 43 02 01 05 64 
    20)     18875.1  Rx         0181  2  00 00 
    21)     18880.0  Rx         0181  2  00 00 
    22)     21122.5  Rx         0400  8  01 03 21 43 02 01 05 64 
    23)     21123.1  Rx         0181  2  00 00 
    24)     21128.0  Rx         0181  2  00 00 
Haben Sie mal den Tracer mitlaufen lassen? Entweder den internen im PE5 oder einfach ein PCAN-View starten, an das gleiche Netzt hängen und Macro starten und die 0x400 mit DATA0=0x01 und DATA2<6 senden.
Wie sieht den dann Ihr Trace aus?
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Christopher
Posts: 10
Joined: Wed 24. Apr 2013, 16:29

Re: Problem beim Senden und Empfangen auf gleicher Connectio

Post by Christopher » Wed 23. Oct 2013, 17:19

Vielen Dank für den Hilfeversuch. Ich konnte es weiter eingrenzen, es scheint lediglich ein Problem mit der Zuweisung zu der Variable Wert zu geben. Wenn ich nämlich den obigen Code mit

Code: Select all

msg.Data(0) = Wert
vor dem Senden ergänze, kommt da immer 0x00 anstatt der eigentliche Wert... wo das Problem liegt habe ich jedoch noch nicht begriffen, es muss ja fast bei

Code: Select all

Wert = RcvMsg.Data(1)
sein?!?

Chris

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 » Thu 24. Oct 2013, 12:55

Das Problem liegt woanders:
Sie verwenden manchmal msg und manchmal RcvMsg ? Das sind 2 verschiedene CAN Msg Strukturen.

Hier mal das Macro mit ein paar Ausgaben in das Macro Ausgabefenster - das macht das ganze deutlicher:

Code: Select all

'------------------------------------------------------------------------------
'FILE DESCRIPTION: A description was not provided.
'------------------------------------------------------------------------------
Sub Versuch()

  Dim MyClient, PcanConn
  Set MyClient = CreateObject("PCAN3.PCANClient")
  ' MyClient.Device = "pcan_pci"
  MyClient.Device = "pcan_usb"
  MyClient.Name = "Macro"
  Set PcanConn = MyClient.Connections.Add("Versuchsbus")
  
  Dim msg
  Set msg = MyClient.Messages.Add
  With msg
     .ID = &H181
     .DLC = 2
     .Data(0) = &H00
     .Data(1) = &H00
  End With
  
  PrintToOutputWindow "Starte Testablauf"
  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 5
    Loop

    ' Wurde eine Nachricht gelesen (CAM_ERROR_OK) und Data(0) = 1?
    If (RcvMsg.LastError = pcanErrorOk) And (RcvMsg.Data(0) = &H01) Then
      'read Wert
      Wert = RcvMsg.Data(1)
      PrintToOutputWindow "Receive CAN Data and Wert=" & Wert
    
	  If (Wert < 6) Then
      		PrintToOutputWindow "Wert ist kleiner 6: " & Wert
      		If (MyClient.XmtQueueEmpty) Then
        		PrintToOutputWindow "XmtQueueEmpty - sende CAN-ID: " & msg.ID & " mit Datenbyte(0): " & msg.Data(0) & " Datenbyte(1): " & msg.Data(1)
        		msg.Write PcanConn, 0
        		PrintToOutputWindow "XmtQueueEmpty - sende 5ms danach nochmal CAN-ID: " & msg.ID & " mit Datenbyte(0): " & msg.Data(0) & " Datenbyte(1): " & msg.Data(1)
        		msg.Write PcanConn, (MyClient.GetSystemTime + 5) 
      		End If
      		
      End If
    End If
    
  Wend ' Endless Loop
  
End Sub
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Christopher
Posts: 10
Joined: Wed 24. Apr 2013, 16:29

Re: Problem beim Senden und Empfangen auf gleicher Connectio

Post by Christopher » Tue 29. Oct 2013, 11:00

U.Wilhelm wrote:Das Problem liegt woanders:
Sie verwenden manchmal msg und manchmal RcvMsg ? Das sind 2 verschiedene CAN Msg Strukturen.
Das ist mir bewusst, ich lese ja wie oben angedeutet einen Wert auf RcvMsg in die Variable und dann schreibe ich deren inhalt in die Message msg die gesendet wird.

Vielmehr scheint es sich um eine Art Bug zu handeln (Version 5.2.1.768): Wenn ich die ausgehende Message mit einer ID sende die nicht empfangen wird, dann funktioniert alles bestens. Wenn ich aber als ID einen wirklich vorhandenen Empfänger eintrage, dann werden die Variablen schlichtweg einfach nicht mehr aktualisiert! Das zeigt sich auch für Ausgaben in die Output-Konsole. So als ob das ACK etwas durcheinander bringen würde... Zudem verändern Outputs das Verhalten, was auf ein Timing Problem hindeuten könnte. Ich arbeite übrigens mit einem PCAN-TJA1054.

Weiter hatte ich einen "Catastrophic Failure" als ich ein Makro ähnlich zu obigem über das Wochenende laufen liess... könnte es sein, dass die Zeitumstellung dies verursachte?

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 » Tue 29. Oct 2013, 11:22

Was erwarten Sie wenn Sie in eine Variable einen Wert einschreiben, dann aber eine andere Variable senden ??
Das kann nicht funktionieren - und das haben Sie doch in Ihrem Code gemacht. Sie lesen eine CAN Struktur -> RcvMsg, senden dann aber eine nicht mit Werten initialisierte MSG struktur raus -> msg.

Code: Select all

    Do While not RcvMsg.Read  ' Eingehende Msg im 10 ms Takt
      Wait 10 ' wenn 10 ms dann auch 10 ms verwenden
    Loop
    If (RcvMsg.LastError = pcanErrorOk) And (RcvMsg.Data(0) = &H01) Then
      'read Wert
      Wert= RcvMsg.Data(1) ' Wert aus DB1 lesen
    End If

    If (Wert < 6) Then
      If (MyClient.XmtQueueEmpty) Then
        msg.Write PcanConn, 0    ' irgendwas senden - nicht zugeordnet welche ID oder Daten oder DLC...
        msg.Write PcanConn, (MyClient.GetSystemTime + 5) ' und hier nochmal , halt nur 5ms später
      End If
    End If
1. Haben Sie sich Ausgaben erzeugt wie ich es in dem Bsp. vorgegeben habe, oder besser noch das Bsp. verwendet
2. Was wollen Sie uns damit sagen
Wenn ich die ausgehende Message mit einer ID sende die nicht empfangen wird, dann funktioniert alles bestens. Wenn ich aber als ID einen wirklich vorhandenen Empfänger eintrage, dann werden die Variablen schlichtweg einfach nicht mehr aktualisiert!
Sie arbeiten mit Variablen die nicht automatisch im Hintergrund mit Sende oder Empfangsdaten gefüllt werden - Sie haben nur den TYP CAN Msg! Das aktualisieren müssen Sie im Code durchführen (im Gegensatz zu Signalen, hier wird im Hintergrund aktualisiert) Ihre Anmerkung das "Outputs Timing Probleme verursachen " ist auszuschließen, die Treiber arbeiten im Kernel mode - sie sind völlig asynchron zu ihrer Applikation (egal ob PCAN-Explorer VBS oder in C geschrieben). Ebenso hat Ihre Anmerkung
So als ob das ACK etwas durcheinander bringen würde...
kann ich leider nicht verstehen - was haben Sie in diesem Layer mit dem ACK zu tun? Wir sind auf CAN Layer 2 - ACK läuft auf Layer 1 - weit weg von VBS scripten.

Senden Sie uns bitte Ihre verwendete PCAN-Explorer 5 Version inkl. Seriennummer an die support[at]peak-system.com, dann können wir sehen ob Sie eine aktuelle Version verwenden. Das mit dem "Catastrophic Failure" ist bedauerlich, hierzu würden wir dann den Code benötigen um nachzuvollziehen was genau passiert ist. Ein Zusammenhang mit der Zeitumstellung können wir nicht ausschließen.
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Christopher
Posts: 10
Joined: Wed 24. Apr 2013, 16:29

Re: Problem beim Senden und Empfangen auf gleicher Connectio

Post by Christopher » Tue 29. Oct 2013, 17:25

U.Wilhelm wrote:Was erwarten Sie wenn Sie in eine Variable einen Wert einschreiben, dann aber eine andere Variable senden ??
Das kann nicht funktionieren - und das haben Sie doch in Ihrem Code gemacht. Sie lesen eine CAN Struktur -> RcvMsg, senden dann aber eine nicht mit Werten initialisierte MSG struktur raus -> msg.
Nein, ich hatte in meinem zweiten Eintrag beschrieben, dass ich vor dem Senden zusätzlich

Code: Select all

msg.Data(0) = Wert
ausführe, den Wert also der zu sendenen Struktur zuweise. Vielleicht haben Sie das überlesen.
U.Wilhelm wrote: 1. Haben Sie sich Ausgaben erzeugt wie ich es in dem Bsp. vorgegeben habe, oder besser noch das Bsp. verwendet
Ja.
U.Wilhelm wrote: 2. Was wollen Sie uns damit sagen
Wenn ich die ausgehende Message mit einer ID sende die nicht empfangen wird, dann funktioniert alles bestens. Wenn ich aber als ID einen wirklich vorhandenen Empfänger eintrage, dann werden die Variablen schlichtweg einfach nicht mehr aktualisiert!
Wenn ich als ID irgend eine x-beliebige ID eintrage, dann sehe ich im Receive Window oder im Output Window den erwarteten Wert gemäss obigen Code, d.h. die Variable "Wert" scheint korrekt ausgelesen und die zu sendende Nachricht kopiert zu werden. Wenn ich den Code 100% gleich lasse, jedoch die ID eines Gerätes eintrage, welches wirklich im Bus ist, dann wird immer die gleiche Zahl empfagen bzw. im Output Window ausgegeben, so als ob die Variable nicht mehr aktualisiert würde (deshalb der Verdacht mit dem ACK). Einfügen von zusätzlichen PrintToOutputWindow hat das Verhalten verändert, die Variable wurde zum Teil wieder aktualisiert (deshalb der Verdacht mit dem Timing).

Dieses Verhalten ist für mich ganz und gar nicht logisch, sofern es kein Bug ist, bin ich dankbar, wenn Sie mich darüber aufklären können.
U.Wilhelm wrote: Sie arbeiten mit Variablen die nicht automatisch im Hintergrund mit Sende oder Empfangsdaten gefüllt werden - Sie haben nur den TYP CAN Msg! Das aktualisieren müssen Sie im Code durchführen
Siehe oben.
U.Wilhelm wrote: Senden Sie uns bitte Ihre verwendete PCAN-Explorer 5 Version inkl. Seriennummer an die support[at]peak-system.com, dann können wir sehen ob Sie eine aktuelle Version verwenden.
Die Versionsnummer hatte ich im vorigen Post erwähnt, ich werde mich aber noch über die Support Email Adresse melden.

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 » Wed 30. Oct 2013, 09:39

Bitte aktualisieren Sie als erstes Ihren PE5. Den Link finden Sie auf der Startseite der Software. Zur zeit (30.10.2013) ist die 5.3.2 vom 18.04.2013 aktuell. Senden Sie uns bitte ihr komplettes Macro an die support mail adresse. Ich denke wir reden im Moment aneinender vorbei - dann haben wir alle den gleichen Stand um in´s Detail zu gehen. Beachten Sie das die msg Typen nicht automatisch mit CAN Werten gefüllt werden. Diese müssen immer zugeordnet werden. Nur Signale werden im Hintergrund bei Datenempfang aktualisiert.
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Christopher
Posts: 10
Joined: Wed 24. Apr 2013, 16:29

Re: Problem beim Senden und Empfangen auf gleicher Connectio

Post by Christopher » Wed 30. Oct 2013, 13:44

U.Wilhelm wrote: Beachten Sie das die msg Typen nicht automatisch mit CAN Werten gefüllt werden. Diese müssen immer zugeordnet werden. Nur Signale werden im Hintergrund bei Datenempfang aktualisiert.

Code: Select all

    Do While not RcvMsg.Read  ' Eingehende Msg im 10 ms Takt
      Wait 10 ' wenn 10 ms dann auch 10 ms verwenden
    Loop
    If (RcvMsg.LastError = pcanErrorOk) And (RcvMsg.Data(0) = &H01) Then
      'read Wert
      Wert= RcvMsg.Data(1) ' Wert aus DB1 lesen
    End If

    msg.Data(0) = Wert ' Diese Zeile hatte ich, wie mehrmals oben erwähnt, nachträglich eingeführt.
    'PrintToOutputWindow "Wert : " & Wert 

    If (Wert < 6) Then
      If (MyClient.XmtQueueEmpty) Then
        msg.Write PcanConn, 0   
        msg.Write PcanConn, (MyClient.GetSystemTime + 5) ' und hier nochmal , halt nur 5ms später
      End If
    End If

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 » Wed 30. Oct 2013, 14:50

OK, Sie lesen nicht richtig - hier ein letzter Versuch...

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 
	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
    If (RcvMsg.LastError = pcanErrorOk) And (RcvMsg.Data(0) = &H01) Then
      'jetzt schreiben den Inhalt des Datenbyte 2 in die Variable Wert
      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"
    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?
	' 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)
        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
		' 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
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Locked