[MOXA] ioLogik NA-4020 Modbus位址計算
ioLogik 4000系列是MOXA早期推出的模組式I/O,最高支援32塊模組(除E4200僅支援16塊模組),提供乙太網路(NA-4010、E4200)、RS-232(NA-4021)、RS-485(NA-4020)的介面,支援Modbus RTU/TCP通訊協定;使用模組式I/O的好處在於可以照自己的需求,選擇DI、DO、Relay、AI、AO、RTD、TC模組進行搭配,以及在乙太網路中節省IP位址的使用,在序列通訊中節省輪詢的時間,並且將大量的I/O資訊,用較少的通訊次數全部獲取。
在Modbus位址的排序上,因為模組式I/O無法預測使用者會使用多少模組,所以Modbus位址會依照使用者使用的模組的數量與通道數而改變;原則上Modbus位址的排序都會有固定的邏輯,例如銜接上一塊模組的位址繼續往下排,或者每塊模組固定占用多少個Modbus位址等方式。
同時也測試AO輸出的最大RAW值為4095,二進位為1111 1111 1111,使用12 bits,與手冊上說明的相同,而上圖的設定檔中,AO的I/O Data Length是16(0x10) bits,所以實際上AO每個通道所佔用的位址應該要以16 bits計算;綜合上述的資訊來解讀設定檔的內容,DO使用了Modbus位址0x0800的0x00到0x07共8 bits,代表了DO0到DO7,AO0使用了Modbus位址0x0800的0x08之後的16 bits,AO1使用了Modbus位址0x0801的0x08之後的16 bits。
理解設定檔的內容後,接著便是觀察實際透過Modbus讀取時的狀況,同樣利用ioAdmin Configuration Utility對AO兩個通道產生不同的輸出測試的電壓,方便觀察時辨識;AO0為5.86VDC,RAW值為2399,AO1為8.58VDC,RAW值為3516。
根據設定檔中得到的資訊,DO使用了Modbus位址2049的0x00到0x07共8 bits,所以2049的前8 bits是DO的讀值,也就是0000 0000(DO0在最右,DO7在最左);AO0同樣使用了Modbus位址2049,位址是由0x08開始之後的16 bits,但在Modbus協定中,Function Code 0x03每個Register的資料長度為一個Word(16 bits),因此2049只能放下AO0的前8 bits,多出來的8 bits就被安排在2050的前8bits,所以AO0的讀值是0000 1001 0101 1111,換算成10進位為2399;AO1使用了Modbus位址2050,由0x08開始之後的16 bits,同樣AO1最後8bits的數值也因為資料空間不足被安排在2051的前8bits,所以AO1的讀值是0000 1101 1011 1100,換算成10進位為3516。
這樣的狀況可能會造成SCADA或其他程式在讀取數值時,顯示出錯誤的數值;所以在安排模組的時候,可以將資料長度16 bits的模組安排在前面,或者將非16 bits的模組,依照各自的資料長度補滿至16 bits的倍數後,再安排16 bits的模組。
在Modbus位址的排序上,因為模組式I/O無法預測使用者會使用多少模組,所以Modbus位址會依照使用者使用的模組的數量與通道數而改變;原則上Modbus位址的排序都會有固定的邏輯,例如銜接上一塊模組的位址繼續往下排,或者每塊模組固定占用多少個Modbus位址等方式。
Environment
可能因為ioLogik 4000系列是早期的I/O設備,並沒有針對這部分的設定做一些user-friendly調整,導致某些模組的組合,會造成Modbus位址讀取到的數值與I/O數值不相符的問題,須要透過特別的計算方式,或者改變模組的組合方式,才可以讓該Modbus位址直接讀取I/O數值;測試中以ioLogik NA-4020為例,並依序銜接下列四塊模組:- M-2801,8 DOs,24 VDC,0.5 A,source type
- M-1801,8 DIs,24 VDC,source type
- M-3411(已停產,今以M-3810取代),4 AIs,0 to 10V,14-bit
- M-4210(已停產,今以M-4410取代),2 AOs,0 to 10 V,12-bit
Test
透過ioAdmin Configuration Utility連線NA-4020後,確認正確抓取到四塊模組的資訊,並且以Export System Configuration匯出設定檔,將設定檔開啟後可在檔案的最後方看到所有模組的Modbus位址,其中會發現第一片DO模組與第四片AO模組第一個通道都使用了0x0800的Modbus位址,但DI與AI模組卻沒有相似的狀況產生。同時也測試AO輸出的最大RAW值為4095,二進位為1111 1111 1111,使用12 bits,與手冊上說明的相同,而上圖的設定檔中,AO的I/O Data Length是16(0x10) bits,所以實際上AO每個通道所佔用的位址應該要以16 bits計算;綜合上述的資訊來解讀設定檔的內容,DO使用了Modbus位址0x0800的0x00到0x07共8 bits,代表了DO0到DO7,AO0使用了Modbus位址0x0800的0x08之後的16 bits,AO1使用了Modbus位址0x0801的0x08之後的16 bits。
理解設定檔的內容後,接著便是觀察實際透過Modbus讀取時的狀況,同樣利用ioAdmin Configuration Utility對AO兩個通道產生不同的輸出測試的電壓,方便觀察時辨識;AO0為5.86VDC,RAW值為2399,AO1為8.58VDC,RAW值為3516。
Result
設定完成後改以ModScan讀取NA-4020的數值,Modbus位址為2049(0x0800轉換為10進位為2048,又ioLogik位址編號由0開始,ModScan由1開始,所以偏移1個位址由2049開始讀取),以二進位顯示得到下圖的結果。根據設定檔中得到的資訊,DO使用了Modbus位址2049的0x00到0x07共8 bits,所以2049的前8 bits是DO的讀值,也就是0000 0000(DO0在最右,DO7在最左);AO0同樣使用了Modbus位址2049,位址是由0x08開始之後的16 bits,但在Modbus協定中,Function Code 0x03每個Register的資料長度為一個Word(16 bits),因此2049只能放下AO0的前8 bits,多出來的8 bits就被安排在2050的前8bits,所以AO0的讀值是0000 1001 0101 1111,換算成10進位為2399;AO1使用了Modbus位址2050,由0x08開始之後的16 bits,同樣AO1最後8bits的數值也因為資料空間不足被安排在2051的前8bits,所以AO1的讀值是0000 1101 1011 1100,換算成10進位為3516。
這樣的狀況可能會造成SCADA或其他程式在讀取數值時,顯示出錯誤的數值;所以在安排模組的時候,可以將資料長度16 bits的模組安排在前面,或者將非16 bits的模組,依照各自的資料長度補滿至16 bits的倍數後,再安排16 bits的模組。
留言
張貼留言