Introduction


CANOpen is a widely used communication protocol for embedded systems. It is based on the Controller Area Network (CAN) protocol which is a standard in automotive and industrial applications.

The script provided in this article reads 8 values from the controller(Battery volts, Drive stage volts, Motor Command, Motor Amps , Power, Speed, Loop Error, Fault flags) every [X] milliseconds, and then saves them on the User Variables. This is useful when the user wants a supervisory computer to keep track of certain values, possibly for safety reasons.

The user variables in RoboteQ controllers, are by default the objects that are being transmitted with TPDO messages, as described in the CAN networking manual v2.1aFor Gen4 controllers, please refer to CAN EtherCAT networking manual v3.0

Note that TPDOs 5-8 are by default disabled in Roborun+. For this simple example we will use TPDOs 1-4 to transfer up to 8 variables.

  


Configurations in Roborun+ 

 

  • Set Script Auto-start to Enabled
  • Can Mode : CANOpen (MiniCAN would also work, just select it in CAN Mode setting)
  • Bit rate / Node ID / Listen Node / Heartbeat depend on the user’s application

 

 


Now check that the send rates for TPDOs 1-4 are configured, and the mapping is correct. 

Example :  Object ID 0x2106h with sub-index 1 refers to user VAR 1.

TPDO1 contains both :

0x2106h-01h  | size : 4 bytes (Signed 32 bit variable)

0x2106h-02h  | size : 4 bytes (Signed 32 bit variable)

 

 

 

 

 Microbasic script 

 

DISCLAIMER : 

'The script is tested and validated by RoboteQ and is believed to be fault-free. 

'The possibility always exists, however, that the specific configuration and/or 

'use condition uncovers a fault that escaped our validation test coverage. Always 

test extensively the script under your use conditions prior to deploying it in the field. 

 

 

 

'Channel 1 used for the queries. Similar queries can be added for channel 2

 

'--------------- VARIABLES  -------------

 

'The user can add/remove variables according to his needs

 

option explicit 

 

dim sample_period as integer   ' in milliseconds. This should be equal to the configured send rate of TPDOs 

dim battery_volts as integer

dim driver_volts as integer

dim mot_command as integer

dim mot_amps as integer 

dim power as integer

dim speed as integer

dim loop_error as integer 

dim fault_flags as integer

 

'############### MAIN ########################

 

sample_period 10 

 

start 

 

battery_volts getvalue(_V 2)

driver_volts getvalue(_V 1

mot_command getvalue(_M 1

mot_amps getvalue(_A 1

power getvalue(_P 1)

speed getvalue(_S 1)    'USE THIS WHEN ENCODER IS USED FOR CLOSED LOOP FEEDBACK 

'speed = getvalue(_BS , 1)  'USE THIS WHEN INTERNAL SENSOR IS USED FOR FOR CLOSED LOOP FEEDBACK

loop_error getvalue(_E 1'USED ONLY FOR CLOSED LOOP MODES

fault_flags getvalue(_FF

 

 

setcommand(_VAR battery_volts'supply volts x10

setcommand(_VAR driver_volts)  'driver internal volts x10

setcommand(_VAR mot_command)   'range : -1000....+1000 for open loop, and

min....max speed in Closed loop speed

setcommand(_VAR mot_amps)      'motor amps x10 

setcommand(_VAR power)          'range : -1000.....+1000

setcommand(_VAR speed)         'Actual RPM 

setcommand(_VAR loop_error)     'loop_error = ramped motor command - feedback = desired speed - reported speed

setcommand(_VAR fault_flags)   'FF=0 if everything is normal  

 

wait(sample_period

 

goto start 

 

Using a CAN sniffer connected to the PC via USB, we can debug and make sure that data are being sent correctly. Keep in mind that the order of the data is reversed (left-most byte is LSB, right-most byte is MSB)