Modbus Rtu通信控件
0赞
发表于 7/24/2010 10:58:13 PM
阅读(3021)
虽然Modbus是公开协议,但是要想做出稳定的通信控件,还是要下一番功夫的。该控件经过多年现场运用,功能完善可靠,可操作的变量类型有I、Q、AI、V。非注册版本仅能操作变量区前10个,注册版本无个数限制,并且注册一份,不限用户个数,可以任意发布使用(仅授权的公司的用户使用,否则追究相应的责任)。
提供有详细的示例程序,很容易掌握使用。
同类产品还有S7_PPI.ocx,S7_CP243.ocx,S7_MPI.ocx等控件【属性】
bps 波特率
DataBit 数据位
StopBit 停止位
CheckOut 校验方式
FixAddr PLC地址
DataBit 数据位
StopBit 停止位
CheckOut 校验方式
FixAddr PLC地址
【方法】
OpenPort 打开串口
ClosePort 关闭串口
ReadData 读PLC数据
WriteData 写PLC数据
InitRegCompany 初始化注册公司名称
ClosePort 关闭串口
ReadData 读PLC数据
WriteData 写PLC数据
InitRegCompany 初始化注册公司名称
【事件】
ErrorMessge 操作状态信息
示例程序界面:


示例程序代码:
'*************************************************************************
'**模 块 名:frmTest
'**说 明:YFsoft 版权所有2005 - 2006(C)
'**创 建 人:叶帆
'**日 期:2005-08-23 14:45:36
'**修 改 人:
'**日 期:
'**描 述:MbClient 控件示例
'**版 本:V1.0.0
'*************************************************************************
'**模 块 名:frmTest
'**说 明:YFsoft 版权所有2005 - 2006(C)
'**创 建 人:叶帆
'**日 期:2005-08-23 14:45:36
'**修 改 人:
'**日 期:
'**描 述:MbClient 控件示例
'**版 本:V1.0.0
'*************************************************************************
'*************************************************************************
'**函 数 名:chkRun_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-28 11:11:25
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub chkRun_Click()
tmrRead.Enabled = IIf(chkRun.Value = 0, False, True)
End Sub
'**函 数 名:chkRun_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-28 11:11:25
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub chkRun_Click()
tmrRead.Enabled = IIf(chkRun.Value = 0, False, True)
End Sub
'*************************************************************************
'**函 数 名:cmbType_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-29 11:42:33
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmbType_Click()
If cmbType.ListIndex < 2 Then
cmbLen.ListIndex = 0
Else
cmbLen.ListIndex = 1
End If
End Sub
'**函 数 名:cmbType_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-29 11:42:33
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmbType_Click()
If cmbType.ListIndex < 2 Then
cmbLen.ListIndex = 0
Else
cmbLen.ListIndex = 1
End If
End Sub
'*************************************************************************
'**函 数 名:cmdAbout_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-11-19 23:48:27
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdAbout_Click()
ModbusRtu1.About
End Sub
'**函 数 名:cmdAbout_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-11-19 23:48:27
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdAbout_Click()
ModbusRtu1.About
End Sub
'*************************************************************************
'**函 数 名:cmdClose_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-11-19 23:48:12
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdClose_Click()
Unload Me
End Sub
'**函 数 名:cmdClose_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-11-19 23:48:12
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdClose_Click()
Unload Me
End Sub
'*************************************************************************
'**函 数 名:cmdLogin_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-07-26 20:39:33
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdLogin_Click()
Dim lngData() As Long
Dim lngRet As Long
ModbusRtu1.FixAddr = cmbNo.ListIndex + 1
lngRet = ModbusRtu1.ReadData(Val(txtAddr), lngData(), , , Modbus_V)
If lngRet = 0 Then
picFlag.BackColor = RGB(0, 255, 0)
Else
picFlag.BackColor = RGB(255, 0, 0)
End If
End Sub
'*************************************************************************
'**函 数 名:cmdSendData_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-27 23:59:32
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdReadData_Click()
On Error GoTo ToExit '打开错误陷阱
'------------------------------------------------
Dim i As Long
Dim bytType As Byte
Dim lngData() As Long
'**函 数 名:cmdLogin_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-07-26 20:39:33
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdLogin_Click()
Dim lngData() As Long
Dim lngRet As Long
ModbusRtu1.FixAddr = cmbNo.ListIndex + 1
lngRet = ModbusRtu1.ReadData(Val(txtAddr), lngData(), , , Modbus_V)
If lngRet = 0 Then
picFlag.BackColor = RGB(0, 255, 0)
Else
picFlag.BackColor = RGB(255, 0, 0)
End If
End Sub
'*************************************************************************
'**函 数 名:cmdSendData_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-27 23:59:32
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdReadData_Click()
On Error GoTo ToExit '打开错误陷阱
'------------------------------------------------
Dim i As Long
Dim bytType As Byte
Dim lngData() As Long
Select Case cmbType.ListIndex
Case 0: bytType = Modbus_I
Case 1: bytType = Modbus_Q
Case 2: bytType = Modbus_AI
Case 3: bytType = Modbus_V
End Select
ModbusRtu1.FixAddr = cmbNo.ListIndex + 1
If ModbusRtu1.ReadData(Val(txtAddr), lngData(), Val(cmbNum.Text), Val(cmbLen.ListIndex), Val(bytType)) = 0 Then
txtData = ""
For i = 1 To Val(cmbNum.Text)
txtData = txtData & Format(lngData(i - 1), "0") & " "
Next
Else
txtData = "Error"
End If
'------------------------------------------------
Exit Sub
'----------------
ToExit:
MsgBox Err.Description
End Sub
Case 0: bytType = Modbus_I
Case 1: bytType = Modbus_Q
Case 2: bytType = Modbus_AI
Case 3: bytType = Modbus_V
End Select
ModbusRtu1.FixAddr = cmbNo.ListIndex + 1
If ModbusRtu1.ReadData(Val(txtAddr), lngData(), Val(cmbNum.Text), Val(cmbLen.ListIndex), Val(bytType)) = 0 Then
txtData = ""
For i = 1 To Val(cmbNum.Text)
txtData = txtData & Format(lngData(i - 1), "0") & " "
Next
Else
txtData = "Error"
End If
'------------------------------------------------
Exit Sub
'----------------
ToExit:
MsgBox Err.Description
End Sub
'*************************************************************************
'**函 数 名:cmdWriteData_Click
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-28 11:43:08
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub cmdWriteData_Click()
On Error GoTo ToExit '打开错误陷阱
'------------------------------------------------
Dim bytType As Byte
Dim strData() As String
Dim lngData() As Long
Dim i As Long
Select Case cmbType.ListIndex
Case 0: bytType = Modbus_I
Case 1: bytType = Modbus_Q
Case 2: bytType = Modbus_AI
Case 3: bytType = Modbus_V
End Select
Case 0: bytType = Modbus_I
Case 1: bytType = Modbus_Q
Case 2: bytType = Modbus_AI
Case 3: bytType = Modbus_V
End Select
If Len(txtData) > 0 Then
strData = Split(txtData, " ")
ReDim lngData(UBound(strData))
For i = 0 To UBound(strData)
lngData(i) = Val(strData(i))
Next
If ModbusRtu1.WriteData(Val(txtAddr), lngData, UBound(strData) + 1, Val(cmbLen.ListIndex), Val(bytType), cmbNo.ListIndex + 1) = 0 Then
'
Else
txtData = "Error"
End If
End If
'------------------------------------------------
Exit Sub
'----------------
ToExit:
MsgBox Err.Description
End Sub
strData = Split(txtData, " ")
ReDim lngData(UBound(strData))
For i = 0 To UBound(strData)
lngData(i) = Val(strData(i))
Next
If ModbusRtu1.WriteData(Val(txtAddr), lngData, UBound(strData) + 1, Val(cmbLen.ListIndex), Val(bytType), cmbNo.ListIndex + 1) = 0 Then
'
Else
txtData = "Error"
End If
End If
'------------------------------------------------
Exit Sub
'----------------
ToExit:
MsgBox Err.Description
End Sub
'*************************************************************************
'**函 数 名:Form_Load
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-28 19:07:04
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub Form_Load()
Dim i As Long
For i = 1 To 222
cmbNo.AddItem Format(i, "0")
Next
For i = 1 To 100
cmbNum.AddItem Format(i, "0")
Next
cmbNum.ListIndex = 0
cmbNo.ListIndex = 0
cmbType.ListIndex = 3
ModbusRtu1.OpenPort 1
End Sub
'**函 数 名:Form_Load
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-28 19:07:04
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub Form_Load()
Dim i As Long
For i = 1 To 222
cmbNo.AddItem Format(i, "0")
Next
For i = 1 To 100
cmbNum.AddItem Format(i, "0")
Next
cmbNum.ListIndex = 0
cmbNo.ListIndex = 0
cmbType.ListIndex = 3
ModbusRtu1.OpenPort 1
End Sub
'*************************************************************************
'**函 数 名:Form_Unload
'**输 入:Cancel(Integer) -
'**输 出:无
'**功能描述:关闭串口
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-23 14:40:05
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub Form_Unload(Cancel As Integer)
ModbusRtu1.ClosePort
End
End Sub
'**函 数 名:Form_Unload
'**输 入:Cancel(Integer) -
'**输 出:无
'**功能描述:关闭串口
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-23 14:40:05
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub Form_Unload(Cancel As Integer)
ModbusRtu1.ClosePort
End
End Sub
'*************************************************************************
'**函 数 名:tmrRead_Timer
'**输 入:无
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2005-08-28 11:10:58
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub tmrRead_Timer()
cmdReadData_Click
End Sub
