Modbus RTU TCP/IP及COM PORT測試程式

最近因為工作需要,自己花了點時間研究了一下關於Modbus RTU的TCP程式怎麼寫

以前最多用過終端機元件,還沒有用過winsocket找了很多範例拼拼湊湊弄了這個程式

不過很多部分還有待改進,目前已經可以正常使用了。持續更新中...

Modbus在工控環境中是很常用的一種通訊規範,這支程式的好處,就是他可以直接傳送二進制的字串

並可以自動計算CRC,對於標準或非標準的Modbus RTU協議來說,我認為非常好用。

什麼都能丟 什麼都不奇怪。

關於這個程式預先設想的使用環境如下

modbus

2013/11/14更新說明

新增COM PORT傳送方式,透過mode按鈕切換

modbustester

  modbusRTU Tester (3.6 MiB, 3,500 次下載)

(2013/7/23更新下載,感謝Smile)

'1311141140
'新增COM PORT傳送功能
'1210161501
'新增匯入匯出設定檔功能
'1210111257
'新增儲存5個設定檔功能
1112201828:
新增getString解析Modbus 03 06 10指令
改善send command時可取消傳送
1112192031:
新增點選Command Lable可直接發送指令
1112161619:
修正CRC錯誤時的顯示
增加在儲存Log時寫入日期時間
1112071419:
1.修正Slave address為0x0F時的轉換問題
1112040018:
修正網路連線逾時產生錯誤的發送
新增Log訊息紀錄
新增CRC計算功能
1112032103:
1.修正Save settings方式(以.ini儲存)
1112030018:
1.新增CRC calculate功能
2.修正winsock error錯誤時判斷時機
3.修正部分錯誤時程是當機問題
1111301350:
1.新增Save Log功能。
2.新增啟動時判斷外部Excel檔案是否存在,不存在時自動新增
3.修正部分錯誤時產生程式關閉問題
1111292210:
1.修正重複發送時的時間問題、順序以及次數
2.修正判斷Winsock錯誤訊息
3.修正部分異常輸入值產生關閉程式問題

 

30 thoughts on “Modbus RTU TCP/IP及COM PORT測試程式

  1. Hi Smile,
    我已更新載點囉,然後我將檔案包裝成安裝檔了,因為是用VB6寫的,可能有些dll有點舊,不知道在沒裝vb6的win7上跑起來會發生什麼事情,總之,您先用用看吧!

    如果不合用的話,嘿嘿!真的沒時間改,拍謝。哈哈

  2. hi Candy,
    可能還是要參考您設備的操作手冊才能知道function,
    一般控制命令都是使用寫入的function,我比較常用的是0x10
    但實際上的命令還是要看該設備支援什麼樣的function

  3. Hi wei,

    您提到掃描,意即您有很多顆相同的電表需要讀取裡面的wh?
    如果只是要測試用的話,我的「Modbus RTU TCP/IP測試程式」
    可以輪巡15個命令,當然,正確的讀取命令還是要參照你電表上的table
    例如是透過0x03命令讀取wh且wh占了2word,設備ID為0x01那讀取命令應該就是
    01 03 0100 0002 + CRC16

  4. HI Jed:

    那10進位跟16進位 互轉換也行嗎?

    如100H 轉換為 258

    那你提到可以掃ID

    但假使不知 到N台的ADDRESS的話

    可以用哪個指令掃出來

    例如:我有五台電表  各有獨立ADD

    那我可以掃出ADD 我再用ADD下去掃各個數值(KWH或KW)

  5. Hi wei,
    該程式指令只接受hex格式,另外每個產品的modbus暫存器定義都是不同的,
    而且掃描addr這樣的行為通常也是要操作設備有支援,modbus並無強制規定有這樣的功能

  6. 好的..我先研究一下這個command 的 format, 不過還有一個問題想請問,Function code 16為預置多個寄存器, 意思應該就是我可以同時設定多個寄存器的參數,對嗎?? 那我完成參數設定後(ex:溫度),最後我要讓機台 run 起來,那我還要送另外的command 嗎?? 還是Function code 16 在我設定好參數後,就等於是直接讓機台開始動作了呢?

  7. 是的0x10 function code是用於同時(一次)寫入多個暫存器,
    但須注意,使用0x10寫入時操作的暫存器位址必須要是連續的!

    一般使用modbus的設備要控制RUN或STOP都是有一個特定的暫存器做控制
    您手上的機台是否如此,這我就沒辦法回答了!

  8. 所以依據您的經驗,使用0×10 function code同時(一次)寫入多個暫存器,然後要使機台RUN或STOP就是另外一個function code 的意思嗎??

  9. 不是的,modbus的function code定義的是對暫存器操作的行為功能碼,而非等於控制機台run/stop,這是要看機台本身的定義,並非透過modbus function code就一定能控制機台run/stop.

    不知道你手上是否有關於你操作設備所提供的說明文件,內容中應該有提供該機台的操作暫存器表,而modbus就是使用不同的function code去操作這些暫存器,而操作這些暫存器要幹什麼?或者應該說,要操作那些暫存器,就是看設備所提供的文件下去操作,亦或者你能提供相關資料給參考?

    http://www.xuan.idv.tw/wordpress/?page_id=480

  10. Hi Wei,

    我不是很明白您所謂的群組模式,不過一般modbus多用於RS485居多,都呈星狀網路為多,由一個master對上很多個slave,這樣不知道是不是您所說的群組?

    我曾經使用過人機(weintek)操作modbus設備.

  11. 你說的是ID對上站號?

    如有多台MODBUS設備 那個ADD PIN(代表每台個別的ADD)

    利用人機來操控或指定哪一台MODBUS設備來下達指令?

    那版大可以分享利用人機來使用群組模式?

    星狀網路是?

  12. 我的問題是

    人機軟體上要如何撰寫群組模式的語法..XD

    我有多台DDC 但要用一台來控制某台DDC的功能....

    但我是用HONEYWELL人機跟人機軟體

  13. 每台人機的控制方式不一樣耶,例如我之前用的人機有IDE畫面可以直接設定modbus通訊,但是對於一些非制式的Portocol時,他又提供一種叫做Free protocol的協定,讓user可以透過一種它稱為巨集的東西去coding人機裡面的通訊程式,我沒用過honeywell的人機,不過我相信他的操作說明理面應該會有詳細的通訊資料.

發表迴響