canitpOpen (Function)

Top  Previous  Next

Architecture:

NX32 / NX32L

Firmware version:

5.13 / 1.80.00


Open an ISO-TP connection using an already opened CAN port.

 

A callback function is used to notify the application that a message is received. (See CALLBACK for more information)

 

The ISO-TP protocol uses two way communication so the CAN write capability must be enabled.

If CAN write is not enabled, or monitor mode is used, then messages cannot be received or send.

 

canitpOpen can only be used to create a single connection, to create multiple connections, see canitpSessionCreate.

 

Input:

port : SINT (1/2) (default 1)

The port of the CAN bus to use for ISO-TP.

 

src : DINT

The CAN ID to filter for incoming ISO-TP messages.

 

dst : DINT

The CAN ID where ISO-TP messages are sent to.

 

xtd : BOOL (default TRUE)

Set to FALSE to use standard identifiers (11 bits), leave at TRUE for extended identifiers (29 bits).

 

cb_receive : CALLBACK

The callback function for received messages. (See the canitpRecv callback declaration below)

 

cb_data : PTR

The buffer where the received message is stored.

 

cb_size : INT (1..4095)

The size of the receive buffer.

If an incoming ISO-TP message is too large for the receive buffer it will be discarded.

 

Returns: INT

1

- Successful.

0

- Not available.

-1

- ISO-TP is open.

-2

- The CAN port is not open

-3

- Illegal source address

-4

- Illegal destination address

-5

- Illegal function pointer

-6

- Illegal buffer or size

-7

- Failed to create CAN filter.

 

Declaration:

FUNCTION canitpOpen  : BOOL;
VAR_INPUT
   port    : SINT := 1;
   src     : DINT;
   dst     : DINT;
   cb_receive : CALLBACK;
   cb_data : PTR;
   cb_size : INT;
   xtd     : BOOL := TRUE;
END_VAR;

 

Callback declaration:

FUNCTION CALLBACK canitpRecv
VAR_INPUT
   size    : INT;
END_VAR;

 

 

Example:

INCLUDE rtcu.inc

 

VAR

   buf   : ARRAY [1..4096OF SINT;

END_VAR;

 

FUNCTION CALLBACK canitpRecv

VAR_INPUT

   size  : INT//Size of the data received.

END_VAR;

   DebugMsg(message := strFromMemory(src := ADDR(buf), len := size));

END_FUNCTION;

 

PROGRAM example;

VAR

   rc    : INT;

   str   : STRING;

   out   : ARRAY [1..4095OF SINT;

   len   : INT;

END_VAR;

 

   // Open can

   canOpen(baud := 250monitor := FALSE);

 

   // Open ISO-TP

   rc := canitpOpen(port     := 1,

                    src      := 16#12345678,

                    dst      := 16#12345679,

                    cb_receive := @canitpRecv,

                    cb_data    := ADDR(buf),

                    cb_size    := SIZEOF(buf));

   IF rc < 1 THEN

      DebugFmt(message := "canitpOpen=\1", v1 := rc);

      RETURN;

   END_IF;

 

   // Build message

   str := "Hello from RTCU device";

 

   // Send message

   len := strLen(str := str);

   strToMemory(str := strdst := ADDR(out), len := len);

   rc  := canitpSend(data := ADDR(out), size := len);

   IF rc < 1 THEN

      DebugFmt(message := "canitpSend=\1", v1 := rc);

      RETURN;

   END_IF;

 

BEGIN

END;

END_PROGRAM;