2017年1月11日 星期三

支援Modbus 不代表全Modbus功能

在這現在工業4.0 的風潮下,通訊已經變成一個很重要的功能。
而在工業自動化領域,在現有的通訊方式,就屬於Modbus最為普遍了。
像PLC 通訊口,大多就都有支援,但很多都是空著浪費,在未來拿來做資料收集,可以達到不增加費用,又達到資料收集的效用了。
而Modbus的規範,其實有很多的功能(碼)。如下圖:



而現在支援的Modbus裝置,大多只支援部份的功能碼。如下:03H 讀06H 寫入一個暫存器資料10H 寫入多個暫存器資料以上三個功能碼是最多裝置支援。
在實際使用時,還是要注意各裝置的手冊說明:





2017年1月9日 星期一

HMI(人機介面)沒有的通訊協議,該怎麼使用?

HMI(人機介面)在工控(自動化業)常使用,
當成操作介面在使用。
所以HMI為了對應眾多廠牌的PLC、或設備,
通常會把各家的協議寫好,放在軟體內。
如下圖:可以選定你的控制器是什麼。

就可以輕鬆的連結控制器了。

但如果HMI廠商沒有寫的協議該怎麼辨呢?

所以今天就是要來教各位,並解開通訊協議的問題。
1.首先我們選定台達DVP PLC的協議,並抓出通訊碼來分析。
1.1控制器機型,先選DVP PLC,通訊PORT選RS485(圖中沒擷取到)


1.2 選一個數值顯示,並讀取D1


1.3電腦透過USB轉RS485,來接到HMI的RS485,並打開軟體來收集。
會得到以下的圖

HMI會一直送出:(因為沒有實際接PLC,所以HMI會重覆發送)
3A 30 31 30 33 31 30 30 31 30 30 30 31 45 41 0D 0A
雖然跟我們之前介紹的MODBUS RTU不同,
但其實這就是MODBUS ASCII的通訊碼:


ASCII 開頭碼=03
結束字元=0D 0A
16進制 與ASCII碼對應表:

所以
3A 30 31 30 33 31 30 30 31 30 30 30 31 45 41 0D 0A
可以解讀為:
3A      =開頭碼
30 31  =站號=01
30 33  =功能碼=03
31 30 30 31=位址=1001
30 30 30 31=資料量=0001
45 41    = LRC檢查碼  <<這不是RTU的CRC!!
0D 0A  =結束碼

接下來,來看PLC的手冊 MODBUS位址1001是什麼,

我們查到手冊1001裝置通訊位址就是D1,
跟我們HMI設定該數值要顯示的D1是一致的。
=====================================
2.利MODBUS來複制讀取 PLC D1的數值
HMI通訊設定為ASCII Hex Address(Mater)  <<因為剛剛是讀到ASCII值

設定一個讀取數值的位址=1001,
然後再透過USB轉RS485,來讀取HMI發送的值,
會發現,跟剛剛選擇DVP PLC發送的值是一樣的。

===================
3.差別
當HMI選擇DVP PLC  跟 ASCII Hex Address(Mater)的差別在那裡?

DVP PLC,可以很直覺得選擇要讀取D值
ASCII Hex Address(Mater) 需要自已去查手冊,才知道D1是位址1001,然後再填入。

所以協議,就是方便的讓使用者可以直覺的操作,不必再去麻煩的查表。
如果PLC 有 X Y Z,就直覺使用,而不是填入難記的位址。

註:當然不是所有的PLC都是MODBUS!也有其他通訊格式。

4.如果HMI協議內沒有寫,我要通訊的設備怎麼辨?
就自已查手冊,看是否有支援MODBUS...等通訊格式,再查通訊位址,
還是可以使用的,只是比較麻煩。

當然也可以回覆給HMI原廠,將手冊、通訊資料給HMI原廠,
他們也可以寫好一個協議,讓你載入在軟體內,就可以直接使用了。

2017年1月8日 星期日

HMI(人機介面)透過RS232(MODBUS)連結arduino


主要利用上一次arduino的程式,
再加上HMI來做讀、寫的動作,
透過RS232(MODBUS),
其中要注意的就是RS232的電壓準位不同。
arduino的RS232是TTL±5V
而HMI是±10V。
PLC常用也是±10V。

要特別注意,一般的USB轉RS232,有可能也是5V,
如果拿來連PLC就會相當的不穩定。