modbus地址實際上分為兩種情況。下面以西門子s7-200/s7-200 smart/和s7-1200為例來說明:
第一種情況:plc作modbus主站,modbus地址和plc手冊里的地址一致,例如作主站的s7-200的mbus_msg指令用于向modbus從站發(fā)送請求消息,和處理從站返回的響應(yīng)消息。要讀取從站(另一臺s7-200)的i0.0開始的地址區(qū)時,它的輸入?yún)?shù)addr(modbus地址)為10001。s7-200從站保持寄存器的v區(qū)起始地址為vb200時,要讀取從站vw200開始的v存儲區(qū)時,保持寄存器的地址是40001。
第二種情況:plc作從站,plc不用管什么modbus地址,等著主站來讀寫它的地址區(qū)就是了。
主站的計算機軟件(例如dcs或組態(tài)軟件)的編程人員需要編寫實現(xiàn)modbus通信的程序,首先需要確定modbus rtu的報文結(jié)構(gòu)。他們一般不熟悉plc,因此plc的編程人員往往需要和上位機軟件的編程人員一起來討論modbus的報文結(jié)構(gòu)。
最容易出問題的就是報文里modbus地址與plc存儲區(qū)地址的對應(yīng)關(guān)系。我做過的一個系統(tǒng)的上位機是專用的組態(tài)軟件,我通過分析ge plc手冊給出的crc的循環(huán)異或計算實例每一步的中間數(shù)據(jù),編寫出了crc計算的c語言程序。通過實驗驗證了modbus報文結(jié)構(gòu)和crc的計算的可行性。
s7 plc手冊給出的modbus地址與modicon公司和ge公司plc使用的地址相同,是基于1的地址,即同類元件的首地址為1。而西門子plc采用的是基于0的地址,即同類元件的首地址為0。modbus報文中西門子plc的modbus地址也采用基于0的地址。
plc系統(tǒng)手冊中的modbus地址的最高位用來表示地址區(qū)的類型,例如i0.0的modbus地址為10001。因為地址區(qū)類型的信息已經(jīng)包含在報文的功能碼中了,報文中s7-200的i0.0的modbus地址不是10001,而是0。報文中其他地址區(qū)的modbus地址也應(yīng)按相同的原則處理。例如當(dāng)s7-200從站保持寄存器的v區(qū)起始地址為vb200時,vw200對應(yīng)的保持寄存器在報文中的modbus地址為0,而不是40001。