關(guān)于modbus在485項目中的應(yīng)用問題
按照前輩們的意見,最近在研究modbus通信。我的modbus協(xié)議在只有上位機和多個光桿司令下位機的情況下仿真初步通信成功。但是感覺自己還有很多欠考慮的。目前我的上位機是每100ms發(fā)送一組數(shù)據(jù)給485上的下位機,輪詢下去,地址匹配的下位機即傳送溫度數(shù)據(jù)。
問題是我的下位機需要不斷通過18b20測量溫度,18b20每測量一次溫度就需要將近1s,不知道整個系統(tǒng)的最佳時間分配應(yīng)該是怎樣呢,因為modbus對時間和中斷很嚴格,我很怕搞亂。所以希望前輩們可以具體指點下,怎么樣的時間順序方案最適合我的系統(tǒng)呢? 謝謝!
/////////////////////////////////////////////////////////////////////////////////////////
謝謝前輩指點,我調(diào)試了下程序,一旦通訊發(fā)生進入中斷,返回后很容易會導致破壞了18b20的時序圖,導致進入死循環(huán),或者出錯
提問者:天微JSB
地點:-
瀏覽次數(shù):3576
提問時間:10-14 14:37
我有更好的答案
- 13條回答
-
60user164
07-06 23:20
從協(xié)議本身講,Modbus并無特別的輪詢時間要求,只是在某些特定應(yīng)用中才有要求。針對樓主的測溫系統(tǒng),合適的輪詢時間由主機需要在多長時間內(nèi)采集到全部節(jié)點的數(shù)據(jù)決定,但再短也不能短于傳感器讀取時間周期。對與Modbus,關(guān)鍵是理解其思想,該協(xié)議是一個典型的、嚴謹?shù)闹鲝牟樵儠捠絽f(xié)議,這類協(xié)議的應(yīng)用相對比較廣泛,理解其精髓然后根據(jù)自己的實際應(yīng)用編制即可。
-
xj5548
07-04 17:05
恩 那在波特率在9600的情況下 主機發(fā)送一組數(shù)據(jù)去一號從機并且一號從機回復,到主機開始發(fā)送一組數(shù)據(jù)到二號從機這之間的時間間隔還可以更短吧 只要保證這組數(shù)據(jù)發(fā)送過去并且響應(yīng)回來就可以吧 100MS有些長吧,不知道這個最短時間應(yīng)該如何算?因為我的測溫點有多達100多個,所以輪詢一遍肯定會超過1S的傳感器讀取時間吧 2# chunyang
-
MAZHILEI
06-30 12:17
上位機收集多個下位機傳上來的溫度數(shù)據(jù) 因為下位機的溫度傳感器檢測溫度每次需要1s 如果上位機一直輪詢發(fā)送接收的話那么下位機就一直進中斷了 是不是應(yīng)該給一部分時間讓下位機進行溫度測量,在這期間不發(fā)生通信事件
-
wuQAQ
06-29 10:07
我這樣做行不行 就是通信和下位機檢測完全分開 通信時不執(zhí)行下位機的檢測工作,等通信結(jié)束后 執(zhí)行一遍下位機檢測,然后停止再開始執(zhí)行通信
-
xiongcanfei
07-06 17:06
主機發(fā)送數(shù)據(jù)或指令后延時1mS左右即可進行收發(fā)切換,從機開始回應(yīng)的時間略長于這個延時即可。數(shù)據(jù)采集和通訊是不同的任務(wù),二者可以同時進行。如果編程技巧和思想不能實現(xiàn)多任務(wù)調(diào)度的話,一個節(jié)點通訊完成后立刻進行數(shù)據(jù)采集即可,只要網(wǎng)絡(luò)循環(huán)時間大于數(shù)據(jù)采集周期即可。
-
jinheng
07-06 07:58
謝謝前輩指點,我調(diào)試了下程序,一旦通訊發(fā)生進入中斷,返回后很容易會導致破壞了18b20的時序圖,導致進入死循環(huán),或者出錯
-
骷髏玫瑰
07-07 09:42
下位機不停地檢測溫度,放入一個寄存器,modbus直接讀就可以了,這樣溫度會有一些不同步,但對于溫度這樣的慢系統(tǒng),是沒有影響的!
PLC就是這樣工作的,并不是要什么數(shù)據(jù)再去操作!
-
小馬哥996
07-06 04:34
解析Modbus命令之后就由串口中斷收發(fā)數(shù)據(jù),進入串口中斷處理一個字節(jié)的時間應(yīng)該不會影響你18b20的時序吧..
-
semiaxis
07-04 02:04
18B20時序很嚴格,但是在臨界區(qū)的時間并不長。臨界區(qū)之外能干別的事情。
用485進行MODBUS通信,當從機收到主機命令,直接發(fā)送溫度數(shù)據(jù)即可,這個溫度數(shù)據(jù)是之前放在緩沖里的數(shù)據(jù),沒有必要在收到命令之后再去控制18B20采集溫度,這樣會造成主機等待超時。
假設(shè)采用9600波特率,從機大約有1ms的時間去做別的事情,如果做一件事情(獨占的,禁止中斷)的時間超過了這個時間,就會造成串口的數(shù)據(jù)丟失,從而使命令無法解析。但是考察18b20的時序,根本就不需要這么長的時間去進入臨界區(qū)進行操作,它們的時間都不在一個數(shù)量級,所以你有足夠的時間響應(yīng)串口的數(shù)據(jù)。另外在進入串口中斷之后處理接收到的數(shù)據(jù)所經(jīng)歷的時間也不是很長,并不會影響18B20的操作,況且此時18B20的操作已經(jīng)不再臨界區(qū)了,所以就不用擔心這個事了。
-
zmyecho
07-07 06:09
謝謝各位前輩們這么詳細的回答,我有如下問題:
1 18b20臨界區(qū)指什么呢?是不能發(fā)生中斷的區(qū)域嗎?具體是在哪一個區(qū)域段呢?
2 我是這樣編程的,18b20不斷檢測溫度 把檢測到的溫度不斷更新放在一個uint16的變量中,一旦上位機發(fā)來,就可以讀該寄存器變量讀走,您說的緩沖是這個意思吧。
3 調(diào)試了下,程序確實跑會進入了死循環(huán),有時還會出現(xiàn)讀錯;如果去掉通信18b20則正常。
4 “另外在進入串口中斷之后處理接收到的數(shù)據(jù)所經(jīng)歷的時間也不是很長,并不會影響18B20的操作,況且此時18B20的操作已經(jīng)不再臨界區(qū)了,所以就不用擔心這個事了?!蓖ㄟ^modbus過來進入中斷后,會執(zhí)行解析,校驗,讀寄存器等,時間會不會比較長,導致中斷返回后出錯?為何此時18B20的操作已經(jīng)不再臨界區(qū)了呢?因為我調(diào)試確實出了錯
-
ydfywerfs
07-04 17:34
回復yuse:
1 我指的臨界區(qū)是說這個臨界區(qū)的時間段內(nèi) 最好不要去處理別的任務(wù) 否則會超越臨界區(qū)導致錯誤 舉個例子MCU在讀取18b20的數(shù)據(jù)時要求在15us內(nèi)進行操作 這個時候MCU最好不要去干別的事情 否則可能就錯過了 但是也不是絕對的講就不能去響應(yīng)中斷 如果干別的事情并不會影響這個時間的要求也是可以的 這就要求你對程序運行過程很了解。
2 你說的對。
3 估計問題在于18b20的操作不嚴謹 導致跨越了臨界區(qū)
4 不在臨界區(qū) 所以開了中斷 然后響應(yīng)了中斷 既然已經(jīng)不再臨界區(qū) 那么中斷處理多花些時間也無妨。
-
daichuangs
07-02 00:00
modbus 串行鏈路用RS485,想問下各個從站之間除了連A,B線之外還需要接一根共地線么
-
yysdywerw
07-06 22:46
上位機100ms召喚一次,那在50ms(例如,可改)任務(wù)里,處理接收到的命令報文并返回溫度數(shù)據(jù),在1S任務(wù)里,讀取18B20上一次轉(zhuǎn)換的溫度數(shù)據(jù),并啟動下一次轉(zhuǎn)換。這樣是否可以實現(xiàn)了,在18B20處理溫度轉(zhuǎn)換期間來對進行modbus響應(yīng)