vb的modbus源碼
1. 如何用VB實現和s7-200的Modbus串列通訊
那麼,在講解通訊之前,大家先了解一個問題!就是PC怎麼樣得到PLC的密碼的,大家看下面的順序:
1.PC設置好與PLC的通訊格式.
2.連接好電纜線(其實我可以不說這步的,呵呵)
3.PC發送一串讀取密碼指令給PLC
4.PLC得到指令後返回一串16進制數據
5.PC通過程序解碼,放PLC返回的16進制數據轉換成字元,也就是密碼
下面大家請看,PC發送到PLC的指令:
「STX0800808ETX6B」
將其分解,就是STX+0+3+….+ETX+6+B
那麼問題就出來了,這個字元呀,PLC不認識的,PC要把這字元轉換成十六進制的PLC才認賬的!好吧,我們來轉換吧,查ASC碼表可得,
十進制----十六 進制----八進制
STX 02 02 自已查表,
那麼,加起來,PC發送給PLC的指令就是
「0230383030383038033642」
由於我程序里用的是八進制,所以我的PC發送指令如下」
MSComm1.Output = Chr(&O2) + Chr(&O60) + Chr(&O70) + Chr(&O60) + Chr(&O60) + Chr(&O70) + Chr(&O60) + Chr(&O70) + Chr(&O3) + Chr(&O66) + Chr(&O102)
Chr(&O2)
Chr:轉換為字元串指令
&02:將八進制的02轉換成十六進制查表就可以明白了好了,這是PC發送給PLC的指令,那PLC得到指令後,會返回什麼呢, STX4236353433323130ETX41---------PLC返回數據
仔細解釋一下,PLC密碼為六位,所以返回數據中,我們只對中間的那數據感興趣就行了,也就是」4236353433323130」
PLC返回的十六進制的數據,所以要將此串數據進行解碼轉換,二位一轉,查下ASC碼表就可以知道了,42是」B」,36是」6」,所以密碼為: B6543210
那麼PC程序里的代碼如下:
a = MSComm1.Input '將接收到的數據存入a中
b = Mid(a, 2, 16) '從第二位開始讀取,因為第一位為PLC發送的數據頭
For i = 1 To 15 Step 2 '將接收到的數據每二位讀取
c = Chr(CLng("&H" & (Mid(b, i, 2)))) '轉換為字元
Text1.Text = Text1.Text + c
Next i
呵呵,程序就是如此啦
2. 如何用VB不經過資料庫獲取Modbus協議輸出值
modbus命令碼03 是讀多個寄存器的值,數據1234567不符合幀格式的要求,因為若1234(前4位)是地址,則數據長度567超出了最大值(125)。
例子:設備地址 01,命令03,讀起始地址為30006的10個寄存器的數值,modbus-rtu幀格式為:
01 03 00 06 00 0A CRC
其中,CRC需要計算,並佔2個位元組。
Visual Basic是一種由微軟公司開發的包含協助開發環境的事件驅動編程語言。從任何標准來說,VB都是世界上使用人數最多的語言——不僅是盛贊VB的開發者還有抱怨VB的開發者。它源自於BASIC編程語言。VB擁有圖形用戶界面(GUI)和快速應用程序開發(RAD)系統,可以輕易的使用DAO、RDO、ADO連接資料庫,或者輕松的創建ActiveX控制項。程序員可以輕松的使用VB提供的組件快速建立一個應用程序。
3. PC 如何跟儀表通訊呢 通過RS485 通訊協議modbus rtu VB6.0原代碼怎麼寫呢
需將485信號轉換為232信號到PC機串口上。(即232介面) 。然後在儀表上設置好相關通訊參數。(如地址,波特率等)在根據modbus協議的內容寫發送命令。標準的modbus 協議有固定格式其具體寄存器內容,需根據該儀表協議來定義。
4. 請問誰有VB編寫modbus的應用例子,要詳細些的,最近在學,很迷惑啊!
其實也很簡單的,搞清楚功能碼的作用,以及指令格式,和CRC校驗就差不多了,如00 06 00 00 01 00 89 8B,00是從機地址,06是功能碼的寫,00 00 01 00是要發送的數據,89 8B是CRC校驗碼
Private Sub Command1_Click()
Dim CRC As String
Dim d() As Byte '待傳輸數據
Dim sendstr As String
Dim str As String
Dim N As Integer
Dim GetStr As String
Dim ErrMsg As String
Dim Status As Integer
'01 06 00 01 10 00
sendstr = Trim(Text1.Text)
strT = Split(sendstr, " ")
N = UBound(strT)
ReDim d(N)
For i = 0 To N
S = "&H" & strT(i)
d(i) = S
Next
' d(0) = &H1
' d(1) = &H6
' d(2) = &H0
' d(3) = &H0
' d(4) = &H10
' d(5) = &H0
CRC = CRC16(d) '調用CRC16計算函數
'CRC(0)為高位
'CRC(1)為低位
str = Text1.Text & " " & CRC
Text1.Text = str
Status = LynxSPcomm(MSComm1, str, True, GetStr, ErrMsg, True, 0)
Text2.Text = GetStr
End Sub
'注意:在數據傳輸時CRC的低位可能在前,而高位在後。
Function CRC16(data() As Byte) As String
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
Dim CL As Byte, CH As Byte '多項式碼&HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = &H1
CH = &HA0
For i = 0 To UBound(data)
CRC16Lo = CRC16Lo Xor data(i) '每一個數據與CRC寄存器進行異或
For Flag = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果高位位元組最後一位為1
CRC16Lo = CRC16Lo Or &H80 '則低位位元組右移後前面補1
End If '否則自動補0
If ((SaveLo And &H1) = &H1) Then '如果LSB為1,則與多項式碼進行異或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next Flag
Next i
Dim ReturnData(1) As Byte
ReturnData(0) = CRC16Hi 'CRC高位
ReturnData(1) = CRC16Lo 'CRC低位
CRC16 = Hex(CRC16Lo) & " " & Hex(CRC16Hi)
End Function
5. VB 與PLC通信
VB有控制項可以實現的,不太清楚你用的是何種PLC,也不知道協議,只能說給你些參考
可參考:
1、基於ModbusRTU協議的溫度採集模塊與西門子PLC
SP7-200的連接
http://www.yotons.com/solution4.html
2、VB
MODBUS實現源碼
http://wenku..com/view/d2c8722acfc789eb172dc8cc.html
6. vb6.0 怎麼編寫modbus tcp 程序
你的意思是不是,讓vb走網路?
tcp是一個協議,根據協議的要求,你自己寫代碼是完全可以的,不過這個你可能寫不了,太龐大了,工作量技術含量都不小。
vb提供了2個控制項訪問網路。WinSock 控制項、INET控制項
具體這2個控制項怎麼用,就需要你自己學習了。根據你的需求,你看看用哪個合適。
如果有詳細的、具體的需要,可以給我網路私信。
7. VB 與PLC 通信
VB有控制項可以實現的,不太清楚你用的是何種PLC,也不知道協議,只能說給你些參考
可參考:
1、基於ModbusRTU協議的溫度採集模塊與西門子PLC SP7-200的連接 http://www.yotons.com/solution4.html
2、ModbusRTU組網輔助控制項ytmc.ocx http://www.yotons.com/service.html
3、VB MODBUS實現源碼 http://wenku..com/view/d2c8722acfc789eb172dc8cc.html
8. VB用Modbus RTU協議和儀表通訊的問題
這兩個問題應該是同一個原因,Integer類型不夠大。
在VB6里,Integer是有符號的,其取值范圍是 -32767 到 32676。
試試看用 Long 取代 Integer 吧,應該能行。
再說說ModBus,讀取指令 02 03 14 50 00 01 指定了讀取一個單位(16位)的數據。
如果數據超過了65536,一個16位就顯示不過來了,試試讀取兩個字的數據吧。
當然,也有部分設備使用某個特定數組來表示溢出,查查說明書應該會有收獲。
發送問題也是類似的,如果該地址數據是有符號的,那麼上限就是32767。
試試寫兩個字(32位)的數據。
9. 如何用VB實現Modbus串列通訊
Modbus只是一種協議,首先實現類似串口助手的功能,再根據Modbus協議構造數據幀進行收發即可,可以使用一些測試軟體輔助設計,例如格西烽火通信軟體等,可以自定義協議,有Modbus的測試。
10. 求vb寫的modbus rtu測試程序源碼
用VB編寫的MODBUS_RTU通訊協議源程序_圖文_網路文庫
VB編寫的Modbus RTU協議通訊源程序-系統集成代碼類資源-CSDN下載