论文部分内容阅读
摘要:Modbus协议在电子控制器通讯上有广泛的应用,对其必要的掌握和应用是广大相关工程技术人员必备的能力,使用VB6.0进行程序开发有简单易学,开发周期短的特点,利用其MSComm控件通过串口通讯可以轻松实现与智能仪表等电子控制器的通讯。主要介绍了温控表通过Modbus-RTU协议模式进行通讯的方法,并以一款霍尼韦尔温控表为具体控制对象,VB6.0为程序开发平台,通过实例编程,介绍了串口与MSComm控件实现可变参数通讯和对温控表编程温控的过程。
关键词:Modbus协议;VB6.0; RS-485;MSComm控件
中图分类号:TP302 文献标识码:A 文章编号:1009-3044(2017)31-0095-06
Control Program Realization of Honeywell Temperature Control Meter Based on VB
GAO Zhi-Yang,YU Xin-Gang
(Jiamusi University, Teaching Experiment Equipment Management Center, Jiamusi 154007,China)
Abstract: The Modbus protocol has a wide range applications in the communication of electronic controllers, the mastering and application are the necessary capabilities of the relevant engineering and technical personnel. The feauture of VB6.0 is easy to learn and develop the programg, its MSComm control through the serial communication can easily achieve communication with intelligent instruments and other electronic controller. This paper mainly introduces the method of communication between the temperature control meter and the Modbus-RTU protocol mode, and takes a Honeywell temperature control meter as the concrete control object. VB6.0 is the program development platform, through the example programming, introducing variable parameter communication and temperature control process between the serial port and the MSComm Control.
Key words: Modbus protocol; VB6.0; RS-485; MSComm control
本文从实际应用角度介绍了利用VB6.0的串口通信控件和RS485总线通过Modbus-RTU协议,实现与霍尼韦尔温控表通讯,读取、显示现场温度与程序设定值,并对温控表目标温度进行设定的过程,编程实现了温度控制的目的。
1 Modbus-RTU协议模式简介
Modbus-RTU是Modbus协议下的一个协议传输模式。Modbus是一个工业上常用的通讯协议,通过Modbus协议,控制器相互之间、控制器经由网络和其他设备之间可以实现通信。Modbus协议已经成为一种 通用工业标准。用于控制器时,通常选择设置其中的ASCII传输模式或RTU传输模式中一种。通过Modbus协议控制器组成的网络通信通常使用主-从技术,即一设备(主设备)能初始化查询传输(查询),从设备返回消息作为回应,主从设备发送的消息报文格式都要符合Modbus协议的要求。
控制程序设计中采用了常用的Modbus-RTU协议模式,表1是协议规定其报文结构:
表1 Modbus-RTU报文结构
[地址码 功能码 数据地址码 数据区 CRC校验码 一个字节 一个字节 2字节 N个字節 2个字节 ]
其中报文中的每个字节都是2个十六进制字符组成。地址码表明标明从机的地址,每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应主机回送信息;功能码告诉从机应执行什么动作;数据地址码标明动作执行的起始寄存器或线圈地址;数据区包括需要由从机返回何种信息或执行什么动作;CRC校验码用于信息的正确性检验。
2 霍尼韦尔温控表的参数设置
温度控制程序控制对象是型号为DC1040CT的霍尼韦尔温控表,温控表内部已经固化了Modbus协议,根据温控表说明书的技术参数说明可知:表内集成有Modbus-RTU和Modbus-ASCII两种协议模式,在本温控程序设计中,设置表的参数PSL为RTU,即采用Modbus-RTU模式;设置参数BITS为E_81,即偶校验、8位数据位、1位停止位;设置表的地址参数ID.NO为1,即仪表的协议地址为1;设置波特率参数BAUD为48,即波特率为4800kps;小数点设置参数DP设为1,即1位小数点。
3 温控程序软件的设计与实现
温度控程序使用的编程软件是微软的Visual Basic 6.0,利用其中的Mscomm串口通信控件实现与温控表的通讯与温度控制。Visual Basic 6.0中的Mscomm控件主要是为RS-232通用串口设计的。现在的计算机上普遍已经不再配置RS-232串口,可以在USB串口上接一个USB转RS-232的转接口,再配置一个RS-232串口到RS-485总线的转换器,即可实现Mscomm与RS-485总线上的设备通讯。 温度控制程序通过USB串口转换到RS-232串口,再转换到RS-485总线与温控表相连接,通过温控表被配置唯一的地址码和Modbus-RTU协议完成数据通讯连接,实现控制程序对温控表的相关数据写入与读取。
3.1 温度控制软件的界面设计
运行VB6.0,新建一个命名为Honeywell控制的工程,主窗体名为:控制窗口,然后在工具箱中添加Microsoft Comm Control 6.0控件和Microsoft Windows Common Controls 6.0控件,在窗体设计界面中分别加入Frame、Label、MScomm、ComboBox、CommandButton、Timer、Slider、TextBox等控件,分别命名,并将TextBox控件Text属性都设置为空,设计界面如图1:
3.2 界面的窗体Form_load()事件程序设计
利用窗体事件Form_load(),对窗体上的各控件进行参数设置。用各ComboBox控件的AddItem属性设置各个ComboBox控件的待选参数,用各ComboBox控件的ListIndex属性设置各默认初始参数,Form_Load()过程中如下代码:
Private Sub Form_Load()
’仪表地址选择设置
AddressNo.AddItem "1", 0
AddressNo.AddItem "2", 1
AddressNo.AddItem "3", 2
AddressNo.AddItem "4", 3
AddressNo.AddItem "5", 4
AddressNo.AddItem "6", 5
’串口号设置
ComNo.AddItem "COM1", 0
ComNo.AddItem "COM2", 1
ComNo.AddItem "COM3", 2
ComNo.AddItem "COM4", 3
ComNo.AddItem "COM5", 4
’波特率设置
BaudeRate.AddItem "4800", 0
BaudeRate.AddItem "9600", 1
BaudeRate.AddItem "19200", 2
BaudeRate.AddItem "115200", 3
’校验位设置
Parity.AddItem "N", 0
Parity.AddItem "E", 1
Parity.AddItem "O", 2
’数据位设置
DataBit.AddItem "7", 0
DataBit.AddItem "8", 1
’停止位设置
StopBit.AddItem "1", 0
StopBit.AddItem "2", 1
’预置串口参数默认值
AddressNo.ListIndex = 0
ComNo.ListIndex = 0
BaudeRate.ListIndex = 1
Parity.ListIndex = 1
DataBit.ListIndex = 1
StopBit.ListIndex = 0
’初始串口未打开提示信息
Indic_Conn.Caption = " 串口未打开"
’设置Timer1为不可用
Timer1.Enabled = False
End Sub
注意,AddressNo.AddItem即设备地址参数,可以根据实际需要参照Modbus协议规定继续添加。同时,在过程中关闭了Timer1控件对象,因为本程序在Timer1_Timer事件中有数据通讯请求过程,若在串口未连接的情况下执行数据通讯请求,会出现错误,所以在Form_load()中將其关闭,待串口打开后再将其打开,执行数据通讯请求。
3.3 按钮互锁的过程设计
本控制程序中的串口连接与断开两个按钮要实现互锁,即串口成功打开后,则打开按钮状态变为无效,直到按断开按钮,使串口成功断开为止。断开按钮也是如此,断开串口后,则断开按钮状态也变为无效,要等串口成功连接后,断开按钮才有效。按钮互锁子过程放在窗体代码中,按钮互锁子过程代码如下:
Public Sub button_manage(button As Variant)
Select Case button
’参数为连接按钮
Case CMDConn
’断开按钮有效
CMDDisconn.Enabled = True
’连接按钮无效
CMDConn.Enabled = False
’参数为断开按钮
Case CMDDisconn
’连接按钮有效
CMDConn.Enabled = True
’断开按钮无效
CMDDisconn.Enabled=False
End Select
End Sub
其中,被锁定的按钮控件名作为调用过程的参数,锁定管理过程根据参数判断被锁定按钮,并打开对应的另一按钮。 3.4 打开与关闭串口的程序设计
CMDConn_Click()是串口打开事件过程,首先在过程中设置一条On Error Goto Errline语句,功能是若串口打开不成功则跳转至Errline行,进行打开错误提示,并退出串口连接过程。其后是串口各参数设置并打开串口过程。执行完打开串口指令后,继续执行提示串口打开成功指令、执行打开关闭按钮互锁过程、执行使Frame控件无效指令和打开Timer1控件指令,实现各个控件对应的功能。串口打开过程代码如下:
Private Sub CMDConn_Click()
On Error GoTo Errline
’配置、确定打开串口各项参数
MSComm1.CommPort = ComNo.ListIndex 1
MSComm1.Settings = BaudeRate.Text
"," Parity.Text "," DataBit.Text
"," StopBit.Text
MSComm1.InputMode = 1
MSComm1.InputLen = 0
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 7
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 1024
’ 根据以所确定参数打开串口
MSComm1.PortOpen = True
’提示串口成功打开
Indic_Conn.Caption = " 串口成功打开"
’调用按钮互锁程序,使打开无效关闭按钮
’有效
button_manage (CMDConn)
’使各通讯参数不可更改
Commpara.Enabled = False
’使Timer1控件工作
Timer1.Enabled = True
Exit Sub
Errline:
Indic_Conn.Caption = "串口未打开,请检查串口参数重新连接.."
End Sub
关闭串口过程代码如下:
Private Sub CMDDisconn_Click()
’关闭Timer1使数据通讯请求指令无效
Timer1.Enabled = False
’使串口通讯各参数可调整
Commpara.Enabled = True
’关闭串口
MSComm1.PortOpen = False
’显示串口关闭信息
Indic_Conn.Caption = " 串口已关闭"
’关闭断开按钮,打开连接按钮
button_manage (CMDDisconn)
End Sub
3.5 数据写入与读取过程程序设计
根据霍尼韦尔温控表的技术资料可知,温控表保存设定温度数据的寄存器地址为000,保存程序温度数据的寄存器地址为138,要在控制程序中分别显示温控表的设定温度值和程序温度值,本程序采用的是读取设定温度数据请求和读取程序温度数据分开发送和读取的方法,程序中定义了一个公共变量,用于判断Modbus-RTU传输协议应答报文中传输的是设定温度寄存器数据还是程序温度寄存器数据,同时定义了一个保存设定温度寄存器数据的变量,供温度设定控件Slider1和温度写入过程共同使用。将以上两个公共变量,定义在公共模块中,并将公共模块命名为PublicFUN,PublicFUN模块中设置以上两公共变量的代码如下:
’定义数据请求寄存器地址变量
Public addressVal As Integer
’定義设定温度值数据变量
Public SSetVal As Long
由Modbus-RTU协议规范模式可知,传输的报文的最后两个字节存放的是计算后的CRC校验码,程序中必须有CRC校验码计算程序,供系统发送请求数据和接受数据进行数据正确性检验时使用,因为CRC校验码计算是公用的函数,我们将也其放在公共模块中,CRC校验码计算函数代码如下:
Public Function CRC16(data() As Byte, no As Integer, btLoCRC As Byte, _
btHiCRC As Byte) As String
Dim CL As Byte, CH As Byte
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer
btHiCRC =
关键词:Modbus协议;VB6.0; RS-485;MSComm控件
中图分类号:TP302 文献标识码:A 文章编号:1009-3044(2017)31-0095-06
Control Program Realization of Honeywell Temperature Control Meter Based on VB
GAO Zhi-Yang,YU Xin-Gang
(Jiamusi University, Teaching Experiment Equipment Management Center, Jiamusi 154007,China)
Abstract: The Modbus protocol has a wide range applications in the communication of electronic controllers, the mastering and application are the necessary capabilities of the relevant engineering and technical personnel. The feauture of VB6.0 is easy to learn and develop the programg, its MSComm control through the serial communication can easily achieve communication with intelligent instruments and other electronic controller. This paper mainly introduces the method of communication between the temperature control meter and the Modbus-RTU protocol mode, and takes a Honeywell temperature control meter as the concrete control object. VB6.0 is the program development platform, through the example programming, introducing variable parameter communication and temperature control process between the serial port and the MSComm Control.
Key words: Modbus protocol; VB6.0; RS-485; MSComm control
本文从实际应用角度介绍了利用VB6.0的串口通信控件和RS485总线通过Modbus-RTU协议,实现与霍尼韦尔温控表通讯,读取、显示现场温度与程序设定值,并对温控表目标温度进行设定的过程,编程实现了温度控制的目的。
1 Modbus-RTU协议模式简介
Modbus-RTU是Modbus协议下的一个协议传输模式。Modbus是一个工业上常用的通讯协议,通过Modbus协议,控制器相互之间、控制器经由网络和其他设备之间可以实现通信。Modbus协议已经成为一种 通用工业标准。用于控制器时,通常选择设置其中的ASCII传输模式或RTU传输模式中一种。通过Modbus协议控制器组成的网络通信通常使用主-从技术,即一设备(主设备)能初始化查询传输(查询),从设备返回消息作为回应,主从设备发送的消息报文格式都要符合Modbus协议的要求。
控制程序设计中采用了常用的Modbus-RTU协议模式,表1是协议规定其报文结构:
表1 Modbus-RTU报文结构
[地址码 功能码 数据地址码 数据区 CRC校验码 一个字节 一个字节 2字节 N个字節 2个字节 ]
其中报文中的每个字节都是2个十六进制字符组成。地址码表明标明从机的地址,每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应主机回送信息;功能码告诉从机应执行什么动作;数据地址码标明动作执行的起始寄存器或线圈地址;数据区包括需要由从机返回何种信息或执行什么动作;CRC校验码用于信息的正确性检验。
2 霍尼韦尔温控表的参数设置
温度控制程序控制对象是型号为DC1040CT的霍尼韦尔温控表,温控表内部已经固化了Modbus协议,根据温控表说明书的技术参数说明可知:表内集成有Modbus-RTU和Modbus-ASCII两种协议模式,在本温控程序设计中,设置表的参数PSL为RTU,即采用Modbus-RTU模式;设置参数BITS为E_81,即偶校验、8位数据位、1位停止位;设置表的地址参数ID.NO为1,即仪表的协议地址为1;设置波特率参数BAUD为48,即波特率为4800kps;小数点设置参数DP设为1,即1位小数点。
3 温控程序软件的设计与实现
温度控程序使用的编程软件是微软的Visual Basic 6.0,利用其中的Mscomm串口通信控件实现与温控表的通讯与温度控制。Visual Basic 6.0中的Mscomm控件主要是为RS-232通用串口设计的。现在的计算机上普遍已经不再配置RS-232串口,可以在USB串口上接一个USB转RS-232的转接口,再配置一个RS-232串口到RS-485总线的转换器,即可实现Mscomm与RS-485总线上的设备通讯。 温度控制程序通过USB串口转换到RS-232串口,再转换到RS-485总线与温控表相连接,通过温控表被配置唯一的地址码和Modbus-RTU协议完成数据通讯连接,实现控制程序对温控表的相关数据写入与读取。
3.1 温度控制软件的界面设计
运行VB6.0,新建一个命名为Honeywell控制的工程,主窗体名为:控制窗口,然后在工具箱中添加Microsoft Comm Control 6.0控件和Microsoft Windows Common Controls 6.0控件,在窗体设计界面中分别加入Frame、Label、MScomm、ComboBox、CommandButton、Timer、Slider、TextBox等控件,分别命名,并将TextBox控件Text属性都设置为空,设计界面如图1:
3.2 界面的窗体Form_load()事件程序设计
利用窗体事件Form_load(),对窗体上的各控件进行参数设置。用各ComboBox控件的AddItem属性设置各个ComboBox控件的待选参数,用各ComboBox控件的ListIndex属性设置各默认初始参数,Form_Load()过程中如下代码:
Private Sub Form_Load()
’仪表地址选择设置
AddressNo.AddItem "1", 0
AddressNo.AddItem "2", 1
AddressNo.AddItem "3", 2
AddressNo.AddItem "4", 3
AddressNo.AddItem "5", 4
AddressNo.AddItem "6", 5
’串口号设置
ComNo.AddItem "COM1", 0
ComNo.AddItem "COM2", 1
ComNo.AddItem "COM3", 2
ComNo.AddItem "COM4", 3
ComNo.AddItem "COM5", 4
’波特率设置
BaudeRate.AddItem "4800", 0
BaudeRate.AddItem "9600", 1
BaudeRate.AddItem "19200", 2
BaudeRate.AddItem "115200", 3
’校验位设置
Parity.AddItem "N", 0
Parity.AddItem "E", 1
Parity.AddItem "O", 2
’数据位设置
DataBit.AddItem "7", 0
DataBit.AddItem "8", 1
’停止位设置
StopBit.AddItem "1", 0
StopBit.AddItem "2", 1
’预置串口参数默认值
AddressNo.ListIndex = 0
ComNo.ListIndex = 0
BaudeRate.ListIndex = 1
Parity.ListIndex = 1
DataBit.ListIndex = 1
StopBit.ListIndex = 0
’初始串口未打开提示信息
Indic_Conn.Caption = " 串口未打开"
’设置Timer1为不可用
Timer1.Enabled = False
End Sub
注意,AddressNo.AddItem即设备地址参数,可以根据实际需要参照Modbus协议规定继续添加。同时,在过程中关闭了Timer1控件对象,因为本程序在Timer1_Timer事件中有数据通讯请求过程,若在串口未连接的情况下执行数据通讯请求,会出现错误,所以在Form_load()中將其关闭,待串口打开后再将其打开,执行数据通讯请求。
3.3 按钮互锁的过程设计
本控制程序中的串口连接与断开两个按钮要实现互锁,即串口成功打开后,则打开按钮状态变为无效,直到按断开按钮,使串口成功断开为止。断开按钮也是如此,断开串口后,则断开按钮状态也变为无效,要等串口成功连接后,断开按钮才有效。按钮互锁子过程放在窗体代码中,按钮互锁子过程代码如下:
Public Sub button_manage(button As Variant)
Select Case button
’参数为连接按钮
Case CMDConn
’断开按钮有效
CMDDisconn.Enabled = True
’连接按钮无效
CMDConn.Enabled = False
’参数为断开按钮
Case CMDDisconn
’连接按钮有效
CMDConn.Enabled = True
’断开按钮无效
CMDDisconn.Enabled=False
End Select
End Sub
其中,被锁定的按钮控件名作为调用过程的参数,锁定管理过程根据参数判断被锁定按钮,并打开对应的另一按钮。 3.4 打开与关闭串口的程序设计
CMDConn_Click()是串口打开事件过程,首先在过程中设置一条On Error Goto Errline语句,功能是若串口打开不成功则跳转至Errline行,进行打开错误提示,并退出串口连接过程。其后是串口各参数设置并打开串口过程。执行完打开串口指令后,继续执行提示串口打开成功指令、执行打开关闭按钮互锁过程、执行使Frame控件无效指令和打开Timer1控件指令,实现各个控件对应的功能。串口打开过程代码如下:
Private Sub CMDConn_Click()
On Error GoTo Errline
’配置、确定打开串口各项参数
MSComm1.CommPort = ComNo.ListIndex 1
MSComm1.Settings = BaudeRate.Text
"," Parity.Text "," DataBit.Text
"," StopBit.Text
MSComm1.InputMode = 1
MSComm1.InputLen = 0
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 7
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 1024
’ 根据以所确定参数打开串口
MSComm1.PortOpen = True
’提示串口成功打开
Indic_Conn.Caption = " 串口成功打开"
’调用按钮互锁程序,使打开无效关闭按钮
’有效
button_manage (CMDConn)
’使各通讯参数不可更改
Commpara.Enabled = False
’使Timer1控件工作
Timer1.Enabled = True
Exit Sub
Errline:
Indic_Conn.Caption = "串口未打开,请检查串口参数重新连接.."
End Sub
关闭串口过程代码如下:
Private Sub CMDDisconn_Click()
’关闭Timer1使数据通讯请求指令无效
Timer1.Enabled = False
’使串口通讯各参数可调整
Commpara.Enabled = True
’关闭串口
MSComm1.PortOpen = False
’显示串口关闭信息
Indic_Conn.Caption = " 串口已关闭"
’关闭断开按钮,打开连接按钮
button_manage (CMDDisconn)
End Sub
3.5 数据写入与读取过程程序设计
根据霍尼韦尔温控表的技术资料可知,温控表保存设定温度数据的寄存器地址为000,保存程序温度数据的寄存器地址为138,要在控制程序中分别显示温控表的设定温度值和程序温度值,本程序采用的是读取设定温度数据请求和读取程序温度数据分开发送和读取的方法,程序中定义了一个公共变量,用于判断Modbus-RTU传输协议应答报文中传输的是设定温度寄存器数据还是程序温度寄存器数据,同时定义了一个保存设定温度寄存器数据的变量,供温度设定控件Slider1和温度写入过程共同使用。将以上两个公共变量,定义在公共模块中,并将公共模块命名为PublicFUN,PublicFUN模块中设置以上两公共变量的代码如下:
’定义数据请求寄存器地址变量
Public addressVal As Integer
’定義设定温度值数据变量
Public SSetVal As Long
由Modbus-RTU协议规范模式可知,传输的报文的最后两个字节存放的是计算后的CRC校验码,程序中必须有CRC校验码计算程序,供系统发送请求数据和接受数据进行数据正确性检验时使用,因为CRC校验码计算是公用的函数,我们将也其放在公共模块中,CRC校验码计算函数代码如下:
Public Function CRC16(data() As Byte, no As Integer, btLoCRC As Byte, _
btHiCRC As Byte) As String
Dim CL As Byte, CH As Byte
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer
btHiCRC =