Example_vb.frm
上传用户:wuxg88
上传日期:2022-05-28
资源大小:814k
文件大小:15k
源码类别:

通讯编程

开发平台:

C++ Builder

  1. VERSION 5.00
  2. Begin VB.Form Form1 
  3.    Caption         =   "Example"
  4.    ClientHeight    =   5865
  5.    ClientLeft      =   60
  6.    ClientTop       =   450
  7.    ClientWidth     =   7050
  8.    LinkTopic       =   "Form1"
  9.    ScaleHeight     =   5865
  10.    ScaleWidth      =   7050
  11.    StartUpPosition =   3  'Windows Default
  12.    Begin VB.CommandButton Command2 
  13.       Caption         =   "Cancel"
  14.       Height          =   375
  15.       Left            =   5640
  16.       TabIndex        =   11
  17.       Top             =   840
  18.       Width           =   1215
  19.    End
  20.    Begin VB.CommandButton Command1 
  21.       Caption         =   "Send"
  22.       Height          =   375
  23.       Left            =   5640
  24.       TabIndex        =   10
  25.       Top             =   360
  26.       Width           =   1215
  27.    End
  28.    Begin VB.Frame Frame1 
  29.       Caption         =   "Modbus Function Test"
  30.       Height          =   5655
  31.       Left            =   120
  32.       TabIndex        =   12
  33.       Top             =   120
  34.       Width           =   5175
  35.       Begin VB.Frame Frame3 
  36.          Caption         =   "Modbus Response"
  37.          Height          =   1695
  38.          Left            =   120
  39.          TabIndex        =   21
  40.          Top             =   3840
  41.          Width           =   4935
  42.          Begin VB.TextBox data_r 
  43.             Height          =   495
  44.             Left            =   2040
  45.             Locked          =   -1  'True
  46.             TabIndex        =   0
  47.             TabStop         =   0   'False
  48.             Top             =   1080
  49.             Width           =   2655
  50.          End
  51.          Begin VB.TextBox add_r 
  52.             Height          =   285
  53.             Left            =   2040
  54.             Locked          =   -1  'True
  55.             TabIndex        =   2
  56.             TabStop         =   0   'False
  57.             Top             =   360
  58.             Width           =   1335
  59.          End
  60.          Begin VB.TextBox func_r 
  61.             Height          =   285
  62.             Left            =   2040
  63.             Locked          =   -1  'True
  64.             TabIndex        =   1
  65.             TabStop         =   0   'False
  66.             Top             =   720
  67.             Width           =   1335
  68.          End
  69.          Begin VB.Label Label6 
  70.             Caption         =   "Response Data"
  71.             Height          =   255
  72.             Left            =   240
  73.             TabIndex        =   24
  74.             Top             =   1080
  75.             Width           =   1335
  76.          End
  77.          Begin VB.Label Label9 
  78.             Caption         =   "Modbus Address"
  79.             Height          =   255
  80.             Left            =   240
  81.             TabIndex        =   23
  82.             Top             =   360
  83.             Width           =   1335
  84.          End
  85.          Begin VB.Label Label10 
  86.             Caption         =   "Function Code"
  87.             Height          =   255
  88.             Left            =   240
  89.             TabIndex        =   22
  90.             Top             =   720
  91.             Width           =   1335
  92.          End
  93.       End
  94.       Begin VB.Frame Frame2 
  95.          Caption         =   "Modbus Request"
  96.          Height          =   1695
  97.          Left            =   120
  98.          TabIndex        =   17
  99.          Top             =   1920
  100.          Width           =   4935
  101.          Begin VB.TextBox data_s 
  102.             Height          =   480
  103.             Left            =   2040
  104.             TabIndex        =   9
  105.             Text            =   "0500FF00"
  106.             Top             =   1080
  107.             Width           =   2655
  108.          End
  109.          Begin VB.TextBox func_s 
  110.             Height          =   270
  111.             Left            =   2040
  112.             MaxLength       =   4
  113.             TabIndex        =   8
  114.             Text            =   "5"
  115.             Top             =   720
  116.             Width           =   1335
  117.          End
  118.          Begin VB.TextBox add_s 
  119.             Height          =   270
  120.             Left            =   2040
  121.             MaxLength       =   4
  122.             TabIndex        =   7
  123.             Text            =   "1"
  124.             Top             =   360
  125.             Width           =   1335
  126.          End
  127.          Begin VB.Label Label4 
  128.             Caption         =   "Modbus Data"
  129.             Height          =   255
  130.             Left            =   240
  131.             TabIndex        =   20
  132.             Top             =   1080
  133.             Width           =   1335
  134.          End
  135.          Begin VB.Label Label3 
  136.             Caption         =   "Function Code"
  137.             Height          =   255
  138.             Left            =   240
  139.             TabIndex        =   19
  140.             Top             =   720
  141.             Width           =   1335
  142.          End
  143.          Begin VB.Label Label2 
  144.             Caption         =   "Modbus Address"
  145.             Height          =   255
  146.             Left            =   240
  147.             TabIndex        =   18
  148.             Top             =   360
  149.             Width           =   1335
  150.          End
  151.       End
  152.       Begin VB.ComboBox Combo3 
  153.          Height          =   315
  154.          Left            =   2160
  155.          TabIndex        =   5
  156.          Text            =   "Combo3"
  157.          Top             =   1080
  158.          Width           =   1455
  159.       End
  160.       Begin VB.TextBox ipaddr 
  161.          Height          =   270
  162.          Left            =   2160
  163.          TabIndex        =   6
  164.          Top             =   1440
  165.          Width           =   1695
  166.       End
  167.       Begin VB.ComboBox Combo2 
  168.          Height          =   315
  169.          ItemData        =   "Example_vb.frx":0000
  170.          Left            =   2160
  171.          List            =   "Example_vb.frx":000A
  172.          TabIndex        =   4
  173.          Text            =   "Combo2"
  174.          Top             =   720
  175.          Width           =   1455
  176.       End
  177.       Begin VB.ComboBox Combo1 
  178.          Height          =   315
  179.          ItemData        =   "Example_vb.frx":001A
  180.          Left            =   2160
  181.          List            =   "Example_vb.frx":0024
  182.          TabIndex        =   3
  183.          Text            =   "Combo1"
  184.          Top             =   360
  185.          Width           =   1455
  186.       End
  187.       Begin VB.Label Label7 
  188.          Caption         =   "Serial Port"
  189.          Height          =   255
  190.          Left            =   360
  191.          TabIndex        =   16
  192.          Top             =   1080
  193.          Width           =   1335
  194.       End
  195.       Begin VB.Label Label8 
  196.          Caption         =   "Modbus Mode"
  197.          Height          =   255
  198.          Left            =   360
  199.          TabIndex        =   15
  200.          Top             =   720
  201.          Width           =   1575
  202.       End
  203.       Begin VB.Label Label1 
  204.          Caption         =   "Communication Type"
  205.          Height          =   255
  206.          Left            =   360
  207.          TabIndex        =   14
  208.          Top             =   360
  209.          Width           =   1575
  210.       End
  211.       Begin VB.Label Label5 
  212.          Caption         =   "Slave IP Address"
  213.          Height          =   255
  214.          Left            =   360
  215.          TabIndex        =   13
  216.          Top             =   1440
  217.          Width           =   1335
  218.       End
  219.    End
  220. End
  221. Attribute VB_Name = "Form1"
  222. Attribute VB_GlobalNameSpace = False
  223. Attribute VB_Creatable = False
  224. Attribute VB_PredeclaredId = True
  225. Attribute VB_Exposed = False
  226. Option Explicit
  227. ' Call Windows API (For winsock use)
  228. Private Declare Function inet_addr Lib "wsock32.dll" (ByVal s As String) As Long
  229. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  230. ' Call Window API (For registry use, Find Serial Port list)
  231. Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
  232. Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
  233. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  234. Const REG_SZ = 1
  235. Const HKEY_LOCAL_MACHINE = &H80000002
  236. Const ERROR_SUCCESS = 0&
  237. Const SYNCHRONIZE = &H100000
  238. Const STANDARD_RIGHTS_READ = &H20000
  239. Const KEY_QUERY_VALUE = &H1
  240. Const KEY_CREATE_SUB_KEY = &H4
  241. Const KEY_ENUMERATE_SUB_KEYS = &H8
  242. Const KEY_NOTIFY = &H10
  243. Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
  244. Private Sub Combo1_Click()
  245. Dim idx As Integer
  246.     idx = Combo1.ListIndex
  247.         
  248.     Select Case idx
  249.     
  250.     Case Is = 0
  251.         Combo2.ListIndex = 0
  252.         Combo2.Enabled = True
  253.         Combo3.Enabled = True
  254.         ipaddr.BackColor = RGB(236, 233, 216)
  255.         ipaddr.Enabled = False
  256.       
  257.     Case Is = 1
  258.         Combo2.ListIndex = 1
  259.         Combo2.Enabled = False
  260.         Combo3.Enabled = False
  261.         ipaddr.BackColor = RGB(255, 255, 255)
  262.         ipaddr.Enabled = True
  263.         
  264.     End Select
  265.     
  266. End Sub
  267. Private Sub Command1_Click()
  268. Dim sendbuf(1024) As Byte               ' Send buffer
  269. Dim recvbuf(1024) As Byte               ' Receive buffer
  270. Dim remote_addr As Long                 ' Remote IP Address
  271. Dim slav_addr_s As Long                 ' Request Station address
  272. Dim func_code_s As Long                 ' Request function code
  273. Dim slav_addr_r As Long                 ' Receive Station address
  274. Dim func_code_r As Long                 ' Receive function code
  275. Dim rlen As Integer                     ' Receive data length
  276. Dim ConnNum As Integer                  ' Serial port number or ethernet connection number
  277. Dim i As Integer
  278. Dim parity As Byte                      ' Parity
  279. Dim parity1 As Byte                     ' Parity
  280. Dim DataLen As Integer                  ' Request data length
  281. Dim ASC(1) As Byte                      ' Used to Convert HEX value to ASCII
  282. Dim RecvString As String                ' Receive string
  283. Dim idx As Integer                      ' Communication Type
  284. Dim mode As Integer                     ' Modbus mode
  285. slav_addr_s = CInt(add_s.Text)          ' Modbus Address (Decimal)
  286. func_code_s = CInt("&H" & func_s.Text)  ' Function Code  (Hex String to Integer)
  287. Dim DataString As String
  288. DataString = data_s.Text                ' Data, ex:0500FF00
  289. Dim ComString As String
  290. ComString = Combo3.Text                 ' COM port string, ex: COM1
  291. remote_addr = inet_addr(ipaddr)         ' Get Internet IP Address
  292. For i = 0 To Len(DataString) - 1 Step 2                 ' Convert Modbus Data
  293.     sendbuf(i / 2) = "&H" + Mid(DataString, i + 1, 2)
  294. Next i
  295. ConnNum = CInt(Mid(ComString, 4, Len(ComString)))        ' Get COM port number
  296. ' Assign data
  297. idx = Combo1.ListIndex              ' Select Communication Type
  298. mode = Combo2.ListIndex             ' Modbus mode
  299. parity = AscB("E")                  ' Parity (E)
  300. parity1 = AscB("N")                 ' Parity
  301. DataLen = 4                         ' Request data length
  302.             
  303.     ' Modbus Communication Start ---------------------------------------
  304.     Select Case idx
  305.     Case Is = 0     'Modbus
  306.     
  307.         If mode = 0 Then
  308.             Call OpenModbusSerial(ConnNum, 9600, 7, parity, 1, mode + 1)  ' Open Modbus (9600, 7, E, 1, (1 for ASCII, 2 for RTU))
  309.         Else
  310.             Call OpenModbusSerial(ConnNum, 9600, 8, parity1, 1, mode + 1) ' Open Modbus (9600, 8, N, 1, (1 for ASCII, 2 for RTU))
  311.         End If
  312.         Call RequestData(idx, ConnNum, slav_addr_s, func_code_s, sendbuf(0), DataLen)   ' Request Data
  313.  
  314.         rlen = ResponseData(idx, ConnNum, slav_addr_r, func_code_r, recvbuf(0))         ' Response Data
  315.         
  316.         For i = 0 To rlen - 1
  317.             Call HEX_to_ASCI(recvbuf(i), ASC)
  318.             RecvString = RecvString & Chr(ASC(0)) & Chr(ASC(1))
  319.         Next i
  320.     
  321.         Call CloseSerial(ConnNum)                                                       ' Close Modbus
  322.         
  323.     Case Is = 1     'Modbus/TCP
  324.     
  325.         ConnNum = 0                                                                     ' Connection number
  326.         
  327.         Call OpenModbusTCPSocket(ConnNum, remote_addr)                                  ' Open Modbus TCP Socket
  328.     
  329.         Call RequestData(idx, ConnNum, slav_addr_s, func_code_s, sendbuf(0), 4)         ' Request Data
  330.     
  331.         If (ReadSelect(ConnNum, 100)) Then
  332.             rlen = ResponseData(idx, ConnNum, slav_addr_r, func_code_r, recvbuf(0))         ' Response Data
  333.         End If
  334.         
  335.         For i = 0 To rlen - 1
  336.         
  337.             Call HEX_to_ASCI(recvbuf(i), ASC)
  338.             RecvString = RecvString & Chr(ASC(0)) & Chr(ASC(1))
  339.         Next i
  340.     
  341.         Call CloseSocket(ConnNum)                                                       ' Close Modbus TCP Socket
  342.         
  343.     End Select
  344.     ' Modbus Communication End -----------------------------------------
  345. add_r = slav_addr_r                                                                     ' Assign data
  346. func_r = Hex(func_code_r)
  347. data_r.Text = RecvString
  348. ' Switch Y0 on or off
  349. If data_s.Text = "0500FF00" Then
  350.     data_s.Text = "05000000"
  351. Else
  352.     data_s.Text = "0500FF00"
  353. End If
  354. End Sub
  355. ' Convert ASCII to HEX
  356. Private Function ASCI_to_HEX(ByRef asci() As Byte, ByRef value_hex As Byte)
  357.     value_hex = &H0
  358.     
  359.     Dim i As Integer
  360.     i = 0
  361.     
  362.     For i = 0 To 2
  363.         If (asci(i) >= &H30 & asci(i) <= &H39) Then             ' 0-9
  364.             value_hex = (value_hex * 16) + (asci(i) - &H30)
  365.         ElseIf (asci(i) >= &H41 & asci(i) <= &H46) Then         ' A-F
  366.             value_hex = ((value_hex * 16) + (asci(i) - &H37))
  367.         ElseIf (asci(i) >= &H61 & asci(i) <= &H66) Then         ' a-f
  368.             value_hex = ((value_hex * 16) + (asci(i) - &H57))
  369.         End If
  370.     Next i
  371. End Function
  372. 'Convert HEX to ASCII
  373. Private Sub HEX_to_ASCI(ByVal value_hex As Byte, ByRef asci() As Byte)
  374.     Dim reglow, reghigh As Byte
  375.     
  376.     reghigh = (value_hex And &HF0) / 16   ' >> 4
  377.     reglow = value_hex And &HF
  378.     
  379.     If (reghigh <= 9) Then
  380.         asci(0) = reghigh + &H30
  381.     Else
  382.         asci(0) = (reghigh - 10) + &H41
  383.     End If
  384.     
  385.     If (reglow <= 9) Then
  386.         asci(1) = reglow + &H30
  387.     Else
  388.         asci(1) = (reglow - 10) + &H41
  389.     End If
  390. End Sub
  391. Private Sub Command2_Click()
  392.     End
  393. End Sub
  394. Private Sub Form_Load()
  395.     'Check registry serial Port list Start -----------------------------
  396.     Dim typecode As Long
  397.     Dim lngKeyHandle As Long
  398.     Dim lngResult As Long
  399.     Dim lngCurIdx As Long
  400.     Dim ValueName As String * 256
  401.     Dim ValueNameLen As Long
  402.     Dim Value As String * 256
  403.     Dim ValueLen As Long
  404.     lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWAREDEVICEMAPSERIALCOMM", 0&, KEY_READ, lngKeyHandle)
  405.     If lngResult <> ERROR_SUCCESS Then
  406.         MsgBox ("Cannot open key")
  407.         Exit Sub
  408.     End If
  409.     lngCurIdx = 0
  410.     ValueNameLen = 256
  411.     ValueLen = 256
  412.     While RegEnumValue(lngKeyHandle, lngCurIdx, ByVal ValueName, ValueNameLen, 0&, typecode, ByVal Value, ValueLen) = ERROR_SUCCESS
  413.         If typecode = REG_SZ Then
  414.             Combo3.AddItem Value
  415.         End If
  416.         
  417.         lngCurIdx = lngCurIdx + 1
  418.         ValueNameLen = 256
  419.         ValueLen = 256
  420.     Wend
  421.     Call RegCloseKey(lngKeyHandle)
  422.     'Check registry serial Port list End -------------------------------
  423.     
  424.     Combo1.ListIndex = 0
  425.     Combo2.ListIndex = 0
  426.     Combo3.ListIndex = 0
  427.     
  428.     Call Combo1_Click
  429. End Sub