如何用VB實現Modbus序列通訊

2021-04-13 08:53:15 字數 3922 閱讀 6074

如何用

vb實現

modbus

序列通訊

在一些應用中可能需要使用諸如

vb來進行上位機監控程式的開發,而

modbus

協議是這類應用中首選的通訊協議;

modbus

協議以其簡單易用,在工業領域裡已廣泛的為其他第三方裝置所支援。這裡對vb和

twido plc

間的通訊進行說明。

對於大部分應用,

twido plc

作為從站,它不需要編制通訊程式,只要把通訊口的引數設定好即可,例如下圖表示此

twido

通過程式設計口和上位機連線,其站號位址為

2;波特率、資料位、校驗、停止位和上位機設定保持一致。

vb程式通過利用

mscomm

控制項很容易就能夠實現。1.

通訊口初始化:

[複製到剪貼簿]

code:

mscomm1.settings = "9600,n,8,1"

mscomm1.commport = 1

mscomm1.sthreshold = 0

if not mscomm1.portopen then mscomm1.portopen = true 2

.crc

校驗碼的計算方法,如以下函式,可以得到位元組陣列變數

cmdstring

指向的字串的

crc校驗碼。

[複製到剪貼簿]

code:

function crc16_1(byref cmdstring() as byte, byval j as integer)

dim data as integer

dim i as integer

addressreg_crc = &hffff

for i = 0 to j

addressreg_crc = addressreg_crc xor cmdstring(i)

for j = 0 to 7

data = addressreg_crc and &h1

if data then

addressreg_crc = int(addressreg_crc / 2)

addressreg_crc = addressreg_crc and &h7fff

addressreg_crc = addressreg_crc xor &ha001

else

addressreg_crc = addressreg_crc / 2

addressreg_crc = addressreg_crc and &h7fff

end if

next j

next i

if addressreg_crc < 0 then

addressreg_crc = addressreg_crc - &hffff0000

end if

hibyte = addressreg_crc and &hff

lobyte = (addressreg_crc and &hff00) / &h100

end function 3

.讀多個字的命令(本例是從

2號站讀

%mw10

起始的4

個字):

[複製到剪貼簿]

code:

dim sendstr(7) as byte

dim rcvstr() as byte

sendstr(0) = 2 ,

從站號是

2sendstr(1) = &h3 ,

讀多個字的命令**

sendstr(2) = 0 ,

起始位址高位元組

sendstr(3) = 10,

起始位址低位元組

sendstr(4) = &h0,

資料長度高位元組

sendstr(5) = 4 ,

資料長度低位元組

call crc16(sendstr(), 5) ,crc

計算sendstr(6) = hibyte

sendstr(7) = lobyte

,讀命令傳送後

,當接收

5 + sendstr(5) * 2

個位元組時產生中斷

cmdlenth = 5 + sendstr(5) * 2

mscomm1.rthreshold = cmdlenth

mscomm1.output = sendstr ,

傳送命令 4

.寫多個字的命令(本例是寫2號站

%mw20

起始的3

個字):

[複製到剪貼簿]

code:

dim writestr() as byte

k = 6 ,寫6

個位元組redim writestr(8 + k)

writestr(0) = 2 ,

從站號是

2writestr(1) = &h10 ,

寫多個字的命令**

writestr(2) = 0 ,

起始位址高位元組

writestr(3) = 20 ,

起始位址低位元組

writestr(4) = &h0 ,

資料長度高位元組

<

字的個數

>

writestr(5) = k / 2 ,

資料長度低位元組

<

字的個數

>

writestr(6) = k ,

資料長度

<

位元組的個數

>

writestr(7) = &h12,

寫的第1

個字的高位元組

writestr(8) = &h34,

寫的第1

個字的低位元組

writestr(9) = &h56,

寫的第2

個字的高位元組

writestr(10) = &h78,

寫的第2

個字的低位元組

writestr(11) = &h9a,

寫的第3

個字的高位元組

writestr(12) = &hbc,

寫的第3

個字的低位元組

call crc16(writestr(), 6 + k)

writestr(9 + (k / 2 - 1) * 2) = hibyte

writestr(10 + (k / 2 - 1) * 2) = lobyte

mscomm1.inbuffercount = 0

mscomm1.output = writestr

,寫命令傳送後

,當接收到

8個位元組時中斷

cmdlenth = 8

mscomm1.rthreshold = cmdlenth 5

.通訊事件中斷產生時的資料處理:

[複製到剪貼簿]

code:

private sub mscomm1_oncomm()

dim inx() as byte

select case mscomm1.commevent

case comevreceive ,

判斷為接收事件

mscomm1.inputlen = cmdlenth ,

接收資料的長度

inx = mscomm1.input ,

接收資料

mscomm1.inbuffercount = 0

for k = 3 to cmdlenth - 3

tmpstr = tmpstr & "/" & hex(inx(k))

next

text1.text = tmpstr ,

以十六進製制顯示所接收長度的資料

beep

end select

end sub

如何用VB程式設計實現關閉WINDOWS視窗?

如何用vb程式設計實現 關閉當前視窗的功能啊?那位高手知道的幫幫忙啊?我說的是 關閉當前的windows視窗 比如說我剛剛開啟了乙個名為abc 的 資料夾 視窗 我現在想通過 用vb程式設計來實現關閉該視窗的功能?請問該如何編寫 怎麼讓他實現啊?不的結束vb程式哦 1.首行看windows視窗的標題...

如何用VB在窗體中實現閃爍文字

閃爍的文字可以在螢幕上起到明顯的提示作用。通過使用 vb資料庫程式設計 的timer控制項,程式設計師可以輕鬆的在窗體上實現閃爍文字的效果。本文將演示如何為label控制項加上閃爍效果,這種方法同樣適用於其它多種控制項。當你在窗體上加入timer控制項時,它只出現在設計時,而不會在執行時出現可見的控...

如何用VB製作半透明窗體?

函式setlayeredwindowattributes 使用這個函式,可以輕鬆的實現半透明窗體。按照微軟的要求,透明窗體窗體在建立時應使用ws ex layered引數 用createwindowex 或者在建立後設定該引數 用setwindowlong 我選用後者。全部函式 常量宣告如下 pri...