時間:2019-08-12 15:53:52來æºï¼šè—æµ·è¯é¨°
一ã€ä»‹ç´¹
從OSI網絡模型的角度來看åŒï¼Œç¾å ´ç¸½ç·šç¶²çµ¡ä¸€èˆ¬åªå¯¦ç¾äº†ç¬¬1層(物ç†å±¤ï¼‰ã€ç¬¬2層(數據éˆè·¯å±¤ï¼‰ã€ç¬¬7å±¤ï¼ˆæ‡‰ç”¨å±¤ï¼‰ã€‚å› ç‚ºç¾å ´ç¸½ç·šé€šå¸¸åªåŒ…æ‹¬ä¸€å€‹ç¶²æ®µï¼Œå› æ¤ä¸éœ€è¦ç¬¬3層(傳輸層)和第4層(網絡層),也ä¸éœ€è¦ç¬¬5層(會話層)第6層(æè¿°å±¤ï¼‰çš„作用。
CAN(ControllerAreaNetwork)ç¾å ´ç¸½ç·šåƒ…僅定義了第1層ã€ç¬¬2層(見ISO11898標準);實際è¨è¨ˆä¸ï¼Œé€™å…©å±¤å®Œå…¨ç”±ç¡¬ä»¶å¯¦ç¾ï¼Œè¨è¨ˆäººå“¡ç„¡éœ€å†ç‚ºæ¤é–‹ç™¼(fÄ)相關軟件(Software)或固件(Firmwareï¼‰ã€‚åŒæ™‚,CANåªå®šç¾©ç‰©ç†å±¤å’Œæ•¸æ“šéˆè·¯å±¤ï¼Œæ²’有è¦(guÄ«)定應用層,本身并ä¸å®Œæ•´ï¼Œéœ€è¦ä¸€å€‹é«˜å±¤å”è°ä¾†å®šç¾©CANå ±æ–‡ä¸çš„11/29使¨™è˜ç¬¦ã€8å—節(jié)數據的使用。而且,基于CAN總線的工æ¥(yè)自動化應用ä¸ï¼Œè¶Šä¾†è¶Šéœ€è¦ä¸€å€‹é–‹æ”¾çš„ã€æ¨™æº–化的高層å”è°ï¼šé€™å€‹å”è°æ”¯æŒå„種CANå» å•†è¨å‚™çš„互用性ã€äº’æ›æ€§ï¼Œèƒ½å¤ 實ç¾åœ¨CANç¶²çµ¡ä¸æä¾›æ¨™æº–çš„ã€çµ±(tÇ’ng)一的系統(tÇ’ng)通訊模å¼ï¼Œæä¾›è¨å‚™åŠŸèƒ½æè¿°æ–¹å¼ï¼ŒåŸ·(zhÃ)行網絡管ç†åŠŸèƒ½ã€‚
應用層(Applicationlayerï¼‰ï¼šç‚ºç¶²çµ¡ä¸æ¯ä¸€å€‹æœ‰æ•ˆè¨å‚™éƒ½èƒ½å¤ æä¾›ä¸€çµ„有用的æœå‹™èˆ‡å”è°ã€‚
通訊æè¿°ï¼ˆCommunicationprofile):æä¾›é…ç½®è¨å‚™ã€é€šè¨Šæ•¸æ“šçš„å«ç¾©ï¼Œå®šç¾©æ•¸æ“šé€šè¨Šæ–¹å¼ã€‚
è¨å‚™æè¿°ï¼ˆDeviceproflile):為è¨å‚™ï¼ˆé¡žï¼‰å¢žåŠ ç¬¦åˆè¦(guÄ«)范的行為。
下é¢å°‡ä»‹ç´¹åŸºäºŽCAN的高層å”è°ï¼šCALå”è°å’ŒåŸºäºŽCALå”è°æ“´å±•çš„CANopenå”è°ã€‚CANopenå”è°æ˜¯CAN-in-Automation(CiA)定義的標準之一,并且在發(fÄ)布åŽä¸ä¹…å°±ç²å¾—了廣泛的承èªã€‚å°¤å…¶æ˜¯åœ¨ææ´²ï¼ŒCANopenå”è°è¢«èªç‚ºæ˜¯åœ¨åŸºäºŽCAN的工æ¥(yè)系統(tÇ’ng)ä¸å é ˜å°Žåœ°ä½çš„æ¨™æº–。大多數é‡è¦çš„è¨å‚™é¡žåž‹ï¼Œä¾‹å¦‚數å—和模擬的輸入輸出模塊ã€é©…å‹•è¨å‚™ã€æ“作è¨å‚™ã€æŽ§åˆ¶å™¨ã€å¯ç·¨ç¨‹æŽ§åˆ¶å™¨æˆ–編碼器,都在稱為“è¨å‚™æè¿°â€çš„å”è°ä¸é€²è¡Œæè¿°ï¼›â€œè¨å‚™æè¿°â€å®šç¾©äº†ä¸åŒé¡žåž‹çš„æ¨™æº–è¨å‚™åŠå…¶ç›¸æ‡‰çš„功能。ä¾é CANopenå”è°çš„æ”¯æŒï¼Œå¯ä»¥å°ä¸åŒå» 商的è¨å‚™é€šéŽç¸½ç·šé€²è¡Œé…置。在OSI模型ä¸ï¼ŒCAN標準ã€CANopenå”è°ä¹‹é–“的關系如下圖所示:
圖1CANã€CANopen標準在OSI網絡模型ä¸çš„ä½ç½®æ¡†åœ–
二ã€CALå”è°
CAL(CANApplicationLayer)å”è°æ˜¯ç›®å‰åŸºäºŽCAN的高層通訊å”è°ä¸çš„一種,最早由Philips醫(yÄ«)療è¨å‚™éƒ¨é–€åˆ¶å®šã€‚ç¾åœ¨CALç”±ç¨ç«‹çš„CANç”¨æˆ¶å’Œåˆ¶é€ å•†é›†åœ˜CiA(CANinAutomationï¼‰å”æœƒè² 責管ç†ã€ç™¼(fÄ)展和推廣。
CALæä¾›äº†4種應用層æœå‹™åŠŸèƒ½ï¼š
CMS(CAN-basedMessageSpecification)
CMSæä¾›äº†ä¸€å€‹é–‹æ”¾çš„ã€é¢å‘å°è±¡çš„ç’°(huán)境,用于實ç¾ç”¨æˆ¶çš„æ‡‰ç”¨ã€‚CMSæä¾›åŸºäºŽè®Šé‡ã€äº‹ä»¶ã€åŸŸé¡žåž‹çš„å°è±¡ï¼Œä»¥è¨è¨ˆå’Œè¦(guÄ«)定一個è¨å‚™ï¼ˆç¯€(jié)點)的功能如何被訪å•(例如,如何上載下載超éŽ8å—節(jié)的一組數據(域),并且有終æ¢å‚³è¼¸çš„功能)。CMS從MMS(ManufacturingMessageSpecification)繼承而來。MMS是OSI為工æ¥(yè)è¨å‚™çš„é 程控制和監(jiÄn)控而制定的應用層è¦(guÄ«)范。
NMT(NetworkManagemenT)
æä¾›ç¶²çµ¡ç®¡ç†ï¼ˆå¦‚åˆå§‹åŒ–ã€å•Ÿå‹•å’Œåœæ¢ç¯€(jié)é»žï¼Œåµæ¸¬å¤±æ•ˆç¯€(jié)點)æœå‹™ã€‚這種æœå‹™æ˜¯é‡‡ç”¨ä¸»å¾žé€šè¨Šæ¨¡å¼ï¼ˆæ‰€ä»¥åªæœ‰ä¸€å€‹NMT主節(jié)點)來實ç¾çš„。
DBT(DistriBuTor)
æä¾›å‹•æ…‹(tà i)分é…CANID(æ£å¼å稱為COB-ID,CommunicationObjectIdentifier)æœå‹™ã€‚這種æœå‹™æ˜¯é‡‡ç”¨ä¸»å¾žé€šè¨Šæ¨¡å¼ï¼ˆæ‰€ä»¥åªæœ‰ä¸€å€‹DBT主節(jié)點)來實ç¾çš„。
LMT(LayerManagemenT)
LMTæä¾›ä¿®æ”¹å±¤åƒæ•¸çš„æœå‹™ï¼šä¸€å€‹ç¯€(jié)點(LMTMaster)å¯ä»¥è¨ç½®å¦å¤–一個節(jié)點(LMTSlave)的æŸå±¤åƒæ•¸ï¼ˆå¦‚改變一個節(jié)點的NMT地å€ï¼Œæˆ–改變CAN接å£çš„ä½å®šæ™‚和波特率)。
CMS為它的消æ¯å®šç¾©äº†8個優(yÅu)先級,æ¯å€‹å„ª(yÅu)å…ˆç´šæ“æœ‰220個COB-ID,范åœå¾ž1到1760。剩余的標志(0,1761-2031)ä¿ç•™çµ¦NMT,DBTå’ŒLMT,見下表。
æ˜ å°„åˆ°CALæœå‹™å’Œå°è±¡çš„COB-ID(11ä½CAN標è˜ç¬¦) | æœå‹™æˆ–å°è±¡ |
0 | NMT 啟動/åœæ¢æœå‹™ |
1 - 220 | CMSå°è±¡ 優(yÅu)先級0 |
221 - 440 | CMSå°è±¡ 優(yÅu)先級1 |
441 - 660 | CMSå°è±¡ 優(yÅu)先級2 |
661 - 880 | CMSå°è±¡ 優(yÅu)先級3 |
881 - 1100 | CMSå°è±¡ 優(yÅu)先級4 |
1101 - 1320 | CMSå°è±¡ 優(yÅu)先級5 |
1321 - 1540 | CMSå°è±¡ 優(yÅu)先級6 |
1541 - 1760 | CMSå°è±¡ 優(yÅu)先級7 |
1761 - 2015 | NMT 節(jié)點ä¿è· |
2016 - 2031 | NMT,LMT,DBTæœå‹™ |
三ã€è®Šé »å™¨èˆ‡è²åŠ èŠäººæ©Ÿç•Œé¢é€£æŽ¥å¦‚下
圖2
å››ã€CPS_ModbusRTUGateway(I-7232D)é…ç½®
在計算機上安è£I-7232DUTILITYé…置軟件,并é‹è¡Œå¦‚下圖所示
圖3
é‹è¡Œé…置軟件åŽé¡¯ç¤ºå¦‚下圖,I-7232D上電時將INT腳與GNDçŸæŽ¥ï¼Œä½¿I-7232D工作在é…置模å¼
圖4
鏿“‡æ£ç¢ºçš„通訊COMå£ï¼Œé»žæ“Šâ€œCONNETCTâ€é€£æŽ¥I-7232D,連接æˆåŠŸåŽ,點擊CAN-bus將出ç¾å¦‚下窗å£åœ–所示:
圖5
I-7232D的CANopen端:
波特率:250KBPS
節(jié)點號為:1
ç„¶åŽé»žæ“ŠRS-485按鈕如下圖
圖6
I-7232D的RS-485端:
波特率:19200BPS
數據長度:8
奇嶿 ¡é©—:無
åœæ¢ä½ï¼š1
超時:50ms
在é…置完通訊端å£åƒæ•¸åŽæ“Šé»žâ€œNEXTâ€å½ˆå‡ºå¦‚下窗å£ï¼Œå¦‚圖所示
圖7
ç„¶åŽé»žæ“Šâ€œADDâ€æŒ‰éˆ•æ·»åŠ MODBUSåœ°å€æ˜ 射,â€ModbusDeviceNodeIDâ€ï¼Œé€™é‡Œè¼¸å…¥è¢«æ˜ å°„çš„è®Šé »å™¨RS-485節(jié)點地å€ï¼Œâ€RelayAddressâ€ï¼Œæœ¬æ¬„é‡Œé¸æ“‡MODBUSRTU功能碼,這里我們åªç”¨å…©å€‹åŠŸèƒ½ç¢¼ï¼šAnalogOutput(寫入)å’ŒAnalogInput(讀å–),“Register/RelayAddressâ€æ¤è™•å¡«å…¥è¦è®€/å¯«çš„è®Šé »å™¨å¯„å˜å™¨åœ°å€ï¼Œâ€œDataLengthâ€é€™é‡Œè¨ç½®è®€/å¯«è®Šé »å™¨å¯„å˜å™¨çš„æ•¸æ“šé•·åº¦ã€‚åœ¨é€™é‡Œæˆ‘å€‘çš„æ˜ å°„åœ°å€å¦‚ä¸‹è¡¨æ‰€ç¤ºã€‚åœ¨å®Œæˆæ˜ å°„åŽé»žæ“Šâ€œModbusInformationâ€å’Œâ€œPDOInformationâ€å¯ä»¥å¯Ÿçœ‹æ˜ å°„åƒæ•¸åˆ—表如下圖所示
nstance NO. | Modbus Device NodeID | Relay Address | Register/Relay Address | Data Length |
1 | 1 | Analog Output | 32769 | 1 |
2 | 1 | Analog Output | 32770 | 1 |
3 | 1 | Analog Input | 33036 | 1 |
4 | 1 | Analog Input | 33079 | 1 |
5 | 1 | Analog Input | 33081 | 1 |
6 | 2 | Analog Output | 32769 | 1 |
7 | 2 | Analog Output | 32770 | 1 |
8 | 2 | Analog Input | 33036 | 1 |
9 | 2 | Analog Input | 33079 | 1 |
10 | 2 | Analog Input | 33081 | 1 |
圖8
圖9
完æˆä»¥ä¸Šæ“作åŽé»žæ“Šâ€œNEXTâ€å‡ºç¾å¦‚下窗å£
圖10
ç„¶åŽé»žæ“Šâ€œFinishâ€ä¿å˜é…ç½®çš„åƒæ•¸åˆ°I-7232DåŒæ™‚åœ¨æ‡‰ç”¨ç¨‹åºæ ¹ç›®éŒ„下生æˆEDS文件,ä¿å˜æˆåŠŸåŽè¿”回主窗å£ã€‚完æˆé…ç½®åŽæŽ‰é›»é‡å•ŸI-7232D。
PP45CANopen程åºï¼š
CAN通訊å£åˆå§‹åŒ–程åº
(*initprogram*)
CANopen_0.enable=1
CANopen_0.baud_rate=25;250k
CANopen_0.cob_anz=20
CANopen_0.error_adr=adr(ERR)
CANopen_0.device="SS1.IF3";è¨å‚™å稱
CANopen_0.info=0
CANopen_0FUBCANopen();åˆå§‹åŒ–CAN
NMT_Data[0]=1;CANOPEN命令01-
NMT_Data[1]=0
;requstcobcofg
UserType.RTR_COB[1]=$281;COB-ID281讀å–
UserType.RTR_COB[2]=$381;......
UserType.RTR_COB[3]=$481
;cmmdcobcofg
UserType.Send_COB[1]=$301;COB-ID301寫入
UserType.Send_COB[2]=$301;......
UserType.Send_COB[3]=$401;......
;nodeidcofg
UserType.Node[1]=$01;RS-485節(jié)點地å€
UserType.Node[2]=$02;..
UserType.Node[3]=$03
PDO程åº;
(*cyclicprogram*)
loopi=1to3do
m[i]=workstep[i]
selectworkstep[i]
stateSend_NMT
CANwrite_NMT[i].enable=1
CANwrite_NMT[i].us_ident=CANopen_0.us_ident
CANwrite_NMT[i].can_id=NMT_COB;0
CANwrite_NMT[i].data_adr=adr(NMT_Data[0])
CANwrite_NMT[i].data_lng=sizeof(NMT_Data)
CANwrite_NMT[i]FUBCANwrite()----?使I-78232D進入é‹è¡Œç‹€æ…‹(tà i)
whenCANwrite_NMT[i].status<>MSG_BUSY;1
nextSend_Data1
stateSend_Data1
(*PDO1RX*)
CANwrite_data1[i].enable=1
CANwrite_data1[i].us_ident=CANopen_0.us_ident
CANwrite_data1[i].can_id=UserType.Send_COB[i]
CANwrite_data1[i].data_adr=adr(UserType.Txdata[i].Data[0])?å°‡è¦å¯«å…¥çš„æ•¸æ“š
CANwrite_data1[i].data_lng=sizeof(UserType.Txdata[i])
CANwrite_data1[i]FUBCANwrite()
whenCANwrite_data1[i].status<>MSG_BUSY;1
nextSend_Data2
stateSend_Data2(*PDO1TX*)
(*è®€å–æ¨¡å¼ç‚ºç•°æ¥RTR*)
CANrtr_01[i].request=notCANrtr_01[i].request
CANrtr_01[i].enable=1
(*enablethefunctionblockCANrtr*)
CANrtr_01[i].us_ident=CANopen_0.us_ident
(*setus_idwiththevaluefromCANopen*)
CANrtr_01[i].data_adr=ADR(UserType.Rxdata[i].Data[0]);å˜å„²è®€å…¥çš„æ•¸æ“š
(*setthedestinationadress*)
CANrtr_01[i].can_id=UserType.RTR_COB[i]
(*setcan_id*)
CANrtr_01[i]FUBCANrtr();發(fÄ)é€è«‹æ±‚è®€å–æ•¸æ“š
(*callCANrtr*)
whenCANrtr_01[i].status<>MSG_BUSY;1
nextSend_Data1
endselect
endloop
數據轉æ›ç¨‹åºï¼š
(*cyclicprogram*)
loopi=1to2do
ifi=1then
memcpy(adr(mActFreq[i]),adr(UserType.Rxdata[i].Data[2]),2)
MotorApp[i].rActFreq=real(mActFreq[i])/100.0;actfreqence
memcpy(adr(MotorApp[i].rStatus),adr(UserType.Rxdata[i].Data[0]),2);statusword
UserType.Txdata[i].Data[0]=byte(MotorApp[i].wCtrlWord);setcontrlword
UserType.Txdata[i].Data[1]=byte(lsr(MotorApp[i].wCtrlWord,8))
UserType.Txdata[i].Data[2]=byte(uint(MotorApp[i].wSetfreq*100));setFreqence
UserType.Txdata[i].Data[3]=byte(lsr(uint(MotorApp[i].wSetfreq*100),8))
UserType.Txdata[i].Data[4]=UserType.Txdata[i+1].Data[4]
UserType.Txdata[i].Data[5]=UserType.Txdata[i+1].Data[5]
UserType.Txdata[i].Data[6]=UserType.Txdata[i+1].Data[6]
UserType.Txdata[i].Data[7]=UserType.Txdata[i+1].Data[7]
else
memcpy(adr(mActFreq[i]),adr(UserType.Rxdata[i].Data[0]),2)
MotorApp[i].rActFreq=real(mActFreq[i])/100.0;actfreqence
memcpy(adr(MotorApp[i].rStatus),adr(UserType.Rxdata[i].Data[2]),2);statusword
UserType.Txdata[i].Data[4]=byte(MotorApp[i].wCtrlWord);setcontrlword
UserType.Txdata[i].Data[5]=byte(lsr(MotorApp[i].wCtrlWord,8))
UserType.Txdata[i].Data[6]=byte(uint(MotorApp[i].wSetfreq*100));setFreqence
UserType.Txdata[i].Data[7]=byte(lsr(uint(MotorApp[i].wSetfreq*100),8))
UserType.Txdata[i].Data[0]=UserType.Txdata[i-1].Data[0]
UserType.Txdata[i].Data[1]=UserType.Txdata[i-1].Data[1]
UserType.Txdata[i].Data[2]=UserType.Txdata[i-1].Data[2]
UserType.Txdata[i].Data[3]=UserType.Txdata[i-1].Data[3]
endif
status_1=UserType.Rxdata[1].Data[1]
status_2=UserType.Rxdata[1].Data[7]
endloop
注æ„:在MODBUSåœ°å€æ˜ 射時沒有按COB-IDå°é½Šï¼ˆç¯€(jié)çœç©ºé–“地å€ï¼‰å¦‚在寫入時COB-ID為0X301一次å¯å¯«å…¥4個å—,å‰å…©å€‹å—為#1è™Ÿè®Šé »å™¨çš„MODBUS地å€ï¼ŒåŽå…©å€‹å—為#2è™Ÿè®Šé »å™¨MODBUS地å€ï¼Œè®€å–地å€åŽŸç†ç›¸åŒï¼Œå…·é«”查看I-7232Dçš„PDOçš„åƒæ•¸åˆ—表
è²æ˜Žï¼šæœ¬æ–‡ç‚ºè½‰è¼‰é¡žæ–‡ç« ,如涉åŠç‰ˆæ¬Šå•é¡Œï¼Œè«‹åŠæ™‚è¯ç³»æˆ‘們刪除(QQ: 2737591964),ä¸ä¾¿ä¹‹è™•,敬請諒解ï¼
標簽:
上一篇:扶梯解決方案
下一篇:視覺+機器人,如何實ç¾é€£æŽ¥å™¨...
ä¸åœ‹å‚³å‹•網版權與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²æ³¨æ˜Ž[來æºï¼šä¸åœ‹å‚³å‹•ç¶²]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Šå‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(www.hysjfh.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉載請與0755-82949061è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥(yè)內投稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊