Filter setzen, der den Inhalt einer CAN-Nachricht auswertet

Comprehensive CAN monitor for Windows® and its add-ins: Plotter, CANdb Import, Instruments Panel, and J1939
Post Reply
Jacky
Posts: 17
Joined: Tue 24. Apr 2012, 15:25

Filter setzen, der den Inhalt einer CAN-Nachricht auswertet

Post by Jacky » Fri 7. Feb 2014, 13:23

Hallo,

kann man im PCAN Explorer einen Filter setzen, der eine bestimmtee ID nur durchlässt, wenn sowohl die ID als auch der Inhalt einer bestimmten Bedingung entspricht?

Z.B. möchte ich die ID 0x100 nur dann empfangen, wenn in Byte 0 der Wert größe 200 ist. Geht so etwas?
Die ID wird alle 5ms gesendet und irgendwo mittendrin tritt die Nachricht mit einem großen Wert in Byte 0 auf. Es wäre sehr mühsam die ganze Traceliste durchzusehen und genau die eine ID zu finden, die diesen großen Wert enthält.

Mfg
Jacky

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

Re: Filter setzen, der den Inhalt einer CAN-Nachricht auswer

Post by PEAK-Support » Fri 7. Feb 2014, 14:18

Die Filtermechanismen im PCAN-Explorer 5 erlauben das Filtern von
- CAN ID
- ACC Code/Mask (SJA1000 based)
- Symboldatei (es werden nur die in der SYM Datei angelegten Daten angezeigt)
- Selektierte Symbole (es werden nur die in der SYM Datei angelegten Daten angezeigt die vorher selektiert wurden)
- Fehler Frames (Errorframes)
- J1939 spezifische Werte
PE5-Filter Settings
PE5-Filter Settings
PE5-Filter-ReceiveWindow.JPG (65.3 KiB) Viewed 8344 times
Wenn Sie Filtern wollen nach ID und Dateninhalt, so ist dies aber sehr einfach über ein Script möglich. Das kann entweder Signalbasierend oder HEX Datenbasierend gemacht werden.
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Jacky
Posts: 17
Joined: Tue 24. Apr 2012, 15:25

Re: Filter setzen, der den Inhalt einer CAN-Nachricht auswer

Post by Jacky » Fri 7. Feb 2014, 14:33

Und wie würde solch ein Script, das HEX-Datenbasierend ist, beispielsweise aussehen?
Jacky

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

Re: Filter setzen, der den Inhalt einer CAN-Nachricht auswer

Post by PEAK-Support » Fri 7. Feb 2014, 14:47

Wenn man im PE5 HEX basierend mit Macros arbeiten möchte, was eigentlich nicht unbedingt Sinn und Zweck dieses Tools ist, dass macht man dann wohl besser mit einem kleinen C++/C# oder Delphi, Python oder Java Programm unter Verwendung der PCAN-Basic API, dann kann das so aussehen wie im Script unten. Sobald eine CAN Nachricht mit DLC >0 und Datenbyte 1 = 0x80 empfangen wird, wird eine Info im Macro Ausgabefenster angezeigt - hier kann dann eine andere Routine aufrufen oder was auch immer machen (z.B. ein Tracer starten, CAN Nachrichten versenden usw.)

Wenn die CAN ID 0x001 empfangen wird beendet sich das Macro, und gibt die Anzahl der CAN Frames aus in denen das erste Byte 0x80 war.

Code: Select all

'------------------------------------------------------------------------------
'FILE DESCRIPTION:RecvCAN Data
'------------------------------------------------------------------------------

Sub RecvCANData()
'DESCRIPTION: Read CAN Data - see if in a defined CAN Msg data one Bit is set
  ' To view the output messages of this macro, open the Output Window and
  '  select the "Macro" tab
  Dim Myclient, MyConn
  Set MyClient = CreateObject("Pcan3.PCANClient")
  MyClient.Name = "RecvCANDataMacro"
  If Connections.Count > 0 And Connections(1).Protocol = peProtocolCAN Then
    ' Connect to the same Net that the first connection in the
    '  current project uses
    Dim obj
    Set obj = Connections(1).CommunicationObject
    MyClient.Device = obj.Parent.Device
    Set MyConn = MyClient.Connections.Add(obj.NetName)
  Else
    ' Connect to the default "TestNet"
    Set MyConn = MyClient.Connections.Add("TestNet")
  End IF

  If MyConn.IsConnected = False Then
	MsgBox "Cannot connect to Net" 
	Exit Sub
  End If

  ' Optinal Filters - reduce workload 
  ' MyConn.RegisterMsg &H000, &H800, False, False
  ' or
  ' MyConn.RegisterMsg &H00000000, &H1FFFFFFF, True, True
  ' or 
  ' MyConn.RegisterMsg &H600, &H1FFFFFFF, True, True

  PrintToOutputWindow "Start the Read...."
  i = 0
  Dim RcvMsg
  Set RcvMsg = MyClient.Messages.Add
  Do
  	Do While not RcvMsg.Read
	  ' Wait for a received message
	   Wait(10)	' Prevent 100% CPU load
    Loop
	If RcvMsg.LastError = pcanErrorOk Then
	 If RcvMsg.DLC > 0 Then ' Yes, >0 DLC ist OK 
	  If RcvMsg.Data(0) AND &h80 Then
	  	PrintToOutputWindow "Received CAN ID: " & CStr(RcvMsg.ID)
	    PrintToOutputWindow "Data0 is set to 0x80"
	    i = i + 1
	   End If
	  End If  
	End IF
  Loop While RcvMsg.ID <> &H001 ' Stop when receiving ID 0x001
  PrintToOutputWindow "Finished, " & CStr(i) & " messages 0x80 in Data0 received !"
End Sub
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Jacky
Posts: 17
Joined: Tue 24. Apr 2012, 15:25

Re: Filter setzen, der den Inhalt einer CAN-Nachricht auswer

Post by Jacky » Fri 7. Feb 2014, 15:25

Danke für das Beispiel, werde es bei Gelegenheit ausprobieren.
Jacky

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

Re: Filter setzen, der den Inhalt einer CAN-Nachricht auswer

Post by PEAK-Support » Fri 7. Feb 2014, 15:43

Der PE5 wird mit Bsp. Scripten ausgeliefert. Diese befinden sich im Macros Verzeichnis in der Datei Sample.pem
Dort finde Sie auch Funktionen die ähnlich arbeiten:

Code: Select all

Sub WaitForID100()
'DESCRIPTION: Waits until CAN-ID 100h is received
  ' To view the output messages of this macro, open the Output Window and
  '  select the "Macro" tab
  Dim UseConn, conn
  ' Find the first enabled connection in the project that uses the CAN protocol
  Set UseConn = Nothing
  For Each conn In Connections
    If conn.IsEnabled And conn.Protocol = peProtocolCAN Then
      Set UseConn = conn
      Exit For
    End If
  Next 
  If UseConn Is Nothing Then
    MsgBox "Project does not contain any enabled CAN connections"
    Exit Sub
  End If

  ' Create a new client and connect it to the same Net that the
  '  found connection uses
  Dim MyClient, PcanConn
  Set MyClient = CreateObject("PCAN3.PCANClient")
  MyClient.Name = "Macro"
  MyClient.Device = UseConn.Device
  Set PcanConn = MyClient.Connections.Add(UseConn.CommunicationObject.NetName)

  PcanConn.RegisterMsg &H100, &H200, False, False
  i = 0
  Dim RcvMsg
  Set RcvMsg = MyClient.Messages.Add
  Do
    Do While not RcvMsg.Read
      ' Wait for a received message
    Loop
    If RcvMsg.LastError = pcanErrorOk Then
      PrintToOutputWindow "Received !"
      i = i + 1
    End IF
  Loop While RcvMsg.ID <> &H100
  PrintToOutputWindow "Finished, " & CStr(i) & " messages received !"
End Sub
--------------------------------
PEAK-System Technik
Technical Support Team
support[at]peak-system.com
-------------------------------

Post Reply