溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

單片機MODBUS通信源代碼

發(fā)布時間:2020-06-25 13:59:09 來源:網(wǎng)絡(luò) 閱讀:5156 作者:秋天的細語 欄目:編程語言
好久沒有寫些什么了,最近在出差也沒做關(guān)于Linux的東西。由于是做自動化的因此最近做了一塊單片機的板子要作為MODBUS從站來與上面的觸摸屏進行顯示功能還不是很完善但是MODBUS功能的模塊程序已經(jīng)寫好經(jīng)過測試基本可以用。
具體要求是下面有2個AI和4個DO量需要檢測和控制,我使用的是90C52單片機模擬量采集部分用的OP07的放大器電路,這里就不詳細說明了(有需要的可以留言,有圖紙),最麻煩的就是MODBUS通訊部分。
一開始我根據(jù)MODBUS標(biāo)準(zhǔn)協(xié)議規(guī)定來做了程序但是不能通訊經(jīng)過總結(jié)主要問題出在二個地方
第一:crc校驗計算不正確
第二:發(fā)送的程序太大導(dǎo)致發(fā)送時間過長主站端認為超時(我自己認為的原因)

經(jīng)過仔細研究發(fā)現(xiàn)CRC校驗的程序我根本寫不出來也理解不了網(wǎng)絡(luò)上有很多現(xiàn)成的可以直接拿來來用就很好了,經(jīng)過精簡程序是可以進行通信了但是還有一個很重要的問題是超時判斷的問題一直沒能處理所以進行了以下時間問題的總結(jié)
Modbus字符與數(shù)據(jù)幀間隔時間問題
1、MODBS協(xié)議中的規(guī)定如下
在RTU模式,報文有時間長至少3.5個字符時間的空間間隔區(qū)分如下圖

整個報文必須以連續(xù)的字符流發(fā)送,如果兩個字符之間的空閑大于1.5個字符時間,則報文幀認為不完整,應(yīng)該被接收點丟棄。

需要注意的是RTU接收驅(qū)動程序的實現(xiàn),由于1.5T和3.5T的定時,隱含著大量對中斷的管理。在高通信速率下,導(dǎo)致CPU負擔(dān)加重,因此在<=19200pbs時這兩個定時必須嚴格遵守;對于>19200pbs的情形應(yīng)該使用2個定時的固定值,建議字符間的超時時間t1.5為750us;幀間超時時間為1.75ms
上面是MODBUS協(xié)議中的規(guī)定,但在實際使用中1.5T都沒有必要關(guān)注。而幀與幀之間的3.5T則需要程序處理一下。由于RTU模式?jīng)]有起始符和結(jié)束符,兩個數(shù)據(jù)包之間只能靠時間間隔來區(qū)分。在儀表在工廠實際使用過程中一般都是間隔40ms、50ms甚至更長時間讀一次數(shù)據(jù),這個間隔完全超過了T3.5;
假設(shè)現(xiàn)在波特率是9600bps要發(fā)送取數(shù)據(jù)的請求:
01 03 00 01 00 01 D5 CA (格式為8個數(shù)據(jù)位1個停止位)
那么每個字節(jié)包含一個起始位一個停止位也就是10位
那么發(fā)送這串命令要花費時間為:8×10/9600×1000=8.3ms
即第一幀發(fā)送時間為8.3ms而3.5T的時間為3.5×10/9600×1000=3.65ms
所以第二幀數(shù)據(jù)開始發(fā)送的時間至少是第12ms開始(8.3+3.65=11.95ms)
之后修改程序后終于可以達到預(yù)期的效果但是我用三個軟件進行調(diào)試都可以讀到數(shù)據(jù)(串口調(diào)試助手,MODBUSSIM,modscan)其中只有modscan接收數(shù)據(jù)的時候閃一下紅但是能讀到數(shù)據(jù)不知道為什么調(diào)節(jié)了他的poll時間還是不行其他兩個軟件正常也可以寫數(shù)據(jù)。想了一下覺得這兩天也就干了這么些事。程序是用keil寫的有需要的可以聯(lián)系我,可以直接用。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI