您现在的位置:中国传动网  >  技术频道首页  >  技术百科  >  工控干货|SMC304运动控制器之间的CAN总线级联方法

工控干货|SMC304运动控制器之间的CAN总线级联方法

2019年04月23日 11:04:08 供稿:深圳市雷赛智能控制股份有限公司

一. CAN总线实时令牌网

1. CAN 总线的特点

CAN总线(Controller Area Net)是一种有效支持分布式控制的串行通信网络。它是由德国Bosch公司为汽车的监测、控制系统而设计,由于其具有卓越的特性及极高的可靠性,后来广泛应用于工业过程监控设备的互连。

CAN总线只定义了ISO/OSI模型中的第一层(物理层)和第二层(数据链路层),其物理拓扑如图1所示。CAN总线主要特点有:

(1) 采用差分传输,抗干扰性强;

(2) 采用短帧结构和CRC校验等检错措施,出错概率低;

(3) 采用基于优先权的非破坏性总线仲裁技术,可工作于多主、一对一、一对多及全局广播方式传送接收数据;

(4) 通信距离随波特率而变,典型值为10 km(5 kb/s)、40 m(1 Mb/s)。

2. 令牌总线简介

令牌总线网络的逻辑拓扑如图2所示。所有连接在令牌总线上的站点在逻辑上构成一个首尾相连的环,每个站点都知道自己的前导站(PS)和后继站(NS)。

令牌实际上是一个采用特殊编码的控制帧。网络上只有一个令牌沿逻辑环传递,得到令牌的站才能发送数据,然后把令牌向下传。在正常运行时,令牌按照站点地址的序列号从一个站点传送到另外一个站点。这样,这个令牌实际上是按照逻辑环而不是物理环进行传递。在数字序列的最后一个站点将令牌返回到第一个站点。

令牌通讯机制的优点是任何时刻网络中只有一对节点在进行通讯,完全杜绝多节点通讯冲突的情况。

二. SMC304运动控制器CAN总线令牌网及指令

1. 雷赛CAN总线令牌网的通讯机制

SMC304运动控制器可以通过CAN总线和另外的SMC304运动控制器或雷赛其他型号的运动控制器连接,形成一个多站点的CAN总线运动控制系统,采用令牌通讯机制实现各站点之间的数据交换。与一般令牌网不同,雷赛CAN总线令牌网中有一个主站,负责令牌传递的管理,防止令牌丢失,以提高通讯的可靠性。

在雷赛CAN总线实时令牌网上可以发送4类数据:位、字、双字、浮点类数据。通讯流程如下:

第一步,主站按周期将本站的寄存器数据表中的数据发送给其它各站点;之后往一个从站发送令牌消息;第二步,从站接收到令牌后,将本站寄存器数据表中的数据发送给其它各站点;之后往主站发送释放令牌的消息;第三步,主站接收到一个从站令牌释放消息后,往下一个从站发送令牌消息;然后回到第二步,直到所有站点数据都已经发送完成;第四步,主站周期时间到达后重复以上流程。

以上通讯过程都是在BASIC程序后台进行,不需要用户编程管理。

用户需要在程序中首先初始化用于数据通讯的寄存器数据表,设置通讯周期、参与通讯的节点数和节点号;定义要通讯的数据类型、对端节点号;添加通讯数据结束标志。

然后,根据需要在程序中定时查询本地寄存器,即可得到其他节点的数据;定时更新寄存器数据表,将新数据自动发送给其他节点。

2. 雷赛CAN总线令牌网的通讯指令

1)初始化CAN通讯数据表参数SMCCanRegTableInit  short SMCCanRegTableInit(short Enable[,short SendMode[,short CycleTime[,short CanIdNum,short* pCanIdList]]);

参数:

Enable  是否启用寄存器表通讯:0-禁用,1-启用 SendMode  发送方式:0-收到令牌后发送(从站),1-周期性发送(主站)

CycleTime  周期性发送时间,单位:毫秒 CanIdNum  对端节点号个数 pCanIdList 对端节点号列表

2)添加位类数据到寄存器表SMCCanRegTableAddBit short SMCCanRegTableAddBit(short CanId,short RegAddr,short RegNum,Dshort RegValue);

参数:

CanId  对端节点号 

RegAddr  对端寄存器地址

 RegNum 对端寄存器个数,范围[1,32]

RegValue 默认值

3)添加字类数据到寄存器表SMCCanRegTableAddReg short SMCCanRegTableAddReg(short CanId,short RegAddr,short RegValue);

参数:

CanId  对端节点号

RegAddr  对端寄存器地址

RegValue 默认值

4)添加双字类数据到寄存器表SMCCanRegTableAddLong

short SMCCanRegTableAddLong(short CanId,short RegAddr,long RegValue);

参数:

CanId  对端节点号 

RegAddr  对端寄存器地址

RegValue  默认值

5)添加浮点类数据到寄存器表SMCCanRegTableAddFloat

short SMCCanRegTableAddFloat(short CanId,short RegAddr,float RegValue);

参数:

CanId  对端节点号 

RegAddr  对端寄存器地址 

RegValue  默认值

6)添加结束标志到寄存器表SMCCanRegTableAddEnd short SMCCanRegTableAddEnd(short CanId);

参数:

CanId  对端节点号

7)更新寄存器表中的位类数据SMCCanRegTableSetBit short SMCCanRegTableSetBit(short CanId,short RegAddr,short RegNum,long RegValue);

参数:

 CanId  对端节点号

 RegAddr  对端寄存器地址

 RegNum  对端寄存器个数,范围[1,32] 

RegValue  设置值,每一个Bit位代表一个位寄存器的值

8)更新寄存器表中的字类数据SMCCanRegTableSetReg

short SMCCanRegTableSetReg(short CanId,short RegAddr,short RegValue);

参数:

CanId  对端节点号 

RegAddr  对端寄存器地址 

RegValue  设置值

9)更新寄存器表中的双字类数据SMCCanRegTableSetLong short SMCCanRegTableSetLong(short CanId,short RegAddr,long RegValue);

参数:

CanId  对端节点号 

RegAddr 对端寄存器地址 

RegValue 设置值

10)更新寄存器表中的浮点类数据SMCCanRegTableSetFloat short SMCCanRegTableSetFloat(short CanId,short RegAddr,float RegValue); 

参数:

CanId  对端节点号 

RegAddr  对端寄存器地址 

RegValue 设置值

三. CAN总线级联三台SMC304运动控制器的例程

1. 例程的硬件设置

如图3.1所示,3台SMC304运动控制器通过CAN总线级联。且节点号为ID1的运动控制器的CAN1口连接了6个CANopen总线电机和模块。(详见本文上篇:SMC304控制器及CANopen总线产品的应用)

3台SMC304运动控制器的CAN总线拨码开关设置如下:

ID1的拨码开关为:Off,Off,On,Off,Off,On。即:CAN1终端电阻使用、CAN0和CAN1独立使用、CAN0终端电阻使用。

ID2的拨码开关为:Off,Off,Off,On,On,Off。即:CAN1终端电阻禁用、CAN0和CAN1短接为一个接口、CAN0终端电阻禁用。

ID3的拨码开关为:Off,Off,Off,Off,Off,On。即:CAN1终端电阻禁用、CAN0和CAN1独立使用、CAN0终端电阻使用。

2. 例程的通讯数据

将ID2运动控制器作为主站,ID1、ID3号控制器作为从站。

D2每80毫秒向ID1发送一个字类数据;向ID3发送1个一个字类数据,一个浮点类数据。

ID1拿到令牌后,向ID2和ID3各发送一个字类数据。

ID3拿到令牌后,向ID1发送一个字类数据;向ID2发送1个一个字类数据,一个位类数据(4位)、一个浮点类数据。

3. 例程的功能

本实验软件功能有:

ID1、ID2、ID3号控制器分别向ID2、ID3、ID1号控制器发送一个从0~11循环变化的整数,使其输出口OUT1~OUT11的指示灯以跑马灯方式从左到右、每0.2秒闪烁一次;

ID1、ID2、ID3号控制器分别向ID3、ID1、ID2号控制器发送一个从11~0循环变化的整数,使其输出口OUT10~OUT0的指示灯以跑马灯方式从右到左、每0.2秒闪烁一次。以此检测CAN总线令牌网的传送字类数据的通讯速度和可靠性。

2)ID2号控制器每0.2秒将1个整数和一个浮点数合并为1个浮点数,并发送给ID3号控制器,控制其电机做点位运动。以此检测CAN总线令牌网的传送浮点类数据的可靠性。

3)ID3号控制器每0.2秒向ID2号控制器发送一个在0~15之间由小到大变化的、长度为4位的位类数据,一个在1111.5678~8888.5678之间由小到大变化的浮点类数据。ID1、ID2号控制器在接收字类数据、位类数据、浮点类数据的同时,检查其正确性。

4)ID1号控制器通过CAN1口控制2个CANopen型步进电机、1个CANopen型混合伺服电机、2个CANopen型IO扩展模块、1个CANopen型AD/DA模块。

4. 例程的程序清单

程序清单1:ID2的程序

auto:  ' 本机为ID2,为master。

undim *

dim Cerr1,Cerr2,Ccheck

dim state1,state2

dim state3,state4,state

dim data0,data1,data2,data3

dim data0old,data1old

dim d0,d1,d2,d3

dim t1,t2,t

dim f1,f8 

dim flag1,flag2

constCanID1=1  ' ID1的节点号为1 

const CanID2=3 ' ID2的节点号为3 

const CanID3=5 ' ID3的节点号为5

setcan(1000,CanID2)  ' ID2的波特率为1000k

call RegTableInit()  ' 运行子程序RegTableInit

flag1=0 

flag2=0 

state1=20000 

state2=30011

state3=0

state4=-91111.567

data0=1

f1=1234.5678

f8=8888.5678

int_enable(1)  '中断使能:开

timer_start(0,20)  '打开定时器0

while true

Delay(200)  '延时200毫秒

if state1>=20011 then

state1=20000  '基数设为20000,只是为了验证传送大数据的准确性

else

state1=state1+1  'state1在20000~20011之间由小到大变化,200毫秒变一次

endif

if state2<=30000 then

state2=30011

else

state2=state2-1  'state2在30011~30000之间由大到小变化,200毫秒变一次

endif

if state4>=8888.0 then

state4=-7777.7777 

state3=1

else

state3=state3+1  'state3在1~16之间由大到小变化,200毫秒变一次

state4=state4+1111.12345  'state4在-7777.777~8889.074之间由小到大变化

endif

if state4>=0 then  '将state3和state4合并为一个浮点数

state=state4+state3*10000

else

state=state4-state3*10000

endif

SMCCANRegTableSetReg(CanID1,20,state2)  ' 更新发送的数据

SMCCANRegTableSetReg(CanID3,20,state1) SMCCanRegTableSetFloat(CanID3,26,state)

wend

end

ontimer0:  ' 本机为ID2,50毫秒查寻一次ID1、ID3状态。

timer_start(0, 50)  ' 打开定时器0,定时时间为50毫秒

d1=modbus_Reg(10)  ' 读本地的寄存器,查看控制器ID1的指令

d2=d1-20000  ' d2在0~11之间由小到大变化

if d2%2=0 then ' 当d2=0、2、4、6、8、10时,

SMCWriteOutBit(d2+1,0)  ' OUT1、OUT3、OUT5、OUT7、OUT9、OUT11的LED亮

else ' 当d2=1、3、5、7、9、11时,

SMCWriteOutBit(d2,1)  ' OUT1、OUT3、OUT5、OUT7、OUT9、OUT11的LED灭

endif

d1=modbus_Reg(30)  ' 读本地的寄存器,查看控制器ID3的指令

d3=d1-30000  ' d3在11~0之间由大到小变化

if d3%2=0 then  ' 当d3=10、8、6、4、2、0时,

SMCWriteOutBit(d3,1)  ' OUT10、OUT8、OUT6、OUT4、OUT2、OUT0的LED灭

else  ' 当d3=11、9、7、5、3、1时,

SMCWriteOutBit(d3-1,0)  ' OUT10、OUT8、OUT6、OUT4、OUT2、OUT0的LED亮

endif

data0=MODBUS_BIT(30,33)

if flag1=0 then

flag1=1  ' 第一次读ID3的位类数据

data0old=data0

else

if data0<>data0old then  ' 根据有序数据检查数据传送的准确性

if data0=data0old+1 or (data0=0 and data0old=15) then

else

Cerr1=Cerr1+1  ' ID3的传送的位类数据有错,次数加1

print "error data = ",data0,data0old

endif

data0old=data0

endif

endif

data1=MODBUS_IEEE(36)

if flag2=0 then

flag2=1  ' 第一次读ID3的浮点类数据

data1old=data1

else

if data1<>data1old then  ' 根据有序数据检查数据传送的准确性

if data1-(data1old+1110.997)<0.001 or (data1-f1<0.001 and data1-f8<0.001) then

else

Cerr2=Cerr2+1  ' ID3的传送的浮点类数据有错,次数加1

print "error data = ",data1,data1old

endif

data1old=data1

endif

endif

Ccheck=Ccheck+1

end

sub RegTableInit()

dim CanIdList(2)  '定义从站节点号列表

CanIdList(0) = 1  '第一个从站节点号为1 

CanIdList(1) = 5  '第二个从站节点号为5

SMCCANRegTableInit(1,1,80,2,CanIdList)  '初始化寄存器表,周期为80毫秒,从站节点数为2

SMCCANRegTableAddReg(CanID1,20,0)  '添加寄存器数据

SMCCANRegTableAddReg(CanID3,20,0) SMCCanRegTableAddFloat(CanID3,26,0)

SMCCANRegTableAddEnd(CanID1)  '寄存器数据结束标志

end sub

程序清单2:ID3的程序

auto:  ' 本机为ID3,为slave。

undim *

dim Cerr1,Cerr2,Ccheck

dim state1,state2

dim state3,state4

dim data0,data1,data2,data3

dim d0,d1,d2,d3

dim t1,t2,t

dim f1,f8

dim flag1,flag2

dim MaxData,MinData

const CanID1=1 

const CanID2=3 

const CanID3=5

MaxData=-1000

MinData=9999

flag1=0 

flag2=0

state1=20000

state2=30011

state3=0

state4=1111.5678

data0=1

f1=1234.567

f8=8888.567

setcan(1000,CanID3)

call RegTableInit()

int_enable(1)  '中断使能:开

timer_start(0,20)  '打开定时器

SMCSetProfileUnit(0,900,6000,0.2,0.1,900)  '设置0号轴速度曲线参数

SMCSetsprofile(0,0,0.5)  '设置0号轴S段参数

while true

Delay(200)

if state1>=20011 then   ' ……

state1=20000

else

state1=state1+1

endif   ' 和ID2程序相同

if state2<=30000 then

state2=30011

else

state2=state2-1

endif   ' ……

if state3>=15 then

state3=0

else

state3=state3+1   'state3在0~15之间由小到大变化,200毫秒变一次

endif

if state4>=8888.5678 then

state4=1111.5678

else

state4=state4+1111   'state4在1111.5678~8888.5678之间由小到大变化

endif

SMCCANRegTableSetReg(CanID1,30,state1)  ' 更新发送的数据

SMCCANRegTableSetReg(CanID2,30,state2) SMCCanRegTableSetBit(CanID2,30,4,state3) SMCCanRegTableSetFloat(CanID2,36,state4)

data1=MODBUS_IEEE(26)

if data1>= 0 then  ' 将data1拆分为2个数

data0=int(data1/10000)   ' data0是1~16之间的一个整数

data2=data1-data0*10000   ' data2是-7777.777~8889.074之间的一个浮点数

else

data0=-1*int(data1/10000)-1

data2=data1+data0*10000

endif

if data0=4 or data0=12 then  ' 根据data0、data2做点位运动

SMCPMoveUnit(0,data2,0)

endif

wend

end 

ontimer0:  ' 本机为ID3,50毫秒查寻一次ID1、ID2状态。

timer_start(0,50)

d1=modbus_Reg(20)  ' 读本地的寄存器,查看控制器ID2的指令

d2=d1-20000

if d2%2=0 then  ' 和ID2程序相同

SMCWriteOutBit(d2+1,0)

else

SMCWriteOutBit(d2,1)

endif

d1=modbus_Reg(10)  ' 读本地的寄存器,查看控制器ID1的指令

d3=d1-30000

if d3%2=0 then  ' 和ID2程序相同

SMCWriteOutBit(d3,1)

else

SMCWriteOutBit(d3-1,0)

endif

end

sub RegTableInit()

SMCCanRegTableInit(1,0,0)  '初始化寄存器表

SMCCanRegTableAddReg(CanID1,30,0)  '添加寄存器数据

SMCCanRegTableAddReg(CanID2,30,0)

SMCCanRegTableAddBit(CanID2,30,4,0)  '长度为4位的位类数据

SMCCanRegTableAddFloat(CanID2,36,0)

SMCCanRegTableAddEnd(CanID2)  '寄存器数据结束标志

end sub

 

程序清单3:ID1的程序

auto:  ' 本机为ID1,为slave。

undim *

dim a,b,flag1,flag2,Cerr1,Cerr2,Ccheck

dim EMoutV0,EMoutV1,EMinV0

dim state1,state2

dim d1,d2,d3,d2old,d3old

dim t1,t2,t,Tmax

Tmax=0

flag1=0 

flag2=0

const EM1out0=12

const EM1out8=20

const EM1out5=18 

const EM1out13=25 

const EM1in0=16 

const EM1in8=24 

const EM2out1=29 

const EM2out9=37 

const EM2out6=34 

const EM2out14=42 

const EM2in1=33 

const EM2in9=41 

const CanID1=1 

const CanID2=3 

const CanID3=5

setcan(1000,CanID1) 

call RegTableInit()

a=off 

b=off

EMoutV0=0 

EMoutV1=0 

EMinV0=0 

state1=20000 

state2=30011

int_enable(1)  '中断使能:开

timer_start(0,50)  '打开定时器0

timer_start(1,60)  '打开定时器1,控制IO模块

run 1,canmotor  '控制CAN总线电机

count=0

while true

Delay(200)

if state1>20011 then

state1=20000

else

state1=state1+1

endif

if state2<30000 then

state2=30011

else

state2=state2-1

endif

SMCCANRegTableSetReg(CanID2,10,state1)  ' 更新发送的数据

SMCCANRegTableSetReg(CanID3,10,state2)

wend

end

canmotor:   ' 控制CANopen电机的子任务

……  ' 程序略(详见本文上篇:SMC304控制器及CANopen总线产品的应用)

end

ontimer1: ' AD/DA模块控制 

……  '程序略

end

EM32IOControl:  ' 控制IO模块的子任务

……  '程序略

end

ontimer0:  ' 本机为ID1,20+毫秒查寻一次ID2、ID3状态。

t1=ticks

d1=modbus_Reg(30)  ' 读本地的寄存器,查看控制器ID3的指令

d2=d1-20000

if flag1=0 then

flag1=1  ' 第一次

d2old=d2

if d2%2=0 then

SMCWriteOutBit(d2+1,0)

else

SMCWriteOutBit(d2,1)

endif

else

if d2<>d2old then

if d2=d2old+1 or (d2=0 and d2old=11) then

if d2%2=0 then

SMCWriteOutBit(d2+1,0)

else

SMCWriteOutBit(d2,1)

endif

else

Cerr1=Cerr1+1  ' ID3的传送的数据有错,次数加1

print "error data = ",d2,d2old

endif

d2old=d2

endif

endif

d1=modbus_Reg(20)   ' 读本地的寄存器,查看控制器ID2的指令

d3=d1-30000 

if flag2=0 then

flag2=1  ' 第一次

d3old=d3

if d3%2=0 then

SMCWriteOutBit(d3,1)

else

SMCWriteOutBit(d3-1,0)

endif

else

if d3<>d3old then

if d3=d3old-1 or (d3=11 and d3old=0) then

if d3%2=0 then

SMCWriteOutBit(d3,1)

else

SMCWriteOutBit(d3-1,0)

endif

else

Cerr2=Cerr2+1  ' ID2的传送的数据有错,次数加1

print "error data = ",d3,d3old

endif 

d3old=d3 

endif 

endif

Ccheck=Ccheck+1

timer_start(0, 20)

t2=ticks

t=t2-t1   ' 测量ontimer0运行时间

if t>Tmax then

Tmax=t

print "max time = ",t   ' 输出最大运行时间

endif

end

sub RegTableInit()

SMCCanRegTableInit(1,0,0)  '初始化寄存器表SMCCanRegTableAddReg(CanID2,10,0)  '添加寄存器数

SMCCanRegTableAddReg(CanID3,10,0) SMCCanRegTableAddEnd(CanID2)  '寄存器数据结束标志

end sub

5. 例程的实验结果

三台SMC304运动控制器通过CAN总线令牌网级联,可以实现稳定、可靠的数据交换。该程序测试几十小时,未发现一次通讯错误。

传送一个字类数据的平均通讯时间小于5毫秒。由于控制器ID1的工作任务繁重,其负责更新传送数据的timer0的中断任务平均完成时间在35毫秒左右,但最长时间近70毫秒,所以,主站ID2将数据通讯周期定为80毫秒。

需要注意,有一种情况是可能发生的:在查询本地寄存器时,第i个数据是上一个周期接收到的,第i+1个数据是本次周期接收到的。

如果这2个数据是关联数据,如:第i个数据是轴号、第i+1个数据是运动距离;第j个周期和第j+1个周期传送的数据不同。这时就会发生错误。因此,为避免这种情况发生,可以将这2个关联数据合并为一个数据发送。

四.结论

SMC304运动控制器采用CAN总线令牌网级联,通讯速度快、稳定可靠;可以充分发挥SMC304的轨迹控制的功能,扩大使用交流伺服电机的数量;控制器控制总线型电机的数量减少,降低了总线控制系统的编程难度。所以,该组网方式在小型生产线上应用非常合适。

总之,使用SMC304运动控制器和CANopen总线步进电机、混合伺服电机及扩展模块,可以充分发挥雷赛公司的优势,大幅提升运动控制系统的性价比。

五.参考文献

[1] 赵城,张凯. 基于CAN总线实时令牌网的设计. 微型机与应用,2013年第9期 

[2] 深圳市雷赛控制技术有限公司. 雷赛SMC304-BAS运动控制器用户手册. 2019 

[3] 深圳市雷赛控制技术有限公司. 雷赛运动控制器SMC Basic Studio使用手册. 2019

声明:本文内容由企业提供,如涉及版权、机密问题,请及时联系我们删除(QQ: 2737591964,不便之处,敬请谅解!

本文链接:http://www.chuandong.com/tech/detail.aspx?id=36749

中国传动网

官方微信

扫一扫,中国传动网信息随手掌控

直驱与传动

官方微信

扫一扫,直驱与传动信息随手掌控

伺服与运动控制

官方微信

扫一扫,伺服与运动控制信息随手掌控

深圳市雷赛智能控制股份有限公司

  • 地 址:深圳市南山区学苑大道1001号南山智园A3栋11楼
  • 电 话:0755-26433338
  • 网 址:http://www.leisai.com
  • 传 真:0755-26402718

相关文章

联系我们

广告联系:0755-82048561
展会合作:0755-83736589
杂志投稿:0755-82048562

网站简介|会员服务|联系方式|帮助信息|版权信息|网站地图|友情链接|法律支持|意见反馈

版权所有 2006-2016 中国传动网(ChuanDong.com)

  • 经营许可证
    粤B2-20150019

  • 粤ICP备
    14004826号

  • 不良信息
    举报中心

  • 网络110
    报警服务

网站客服热线

0755-82949061

网站问题客服

2737591964