時間: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è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥å…§æŠ•稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊