西門子plc如何modbus?你知道怎么用嗎?詳細(xì)教程(1)modbus通訊西門子s7-200的modbus通訊:
西門子s7-200只支持modbus rtu協(xié)議,不支持modbus ascii協(xié)議;
modbus是一種單主站的主/從通信模式。一條modbus網(wǎng)絡(luò)上同時(shí)只能有一臺(tái)主站,從站可以有若干個(gè)(如下圖所示)。從站的地址范圍為1-247;
一個(gè)modbus通訊的傳輸字符應(yīng)包括一個(gè)起始位,8個(gè)數(shù)據(jù)位,1個(gè)或0個(gè)校驗(yàn)位(奇偶校驗(yàn)或無校驗(yàn)可選擇),以及一個(gè)停止位。
在西門子s7-200 cpu通信口上實(shí)現(xiàn)的是rs485半雙工通信,使用的是s7-200的自由口功能。
上圖是一個(gè)典型的主站和從站的網(wǎng)絡(luò)結(jié)構(gòu),對(duì)于modbus主站而言可以對(duì)從站進(jìn)行讀或者寫的操作,其中它所支持的功能碼(fc,function code)包括主站左側(cè)表格中所述功能,例如功能碼為'01'時(shí)表示讀取單個(gè)/多個(gè)線圈(do)狀態(tài)或功能碼為'04'時(shí)表示讀取單個(gè)/多個(gè)輸入寄存器(ai)狀態(tài)。
而對(duì)于從站,我們只需要把modbus的標(biāo)準(zhǔn)地址和從站的地址對(duì)應(yīng)關(guān)系建立好就可以了,s7-200的從站與modbus標(biāo)準(zhǔn)的對(duì)應(yīng)關(guān)系如從站右側(cè)表格所示。
表中左側(cè)是modbus標(biāo)準(zhǔn)地址碼,其中1-128對(duì)應(yīng)于s7-200的q0.0-q15.7,10001-10128對(duì)應(yīng)于s7-200的i0.0-i15.7,30001-30032對(duì)應(yīng)于aiw0-aiw62,40001-4xxx對(duì)應(yīng)的是s7-200的保持寄存器(v區(qū)),它的范圍是t-t+2*(xxxx-1),t表示的是v區(qū)的起始地址,這一點(diǎn)由modbus從站的指令所決定的。
modbus的主站指令叫做mbus_msg,通過這條指令可以將modbus的標(biāo)準(zhǔn)報(bào)文發(fā)給從站,例如在上圖例子當(dāng)中從站的個(gè)字節(jié)是03,表示的是從站的地址,fc功能碼為03,表示的是讀取單個(gè)/多個(gè)保存寄存器,modbus標(biāo)準(zhǔn)地址是40001,長(zhǎng)度是10。隨著功能碼的不同,報(bào)文的格式會(huì)發(fā)生相應(yīng)的變化,具體的報(bào)文格式需要去參閱modbus的通訊手冊(cè)。
從站的指令時(shí)mbus _slave,在接到主站發(fā)給它的報(bào)文后會(huì)根據(jù)報(bào)文的需求返回報(bào)文,比如在上圖例子中返回的格式是個(gè)字節(jié)為從站的地址,第二個(gè)為功能碼,第三個(gè)是數(shù)據(jù)返回給主站,這樣就完成了一次modbus通訊的請(qǐng)求與應(yīng)答的過程。
(2)modbus庫(kù)文件的安裝和調(diào)用如果想要應(yīng)用modbus指令庫(kù),那么首先需要到因特網(wǎng)上或者向西門子的客服人員申請(qǐng)名稱為'toolbox_v32-step 7-micro win' 的指令庫(kù),將它解壓并且安裝到micro win當(dāng)中就可以使用了,安裝后會(huì)在micro win的庫(kù)文件當(dāng)中出現(xiàn)上圖標(biāo)記的三個(gè)庫(kù),其中port0和port1都可以做modbus master,而slave只有port0口可以做。
(3)modbus庫(kù)文件的使用使用方法很簡(jiǎn)單,打開modbus主站指令庫(kù)會(huì)有相應(yīng)的指令塊出現(xiàn),直接把指令塊拖拽到程序當(dāng)中進(jìn)行調(diào)用就可以了。
在調(diào)用modbus庫(kù)指令的時(shí)候,需要注意一定記得為modbus庫(kù)文件分配庫(kù)存儲(chǔ)區(qū)。具體的方法是右鍵單擊庫(kù),然后選擇庫(kù)存儲(chǔ)區(qū),在彈出來的對(duì)話框當(dāng)中可以選擇建議地址,自動(dòng)分配一個(gè)程序里面不會(huì)用到的地址區(qū)間,也可以人為地手動(dòng)填寫起始地址,這個(gè)區(qū)間在程序當(dāng)中不可以和其他的數(shù)據(jù)區(qū)相沖突,否則modbus功能將不正常。
所謂的庫(kù)存儲(chǔ)區(qū)其實(shí)就是modbus指令庫(kù)能夠正常工作所必須的一部分背景數(shù)據(jù),只要給它分配好區(qū)間并保證不與程序當(dāng)中其他的地址相沖突就可以了。
(4)modbus從站指令從站指令一共有兩條,條是從站的初始化指令(mbus_init),另一條是mbus_slave從站指令,在modbus從站的初始化指令當(dāng)中涉及哪些內(nèi)容呢?
首先,個(gè)引腳mode表示等于1的時(shí)候是啟動(dòng)modbus,等于0的時(shí)候是關(guān)閉modbus,addr表示的是這個(gè)從站的從站地址,baud表示波特率,parity是奇偶校驗(yàn),0是無校驗(yàn),1是奇校驗(yàn),2是偶校驗(yàn),delay是附加字符之間的延遲,maxiq表示的是大i/q地址(默認(rèn)128),maxai表示的是大ai長(zhǎng)度(默認(rèn)32),maxhold表示的是大的v存儲(chǔ)區(qū)(vw),關(guān)鍵的是holdstart,表示的是v區(qū)起始地址(對(duì)應(yīng)40001),在之前已經(jīng)提到過s7-200作為從站的時(shí)候,它的v區(qū)地址對(duì)應(yīng)于modbus標(biāo)準(zhǔn)地址的起始地址是可更改的,那么就在這里進(jìn)行設(shè)定,在本例中如果holdstart寫的是vb0,那么40001對(duì)應(yīng)的地址就是vw0,40002對(duì)應(yīng)的地址是vw2,40003對(duì)應(yīng)的地址是vw4,以此類推,每一個(gè)標(biāo)準(zhǔn)的modbus地址碼對(duì)應(yīng)的是一個(gè)word,以字為單位,同樣如果這里設(shè)的是vb100,那么40001對(duì)應(yīng)的就是vw100,40002對(duì)應(yīng)的是vw102,以此類推。
這一條初始化指令只需要調(diào)用一次就可以了,所以在上圖中用的是sm0.1在上電的時(shí)候執(zhí)行一次就可以了。
mbus_slave這個(gè)功能塊必須要用前面的條件必須是一直為1的,上圖中用sm0.0。