找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6417|回复: 8
收起左侧

Modbus_RTU_VB源码

[复制链接]
ID:424917 发表于 2018-11-12 11:29 | 显示全部楼层 |阅读模式
Modbus_RTU_VB源码
0.png

参数值:
0.png

进程说明:
/******20061026
实现故障监控,errorflag=1_故障
/******20061026


/******20061102
完成提示,优化界面
/******20061102

/******20061111-12
优化串行发送接收
/******20061111-12

/******20061114
优化串行发送接收,字符间隔精确,T1.5=4ms
/******20061114

/******20061114
监视两台,监视地址固定。读参数地址可变
/******20061114


/******20061114
监视两台,监视地址固定。读参数地址可变
/******20061114


/******20061117
发现功能码03、06返回参数处理出错
例如:收回十六进制0708处理成十进制为120
十六进制0708 →→78→→十进制120
修正后:
十六进制0708 →→708→→十进制1800
/******200611117

vb源程序如下:
  1. Private Function Hexsent(ByVal smf_code As String, ByVal sdata_saddr As String, ByVal sdata_num As String, ByVal intGetDataLen As Integer, ByVal intdisnum As Integer, ByVal Hexsent_String As String) As Integer
  2.     Dim hexchrlen%, Hexchr As String, hexcyc%, hexmid As Byte
  3.     Dim hexchrgroup() As Byte, hexchrgrouprgt() As Byte
  4.     Dim j%
  5.     Dim dfMinus, dfFreq, dfTim As Double
  6.    
  7.     Dim msn1, msn2 As String
  8. '接收的数据
  9.     Dim bytReceiveArray() As Byte
  10.    
  11. '接收的变体数据
  12.     Dim VarReceiveData As String
  13.     Dim b As Variant
  14.     Dim i As Long, ii As Long, num_flag0&, num_flag1&, m As Long
  15.     On Error Resume Next
  16.    
  17.    
  18.     hexchrlen = Len(Hexsent_String)
  19.    
  20. '检查参数值是否合适
  21.     For hexcyc = 1 To hexchrlen
  22.         Hexchr = Mid(Hexsent_String, hexcyc, 1)
  23.         If InStr("0123456789ABCDEFabcdef", Hexchr) = 0 Then
  24.             MsgBox "无效的数值,请重新输入", , "错误信息"
  25.             Exit Function
  26.         End If
  27.     Next
  28.    
  29. '将参数值分成两个、两个
  30.     ReDim hexchrgroup(1 To hexchrlen \ 2) As Byte
  31.     For hexcyc = 1 To hexchrlen Step 2
  32.         i = i + 1
  33.         Hexchr = Mid(Hexsent_String, hexcyc, 2)
  34.         hexmid = Val("&H" & CStr(Hexchr))
  35.         hexchrgroup(i) = hexmid
  36.     Next
  37.                
  38. ''主站开始的空闲时间T3.5''主站开始的空闲时间T3.5''主站开始的空闲时间T3.5'主站开始的空闲时间T3.5
  39.     If FstHexSent = 1 Then
  40.         FstHexSent = 0
  41.         Call timedelays(T3_5)
  42.         idle = 1
  43.     ElseIf idle = 0 Then
  44.     Do
  45.     If GetQueueStatus(QS_ALLINPUT) Then DoEvents     '如果正在发送或接收数据则等待到发送或接收完成
  46.     Loop Until idle = 1
  47.     End If

  48. '查询一个从机
  49.      If Mid(Hexsent_String, 1, 2) > 0 And idle = 1 Then
  50.         idle = 0
  51.         retry_num = 3
  52.         replytimeoutflag = 0
  53.         MSComm1.InBufferCount = 0
  54.         hexchrgrouprgt = hexchrgroup
  55.         MSComm1.Output = hexchrgrouprgt
  56.    
  57.         
  58. '是否发送完毕
  59.         Do Until MSComm1.OutBufferCount = 0
  60.             If GetQueueStatus(QS_ALLINPUT) Then DoEvents
  61.         Loop
  62.         Call timedelays(T3_5)
  63.         QueryPerformanceCounter overreptim
  64.         idle = 1
  65. Wait_reply:
  66.         Do
  67.             If MSComm1.InBufferCount And idle = 1 Then
  68.                 idle = 0
  69.                 VarReceiveData = MSComm1.Input
  70.                 bytReceiveArray = VarReceiveData
  71.                 If Mid(Hexsent_String, 1, 2) = Tran(Hex(Val(bytReceiveArray(0))), 16) Then            '地址校验
  72.                     Unexpection_sl = 0
  73.                     GoTo Datareceive
  74.                 Else
  75.                     idle = 1
  76.                     Unexpection_sl = 1
  77.                     GoTo Wait_reply
  78.                 End If
  79.             Else
  80.                 QueryPerformanceFrequency f
  81.                 QueryPerformanceCounter l
  82.                 dfTim = (l.lowpart - overreptim.lowpart) / f.lowpart
  83.             End If
  84.         Loop Until dfTim > 2
  85.         
  86.         replytimeoutflag = 1
  87.         GoTo processing_error
  88.         
  89. Datareceive:
  90.         VarReceiveData = VarReceiveData & MSComm1.Input
  91.         QueryPerformanceCounter k
  92.         Do
  93.             If MSComm1.InBufferCount Then
  94.                 GoTo Datareceive
  95.             Else
  96.                 QueryPerformanceCounter l
  97.                 dfTim = (l.lowpart - k.lowpart) / f.lowpart
  98.             End If
  99.         Loop Until dfTim > 0.001 '判断T1.5超时
  100.         '帧控制(CRC校验)
  101.         bytReceiveArray = VarReceiveData
  102.         msn = bytReceiveArray
  103.       
  104.         i = LenB(msn)
  105.         ii = i
  106.         msn = ""
  107.         Text6text = ""
  108.         For j = 0 To i - 1
  109.             m = Tran(Hex(Val(bytReceiveArray(j))), 16)
  110.             If m <= 16 Then
  111.                Text6text = Text6text & "0" & Hex(Val(bytReceiveArray(j))) & " "
  112.                msn = msn & "0" & Hex(Val(bytReceiveArray(j)))
  113.             Else
  114.                Text6text = Text6text & Hex(Val(bytReceiveArray(j))) & " "
  115.                msn = msn & Hex(Val(bytReceiveArray(j)))
  116.         
  117.             End If
  118.         Next j
  119.         msn1 = Right$(msn, 4)
  120.         msn2 = Mid(msn, 1, (i - 2) * 2)
  121.         msn2 = RTUcheckString(msn2)
  122.         msn2 = Mid(msn2, (i - 1) * 2 - 1, 4)
  123.         i = StrComp(msn1, msn2, 1)
  124.         If i = 0 Then
  125.             Frameok_flag = 1
  126.         Else
  127.             Frameok_flag = 0
  128.             GoTo processing_error
  129.         End If
  130.         
  131.         'T3.5超时判断
  132.         Do
  133.             QueryPerformanceCounter l
  134.             dfTim = (l.lowpart - k.lowpart) / f.lowpart
  135.         Loop Until dfTim > T3_5
  136.         
  137.         If Frameok_flag = 0 Then
  138.             GoTo processing_error
  139.         Else
  140.             GoTo process_reply
  141.         End If
  142. processing_error: ''''''''''''''''''''''''''''''''''处理到这里了|||||||||||||||||||||||||||||||||
  143.                      If RESTART = 1 Then
  144.                         '7'If replytimeoutflag = 1 Then
  145.                         '7'   Hexsent = 1
  146.                         '7'   replytimeoutflag = 0
  147.                         '7'   idle = 1
  148.                         '7'   ERR = ERR + 1
  149.                         '7'Else
  150.                            Hexsent = 0
  151.                            RESTART = 0
  152.                         '7'End If
  153.                      
  154.                      ElseIf replytimeoutflag = 1 Then
  155.                         Hexsent = 1
  156.                         replytimeoutflag = 0
  157.                         idle = 1
  158.                         ERR = ERR + 1
  159.                      ElseIf Frameok_flag = 0 Then
  160.                         Hexsent = 2
  161.                         idle = 1
  162.                         ERR = ERR + 1
  163.                      End If
  164.                      Exit Function
  165.                      
  166.                 ''''''2'''     retry_num = retry_num - 1
  167.                 ''''''2'''     If retry_num >= 0 Then
  168.                 ''''''2'''        GoTo retry
  169.                 ''''''2'''     Else
  170.                 ''''''2'''        idle = 1
  171.                 ''''''2'''        Exit Function
  172.                 ''''''2'''     End If
复制代码

所有资料51hei提供下载:
Modbus_RTU_VB源码 _Modbus_RTU_VB源码.rar (4.27 MB, 下载次数: 160)
回复

使用道具 举报

ID:224365 发表于 2019-1-15 16:36 | 显示全部楼层
需要这个资料看一看
回复

使用道具 举报

ID:82988 发表于 2019-1-16 22:35 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:89841 发表于 2019-6-24 09:06 | 显示全部楼层

谢谢楼主分享
回复

使用道具 举报

ID:57896 发表于 2019-6-27 22:31 | 显示全部楼层
楼主你好!我用VB6.0打开提示“未注册”,怎么回事?
回复

使用道具 举报

ID:89841 发表于 2019-9-30 10:17 | 显示全部楼层
谢谢学习学习
回复

使用道具 举报

ID:522147 发表于 2019-11-7 15:51 | 显示全部楼层
谢谢学习学习,共同进步
回复

使用道具 举报

ID:522147 发表于 2020-4-10 15:40 | 显示全部楼层
学习学习,共同进步
回复

使用道具 举报

ID:774313 发表于 2020-6-9 19:33 | 显示全部楼层
需要这个资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表