Code: Select all
'------------------------------------------------------------------------------
'
' FILE DESCRIPTION: Routefrom CAN1 1:1 to CAN2
' (c) 2013 by PEAK-System Technik GmbH
'
'------------------------------------------------------------------------------
Sub Router1to1()
' Dim the needed VARs (not a must in VBS)
Dim MyClient1, MyClient2
Dim MyConn1, MyConn2
Dim obj
Dim RecvMsgClient1, SendMsgClient2
' Create a real PCAN Client for every communication (see PCAN-Stat after start the macro -> very interesting!)
Set MyClient1 = CreateObject("Pcan3.PCANClient")
Set MyClient2 = CreateObject("Pcan3.PCANClient")
' use the PCAN-USB.SYS driver - could also be replaced by PCAN_PCI, PCAN_PCC etc. or you mixed up
' if you remove this two lines the default driver, which is set in controll panel PCAN2.CPL, will be used
MyClient1.Device = "pcan_usb"
MyClient2.Device = "pcan_usb"
' give them a name - this is up to you...(you will se the name again in PCAN-Stat)
MyClient1.Name = "RouterCAN1"
MyClient2.Name = "RouterCAN2"
' Connect to the pre defined Nets
' These Nets have to be setup up in front with the NetCfg Tool - here you could define which USB Device use which NET/Baudrate
Set MyConn1 = MyClient1.Connections.Add("500K-1")
Set MyConn2 = MyClient2.Connections.Add("500K-2")
' If the NET is not available or not present, ERROR and END
If MyConn1.IsConnected = False Then
MsgBox "Cannot connect to Net 500K-1"
Exit Sub
End If
' Aslo for the 2nd Channel
If MyConn2.IsConnected = False Then
MsgBox "Cannot connect to Net 500K-2"
Exit Sub
End If
' Now we have generate 2 real CANAPI Clients that are connnected to each CAN Channel (500K-1 and 500K-2)
' To Simulate a Router 1to1 Device, we need to forward all CAN Frames from NET 500K-1 to NET 500K-2
' That means, that we read MyConn1 and forward all Messages directly to MyConn2
' We define 2 CAN Messages, for each Client
' For CAN1 we need to receice messages...
Set RcvMsgClient1 = MyClient1.Messages.Add
' For CAN2 we need a send message
Set SendMsgClient2 = MyClient2.Messages.Add
' Now we open the incomming Message Filter for CAN1 complete (if you do not want to forward all Messages
' this is the right place to use incomming filter setting)
MyConn1.RegisterMsg &H000, &H1fffffff, TRUE, TRUE ' open Filter for ALL Messages...
' We use the Macro Windows for text outputs...
PrintToOutputWindow "Now start 1:1 Routing"
Do ' main loop forever - until a special CAN ID is receoved or a CAN Error happened
Do While not RcvMsgClient1.Read ' Here we read the driver queue until we received a MSG
Wait(5) ' Prevent 100% CPU load
Loop
If RcvMsgClient1.LastError = pcanErrorOk Then ' did we get a real Message?
With SendMsgClient2 ' now we work with the received Message from CAN1
.ID = RcvMsgClient1.ID ' and copy the Values 1:1 to the Messagew for CAN2
.DLC = RcvMsgClient1.DLC '..you see it is very easy to chage some Data here
.MsgType = RcvMsgClient1.MsgType
.Data(0) = RcvMsgClient1.Data(0) ' you could swap DATA Bytes
.Data(1) = RcvMsgClient1.Data(1) ' or change the ID etc...
.Data(2) = RcvMsgClient1.Data(2)
.Data(3) = RcvMsgClient1.Data(3)
.Data(4) = RcvMsgClient1.Data(4)
.Data(5) = RcvMsgClient1.Data(5)
.Data(6) = RcvMsgClient1.Data(6)
.Data(7) = RcvMsgClient1.Data(7)
.Write MyConn2, 0 ' and here we send the CAN Frame (0 = with no delay)
End With
PrintToOutputWindow "Receiced ID:" & RcvMsgClient1.ID ' small info in the Macro Window
End If
Loop While (RcvMsgClient1.LastError = pcanErrorOk AND RcvMsgClient1.ID <> &H001) ' Stop when receiving ID 0x001 or when CAN 1 have an Error
PrintToOutputWindow "Finished "
Wait(1000) ' wait one second before we end, so that the driver have the chance to send the last CAN Message
End Sub ' end of Sub