利用VB6.0与莱恩达的智能模块实现通讯设计
详细内容
一、 引言:
在工业现场中,人们常常面临着数据采集和管理的任务。而且工业现场有时各个传感器分布在不同的位置,距离较远,传感器的信号一般为电压信号,一旦传送距离远了,会造成信号衰弱。因此人们提出了传感器信号在监测点处理,然后再传回监控室,分布式监控的概念就此诞生。智能模块由于其灵巧方便而且RS485传送距离远,在分布式监控系统中得到了广泛的采用。
二、 硬件介绍:
1、FBMOD-8AI现场总线智能节点的通信采用了MODBUS协议,通信为异步半双工模式,结构为主-从结构,格式如下:
串口通信格式:
1位---起始位、8位---数据位、2位(默认)/1位(可选)---停止位、无奇偶校验
发送格式(主机):
01 04 00 00 00 10 CRCL CRCH
01:节点地址
04:功能号
00 00:读寄存器的起始地址
00 10:读取寄存器长度
CRCL CRCH:CRC校验码
接收格式(主机):
01 04 20 …… CRCL CRCH
01:节点地址
04:功能号
20:数据长度
……:数据
CRCL CRCH:CRC校验码
2、FBMOD-8DO现场总线智能节点的通信采用了MODBUS@RTU协议,通信为异步半双工模式,结构为主-从结构,格式如下:
串口通信格式:
1位---起始位、8位---数据位、2(默认)/1(可选)位---停止位、无奇偶校验
发送格式(主机):
02 05 00 01 FF/00 00 CRCL CRCH
02:节点地址
05 :功能号
00 01:地址,00~07
FF/00 00:置“1”/清“0”
CRCL CRCH:CRC校验码
接收格式(主机):
02 05 00 01 FF/00 00 CRCL CRCH
02:节点地址
05 :功能号
00 01:地址,00~07
FF/00 00:置“1”/清“0”
CRCL CRCH:CRC校验码
三、 软件说明:
在VB软件编程方面关键是通讯参数的设定,上位机与模块通讯时要把数据设成子节型数进行传送,CRC16校验码的计算。
MSM.OCX():
‘打开串口
Private Sub mand1_Click()
MSm1.mPort = 1
If MSm1.PortOpen = False Then
MSm1.PortOpen = True
End If
MSm1.Settings = "9600,n,8,2"
mand1.Enabled = False
End Sub
‘关闭串口
Private Sub mand3_Click()
If MSm1.PortOpen = True Then
MSm1.PortOpen = False
End If
End
End Sub
‘计算CRC16校验码
Function CRC16(data() As Byte) As Byte()
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
Dim L As Integer
Dim data1 As Byte
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) = CRC16Lo
returndata(1) = CRC16Hi
CRC16 = returndata
End Function
‘注意:在数据传输时CRC的低位可能在前,而高位在后。
‘计算出命令的crc码
‘通道置一子程序
Private Sub DOCRC1(ByVal data As Byte)
Dim a(8) As Byte ‘发送数据
Dim d(5) As Byte ‘待传输数据
Dim crc() As Byte
d(0) = &H3
d(1) = &H5
d(2) = &H0
d(3) = data
d(4) = &HFF
d(5) = &H0
crc = CRC16(d) ‘得到CRC16校验码
a(0) = &H3
a(1) = &H5
a(2) = &H0
a(3) = data ‘要发送的通道号
a(4) = &HFF
a(5) = &H0
a(6) = crc(0)
a(7) = crc(1)
MSm1.Output = a
End Sub
‘通道清零子程序
Private Sub DOCRC0(ByVal data As Byte)
Dim a(8) As Byte ‘发送数据
Dim d(5) As Byte ‘待传输数据
Dim crc() As Byte
d(0) = &H3
d(1) = &H5
d(2) = &H0
d(3) = data
d(4) = &H0
d(5) = &H0
crc = CRC16(d)
a(0) = &H3
a(1) = &H5
a(2) = &H0
a(3) = data
a(4) = &H0
a(5) = &H0
a(6) = crc(0)
a(7) = crc(1)
MSm1.Output = a
End Sub
‘通道0按钮
Private Sub mand4_Click()
Dim data1 As Byte