如何用
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...