先放結(jié)論,兩個大坑:
1.數(shù)據(jù)地址加4萬或40萬,來幫助PLC確定Modbus功能代碼;
2.和某些設(shè)備通信時,需要給數(shù)據(jù)地址+1。
本文內(nèi)容:幫讀者找到通信失敗的原因,不是完整的教程。
硬件設(shè)備:CPU1212C,485通信模塊CM1241,Modbus從機(jī)(比如變送器,變頻器)。
編程軟件:TIA Portal
485接線
CM1241帶一個DB9接頭,接線按照 "3號管腳是485+,8號是485-"進(jìn)行,不要看AB。2根線就夠,不用接GND。
TIA Portal函數(shù)塊的選用
如下圖,函數(shù)區(qū)里有兩個MODBUS的文件夾,上面的帶(RTU)的和下面的那個。在使用的時候只用一個文件夾里的函數(shù),不要混用,而且兩組函數(shù)的用法不太一樣。
Modbus編程,大致步驟是先用MB_COMM_LOAD初始化,再用MB_MASTER將PLC作為主機(jī)向從機(jī)發(fā)起通信,具體做法可以網(wǎng)上搜到。新版函數(shù)需要設(shè)置背景數(shù)據(jù)塊 “Modbus_Comm_Load_DB”.MODE=4,表示485半雙工通信方式,算個小坑。
MODBUS標(biāo)準(zhǔn)幀結(jié)構(gòu)
Modbus數(shù)據(jù)幀的一般結(jié)構(gòu)是:
根據(jù)命令碼的不同,上面“數(shù)據(jù)內(nèi)容”會有不同的劃分。最常用的命令碼是03和06。03表示主機(jī)讀取從機(jī)里多個字(英文word)的數(shù)據(jù),一個字就是2個字節(jié)。03功能碼的示例:
06表示主機(jī)向從機(jī)寫入1個字的數(shù)據(jù):
疊加地址基數(shù)
MB_MASTER函數(shù)塊:
了解了幀結(jié)構(gòu)之后,如果直接把起始地址輸入到函數(shù)里,會通信失敗。這時候就需要看西門子的文檔了。
可以發(fā)現(xiàn),函數(shù)上不能直接輸入Modbus功能碼,而且多了一個MODE輸入??匆幌潞瘮?shù)的參數(shù)說明:
可見,需要通過指定MODE和數(shù)據(jù)地址,來間接的確定功能碼。上表種的“Modbus地址”就是數(shù)據(jù)地址。
在Modbus幀結(jié)構(gòu)里,數(shù)據(jù)地址一般是占用1個字,所以理論上地址可以是0~0xFFFF種的任意一個數(shù),最大值0xFFFF對應(yīng)十進(jìn)制的65535。
這時候直接輸入原始的數(shù)據(jù)地址就會出錯。比如在MODE=0的情況下,數(shù)據(jù)地址是2000,PLC就以為要讀取一個位;地址是30001,PLC以為要讀取一個字,完全混亂了。
為了避免混亂,正確做法是給數(shù)據(jù)地址加上一個“基數(shù)”,再輸入到函數(shù)。 具體加什么基數(shù)要看上面的表格。比如原地址是2000,想要把功能碼設(shè)為03,就要把MODE設(shè)為0,數(shù)據(jù)地址加4萬或40萬,變成42000或402000,讓PLC能根據(jù)MODE和地址,定位到功能碼03。PLC在實(shí)際發(fā)送的時候會自動減掉基數(shù)。
為什么有4萬和40萬兩個基數(shù)?根據(jù)前面的分析,原數(shù)據(jù)地址最大能到65535,這時候如果加4萬,變成105535,就超出表格里40001~49999的范圍了。如果加40萬,變成465535,正好在表格里40萬地址區(qū)間之內(nèi)。所以基數(shù)40萬適用于所有的Modbus從機(jī),4萬可以用于地址范圍比較小的設(shè)備。
根據(jù)情況,給地址加一
解決基數(shù)問題之后,還是一直報錯,直到看到一篇教程上說:
DATA_ADDR–從站的起始地址(需將從站的地址由16進(jìn)制轉(zhuǎn)換為10進(jìn)制,轉(zhuǎn)換成10進(jìn)制后,數(shù)據(jù)加1(因?yàn)閺恼镜刂肥菑?開始的,而PLC的地址是從1開始的,所以要加1)) ;
于是破案了。至于數(shù)據(jù)地址要不要加一,需要看具體設(shè)備的說明書。一般地址從個位數(shù)1開始的,就是已經(jīng)加過1了,可以直接用;從整數(shù)開始的就要自己加1。不確定就做個實(shí)驗(yàn)。
最后放兩個案例:
案例1:從力傳感器讀取重量值
查看變送器說明書:
現(xiàn)在想要讀取重量。
確定MODE: 是讀取操作,需要功能碼03,所以MODE設(shè)為0.
確定DATA_ADDR:
根據(jù)變送器說明書,數(shù)據(jù)的原地址是1.
根據(jù)變送器說明書,數(shù)據(jù)地址都在一萬以內(nèi),所以基數(shù)采用4萬或40萬都行。這里采用4萬,疊加后地址變?yōu)?0001. 而且這個數(shù)據(jù)地址不需要再加一了。
確定DATA_LEN: 重量數(shù)據(jù)占用4個字節(jié),所以DATA_LEN=2(字)。
通信成功后,數(shù)據(jù)會被放到DATA_PTR指向的PLC存儲空間。文章來源:http://www.zghlxwxcb.cn/news/detail-442177.html
案例2:變頻電機(jī)控制
查閱變頻器說明書:
現(xiàn)想要控制電機(jī)正轉(zhuǎn)運(yùn)行。
確定MODE: 是寫入操作,MODE=1。
確定DATA_ADDR: 數(shù)據(jù)原地址是2000H(16進(jìn)制),轉(zhuǎn)換為10進(jìn)制是8192。
觀察發(fā)現(xiàn),說明書上地址是從個位為0的整數(shù)開始的,所以地址要加1.
觀察發(fā)現(xiàn),變頻器上的數(shù)據(jù)地址范圍比較大,超過了1萬,所以統(tǒng)一加基數(shù)40萬。
綜上,輸入到PLC函數(shù)的數(shù)據(jù)地址是:400,000+8192+1=408,193.
確定DATA_LEN:命令信息占用1個字,所以DATA_LEN=1.
數(shù)據(jù)值 :在DATA_PTR指向的變量里,設(shè)置命令值0001。文章來源地址http://www.zghlxwxcb.cn/news/detail-442177.html
到了這里,關(guān)于S7-1200PLC Modbus通信踩坑記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!