時間: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),不便之處,敬請諒解!
標簽:
上一篇:基于機器視覺技術檢測板材表...
下一篇:當PLC出現故障 我們如何查找?
中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(www.hysjfh.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。
本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
相關資訊
產品新聞
更多>2025-04-11
2025-04-08
2025-03-31
2025-03-26
2025-03-20
2025-03-13