日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

工业机器人(5)-串口通信技术与MODBUS协议

發(fā)布時(shí)間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 工业机器人(5)-串口通信技术与MODBUS协议 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


目錄

1.?基本的通訊方式

擴(kuò)展資料

串行和并行的區(qū)別

2.?串行通訊的兩種方式

3.?根據(jù)傳送方向分類

4.?串行通訊接口

5. RS485接口電路

6. 串口MODBUS通訊

7. MODBUS消息報(bào)文

8. MODBUS關(guān)鍵概念

9. MODBUS主站常用操作

10 示例程序


1.?基本的通訊方式

基本的通訊方式有并行通訊串行通訊兩種。

在遠(yuǎn)程通信和計(jì)算機(jī)科學(xué)中,串行通信(英語:Serial communication)是指在計(jì)算機(jī)總線或其他數(shù)據(jù)通道上,每次傳輸一個(gè)位元數(shù)據(jù),并連續(xù)進(jìn)行以上單次過程的通信方式。與之對(duì)應(yīng)的是并行通信,它在串行端口上通過一次同時(shí)傳輸若干位元數(shù)據(jù)的方式進(jìn)行通信。

? ? ? 串行通信被用于長(zhǎng)距離通信以及大多數(shù)計(jì)算機(jī)網(wǎng)絡(luò),在這些應(yīng)用場(chǎng)合里,電纜和同步化使并行通信實(shí)際應(yīng)用面臨困難。

? ? ?憑借著其改善的信號(hào)完整性和傳播速度,串行通信總線正在變得越來越普遍,甚至在短程距離的應(yīng)用中,其優(yōu)越性已經(jīng)開始超越并行總線不需要串行化元件(serializer),并解決了諸如時(shí)鐘偏移(Clock skew)、互聯(lián)密度等缺點(diǎn)。PCI到PCI Express的升級(jí)就一個(gè)例子。

并行通信:是指數(shù)據(jù)的各位同時(shí)進(jìn)行傳送的通信方式。

串行通信:是指數(shù)據(jù)一位一位順序傳送的通信方式。

擴(kuò)展資料

1. 基本概念:

并發(fā)(Concurrency):以可獨(dú)立執(zhí)行的進(jìn)程集合的方式編程(進(jìn)程是出了名的難定義,這里是通常意義上的進(jìn)程,不是Linux進(jìn)程)? ? ?

并行(Parallelism):以可同時(shí)執(zhí)行的(可能相關(guān)的)計(jì)算指令方式編程。

2.?串行通信和并行通信區(qū)別:

? ? ? ?這里說的通信是指數(shù)字信號(hào)。 數(shù)字信號(hào)是8位二進(jìn)制數(shù),可以使用信號(hào)線傳輸,一種方案是使用一條數(shù)據(jù)線按照次序一個(gè)位一個(gè)位的傳送,每傳送完8位為一個(gè)字節(jié),叫串行通信。另一種方法是使用8條數(shù)據(jù)線分別傳送8位,一次傳送一個(gè)字節(jié),叫并行通信。 實(shí)際傳輸有可能不是8位數(shù)據(jù)而是其它,但原理是相同的。 理論上并行速度比較快,但是串行口線間干擾小,稍遠(yuǎn)的距離速度不低于并行口。

? ? ? 并行通信傳輸中有多個(gè)數(shù)據(jù)位,同時(shí)在兩個(gè)設(shè)備之間傳輸。發(fā)送設(shè)備將這些數(shù)據(jù)位通過對(duì)應(yīng)的數(shù)據(jù)線傳送給接收設(shè)備,還可附加一位數(shù)據(jù)校驗(yàn)位。接收設(shè)備可同時(shí)接收到這些數(shù)據(jù),不需要做任何變換就可直接使用。并行方式主要用于近距離通信。計(jì)算機(jī)內(nèi)的總線結(jié)構(gòu)就是并行通信的例子。這種方法的優(yōu)點(diǎn)是傳輸速度快,處理簡(jiǎn)單。

? ? ?串行數(shù)據(jù)傳輸時(shí),數(shù)據(jù)是一位一位地在通信線上傳輸?shù)?#xff0c;先由具有幾位總線的計(jì)算機(jī)內(nèi)的發(fā)送設(shè)備,將幾位并行數(shù)據(jù)經(jīng)并–串轉(zhuǎn)換硬件轉(zhuǎn)換成串行方式,再逐位經(jīng)傳輸線到達(dá)接收站的設(shè)備中,并在接收端將數(shù)據(jù)從串行方式重新轉(zhuǎn)換成并行方式,以供接收方使用。串行數(shù)據(jù)傳輸?shù)乃俣纫炔⑿袀鬏斅枚?#xff0c;但對(duì)于覆蓋面極其廣闊的公用電話系統(tǒng)來說具有更大的現(xiàn)實(shí)意義。

串行和并行的區(qū)別

1、數(shù)據(jù)傳送方式不同:串行口傳輸方式為數(shù)據(jù)排成一行、一位一位送出接收也一樣,并行口傳輸8位數(shù)據(jù)一次送出.

2、針腳不同:串行口針腳少、并行口針腳多.

3、用途不同:串行口現(xiàn)在只用作控制接口、并行口多用作打印機(jī)、掃描儀等接口。


2.?串行通訊的兩種方式

? ? ? 串行通信的兩種基本形式同步通信和異步通信。

? ? ? 異步通信所傳輸?shù)臄?shù)據(jù)幀格式是由1個(gè)起始位、1~9個(gè)數(shù)據(jù)位、1~2個(gè)停止位組成,依靠起始位和停止位保持同步;

? ? ? 同步通信所傳輸數(shù)據(jù)幀格式是由多個(gè)字節(jié)組成的一個(gè)幀每個(gè)幀都有兩個(gè)(或一個(gè))同步字符作為起始位以觸發(fā)同步時(shí)鐘開始發(fā)送或接收數(shù)據(jù)。


3.?根據(jù)傳送方向分類

? ? ?根據(jù)信息的傳送方向,串行通訊可以進(jìn)一步分為單工半雙工全雙工三種。? 如果在通信過程的任意時(shí)刻,信息只能由一方A傳到另一方B,則稱為單工。如果在任意時(shí)刻,信息既可由A傳到B,又能由B傳A,但只能由一個(gè)方向上的傳輸存在,稱為半雙工傳輸。如果在任意時(shí)刻,線路上存在A到B和B到A的雙向信號(hào)傳輸,則稱為全雙工。


4.?串行通訊接口

?

? ? ? 串行通訊物理接口按電氣標(biāo)準(zhǔn)及協(xié)議來分包括RS-232、RS-422、RS485等,工業(yè)界常用RS485接口。

RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485。

?

? ? ?RS485有兩線制四線制兩種接線,四線制只能實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的通信方式,現(xiàn)很少采用,多采用的是兩線制接線方式,這種接線方式為總線式拓?fù)浣Y(jié)構(gòu),在同一總線上最多可以掛接32個(gè)節(jié)點(diǎn)。

? ? ? 在RS485通信網(wǎng)絡(luò)中一般采用的是主從通信方式,即一個(gè)主機(jī)帶多個(gè)從機(jī)。很多情況下,連接RS-485通信鏈路時(shí)只是簡(jiǎn)單地用一對(duì)雙絞線將各個(gè)接口的“A”、“B”端連接起來,而忽略了信號(hào)地的連接,這種連接方法在許多場(chǎng)合是能正常工作的,但卻埋下了很大的隱患,

原因1是共模干擾:RS-485接口采用差分方式傳輸信號(hào)方式,并不需要相對(duì)于某個(gè)參照點(diǎn)來檢測(cè)信號(hào),系統(tǒng)只需檢測(cè)兩線之間的電位差就可以了,但容易忽視了收發(fā)器有一定的共模電壓范圍,RS-485收發(fā)器共模電壓范圍為-7到+12V,只有滿足上述條件,整個(gè)網(wǎng)絡(luò)才能正常工作;當(dāng)網(wǎng)絡(luò)線路中共模電壓超出此范圍時(shí)就會(huì)影響通信的穩(wěn)定可靠,甚至損壞接口;

原因2是EMI的問題:發(fā)送驅(qū)動(dòng)器輸出信號(hào)中的共模部分需要一個(gè)返回通路,如沒有一個(gè)低阻的返回通道(信號(hào)地),就會(huì)以輻射的形式返回源端,整個(gè)總線就會(huì)像一個(gè)巨大的天線向外輻射電磁波。

RS485 通訊線纜結(jié)構(gòu)圖


5. RS485接口電路

?

作為一個(gè)經(jīng)常被應(yīng)用到的SP485R芯片的示范電路,可以被直接嵌入實(shí)際的RS-485應(yīng)用電路中。微處理器的標(biāo)準(zhǔn)串行口通過RXD 直接連接SP485R 芯片的RO 引腳,通過TXD直接連接SP485R 芯片的DI 引腳。

? ? ? ? 由微處理器輸出的R/D 信號(hào)直接控制SP485R 芯片的發(fā)送器/接收器使能:R/D 信號(hào)為“1”,則SP485R 芯片的發(fā)送器有效,接收器禁止,此時(shí)微處理器可以向RS-485 總線發(fā)送數(shù)據(jù)字節(jié);R/D 信號(hào)為“0”,則SP485R 芯片的發(fā)送器禁止,接收器有效,此時(shí)微處理器可以接收來自RS-485 總線的數(shù)據(jù)字節(jié)。此電路中,任一時(shí)刻SP485R 芯片中的“接收器”和“發(fā)送器”只能夠有1 個(gè)處于工作狀態(tài)。

? ? ? 連接至A 引腳的上拉電阻R7、連接至B 引腳的下拉電阻R8 用于保證無連接的SP485R芯片處于空閑狀態(tài),提供網(wǎng)絡(luò)失效保護(hù),以提高RS-485 節(jié)點(diǎn)與網(wǎng)絡(luò)的可靠性。

? ? ? ?如果將SP485R 連接至微處理器80C51 芯片的UART 串口,則SP485R 芯片的RO 引腳不需要上拉;否則,需要根據(jù)實(shí)際情況考慮是否在RO 引腳增加1 個(gè)大約10K 的上拉電阻。

參考文獻(xiàn):https://mp.weixin.qq.com/s/qCGk-d1g5Ej7d0s3fz38PQ


6. 串口MODBUS通訊

Modbus作為工業(yè)通信回路中數(shù)據(jù)交換的規(guī)則已經(jīng)被廣泛地應(yīng)用在各個(gè)領(lǐng)域,使得具有Modbus 通信協(xié)議的設(shè)備方便通信,例如PLC、變頻器、流量計(jì)、溫濕度、上位機(jī)組態(tài)軟件、各種傳感器儀表等。

Modbus通信協(xié)議分為兩種串行通信模式ASCII 和RTU 通信模式。在使用時(shí),需要先設(shè)定通信模式以及串行口RS232、RS485的通信參數(shù)(波特率,奇偶校驗(yàn),從機(jī)地址,數(shù)據(jù)位,停止位,字節(jié)順序),在Modbus 總線上的所有設(shè)備應(yīng)具有相同的通信模式和串行通信參數(shù):

7. MODBUS消息報(bào)文


8. MODBUS關(guān)鍵概念

(1)上位機(jī):讀取數(shù)據(jù)每次間隔時(shí)間一般不小于100ms

(2)設(shè)備地址:MODBUS從機(jī)通訊地址,在一個(gè)網(wǎng)絡(luò)中不能有兩個(gè)相同的地址

(3)功能碼:MODBUS 協(xié)議規(guī)定的功能碼

(4)寄存器地址和寄存器數(shù)

?主站命令中的參數(shù)是從寄存器地址開始的寄存,讀寄存器長(zhǎng)度的N個(gè)寄存器。

(5)從站響應(yīng)數(shù)據(jù)

?從站響應(yīng)數(shù)據(jù)是:字節(jié)數(shù)和N個(gè)數(shù)字節(jié)數(shù)據(jù)。


9. MODBUS主站常用操作

1)讀優(yōu)化:對(duì)于不連續(xù)地址的數(shù)據(jù)讀取,是否采取打包讀,則系統(tǒng)使用打包讀命令,一次性完成多個(gè)地址的讀取。

2)讀優(yōu)化間隔:讀優(yōu)化時(shí),若地址之間小于此間隔,則會(huì)打包到一起,使用多讀命令一次讀取。

3)最大包長(zhǎng):一次通訊允許的最大數(shù)據(jù)長(zhǎng)度。

4)字節(jié)順序:調(diào)整32位雙字的解碼順序。

以32位整數(shù)為例,說明字節(jié)順序的含義:

1234:表示雙字元件不做處理直接解碼,。

例如:從串口讀到的數(shù)據(jù)為0000 00 01 表示 1。

2143:表示雙字元件高低字不顛倒,但字內(nèi)高低字節(jié)顛倒。

例如:從串口讀到的數(shù)據(jù)為0000 00 01 表示 0x00000100 (即256)。

3412:表示雙字元件高低字顛倒,但字內(nèi)高低字節(jié)不顛倒。

例如:從串口讀到的數(shù)據(jù)為0000 00 01 表示 0x00010000 (即65536)。

4321:表示雙字元件內(nèi)4個(gè)字節(jié)全部顛倒。

例如:從串口讀到的數(shù)據(jù)為00 00 00 01 表示 0x0100 0000 (即1677 721


10 示例程序

(1).CRC16算法:INT16U CRC16(INT8U *puchMsg, INT16U usDataLen){INT8U uchCRCHi = 0xFF; /* 高CRC字節(jié)初始化 */INT8U uchCRCLo = 0xFF; /* 低CRC 字節(jié)初始化 */INT8U uIndex; /* CRC循環(huán)中的索引 */while (usDataLen--) /* 傳輸消息緩沖區(qū) */{uIndex = uchCRCHi ^*puchMsg++; /* 計(jì)算CRC */uchCRCHi = uchCRCLo ^auchCRCHi[uIndex];uchCRCLo = auchCRCLo[uIndex];}return (uchCRCHi << 8 |uchCRCLo);}(2)發(fā)送命令程序本例程以Mag64為核心CPUvoid Read_InPut(INT8U Addr,INT16UStart,INT16U Len){INT16U CRC;SendBuffer_485[0]=Addr; //設(shè)備地址SendBuffer_485[1]=0x04; //modbus功能碼SendBuffer_485[2]=Start/256; //Start為寄存器地址SendBuffer_485[3]=Start%256;SendBuffer_485[4]=Len/256; //Len為讀取寄存器長(zhǎng)度SendBuffer_485[5]=Len%256;CRC=CRC16(SendBuffer_485,6);SendBuffer_485[6]=CRC/256; //CRC校驗(yàn)高位SendBuffer_485[7]=CRC%256; //CRC校驗(yàn)低位R485_OUT; //使能RS485發(fā)送SendLen_485=8;SendNum_485=0;CloseINT0(); //關(guān)閉串口接受中斷UCSR0B |= BIT(UDRIE0); //打開串口發(fā)送中斷}(3)返回?cái)?shù)據(jù)解析數(shù)據(jù)接收使用串口中斷,ReceivedBuffer_485為接收數(shù)據(jù)組,ReceivedNum_485為接收到數(shù)據(jù)長(zhǎng)度,ReceivedFlag_485接收到數(shù)據(jù)標(biāo)志。函數(shù)float Datasum(INT8UBYTE1, INT8U BYTE2, INT8U BYTE3, INT8U BYTE4)把浮點(diǎn)數(shù)的4個(gè)字節(jié)轉(zhuǎn)換為1個(gè)浮點(diǎn)數(shù)。float Datasum(INT8U FloatByte1, INT8U FloatByte2,INT8U FloatByte3, INT8U FloatByte4){ float aa;union IntTOFP{ FP32 F32;INT8U T8[4];};union IntTOFPaa;aa.T8[0] = FloatByte1; aa.T8[1] = FloatByte2;aa.T8[2] = FloatByte3;aa.T8[3] = FloatByte4;return aa;}void Read_Lmag(INT8U Ad){INT8U i,j;INT8U Num1[10],BIT;INT16UCRC1,CRC2;FP32 Flow; //aaa為瞬時(shí)流量數(shù)值ReceivedFlag_485=1;Open_Time1_Ms5(20);Read_InPut(Ad,0x1010,2); //發(fā)送設(shè)備地址、寄存器地址、寄存器長(zhǎng)度while(ReceivedFlag_485); //等待接收結(jié)束if((ReceivedNum_485==9)&&(ReceivedBuffer_485[0]==Ad)) // 判斷數(shù)據(jù)是否正確{CRC1=CRC16(ReceivedBuffer_485,7); CRC2=ReceivedBuffer_485[7]*256+ReceivedBuffer_485[8];if(CRC1==CRC2){// 轉(zhuǎn)換數(shù)據(jù)為浮點(diǎn)數(shù)Flow= Datasum(ReceivedBuffer_485[6], ReceivedBuffer_485[5], ReceivedBuffer_485[4] ,ReceivedBuffer_485[3]);}}}

?

總結(jié)

以上是生活随笔為你收集整理的工业机器人(5)-串口通信技术与MODBUS协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。