Dim auto As Boolean Dim ONOFF As Boolean '按钮操作标志Dim k As Integer '按钮操作判断 k=1为发自动操作命令、k=2为发手动操作命令、k=3为发手动喷命令、k=4为发手动滴命令 Dim j As Integer '轮循判断 Dim DATA As Boolean '读操作标志 Dim sendata As String, sendata1 As String, sendata2 As String 'sendata:读输入,sendata1:读输出,sendata2:读内部继电器 Dim sendata3 As String, sendata4 As String, sendata5 As String, sendata6 As String 'sendata3:自动,sendata4:手动,sendata5:手动喷,sendata6:手动滴 Private Sub Command1_Click() '手动喷 k = 3 ONOFF = True '按钮操作置真 auto = False End SubPrivate Sub Command2_Click() '手动滴 k = 4 ONOFF = True '按钮操作置真 auto = True End SubPrivate Sub Command3_Click() '手动/自动转换 Dim sendata3 As String If Text3.Text = "手动" Then '如果目前为手动状态,则转化为自动状态 k = 1 Else k = 2 End If ONOFF = True '按钮操作置真 End SubPrivate Sub Form_Load() On Error GoTo err1 sendata = "@00RR00000001" '"@" + "00" + "RR" + "0000" + "0001"---@:固定格式,"00":站号,"RR":读出输入/输出、内部辅助继电器命令,"0000":继电器地址,"0001":读取数量 sendata1 = "@00RR00100001" '"@" + "00" + "RR" + "0010" + "0001"---@:固定格式,"00":站号,"RR":读出输入/输出、内部辅助继电器命令,"0010":继电器地址,"0001":读取数量 sendata2 = "@00RR02000001" '"@" + "00" + "RR" + "2000" + "0001"---@:固定格式,"00":站号,"RR":读出输入/输出、内部辅助继电器命令,"2000":继电器地址,"0001":读取数量 sendata3 = "@00KSCIO 020000" '"@" + "00" + "KS" + "CIO " + "0200" + "00"---@:固定格式,"00":站号,"KS":强制置位命令,"CIO ":置位的继电器种类(输出、输入、内部、特殊辅助),"0200":通道号,"00":接点 sendata4 = "@00KRCIO 020000" '"@" + "00" + "KR" + "CIO " + "0200" + "00"---@:固定格式,"00":站号,"KR":强制置位命令,"CIO ":置位的继电器种类(输出、输入、内部、特殊辅助),"0200":通道号,"00":接点 sendata5 = "@00WR02010001" '"@" + "00" + "WR" + "0200" + "0001"---@:固定格式,"00":站号,"WR":写入命令,"0201":通道号,"0001":置201.00并复位201.01 sendata6 = "@00WR02010002" '"@" + "00" + "WR" + "0200" + "0002"---@:固定格式,"00":站号,"WR":写入命令,"0201":通道号,"0002":置201.01并复位201.00 i = 0 k = 0 ONOFF = False DATA = False If MSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.CommPort = 1 '通信口 MSComm1.Settings = "9600,E,7,2" MSComm1.Handshaking = 0 MSComm1.InputLen = 0 '设置和返回input每次读出的字节数,设为0时读出接收缓冲区中的内容 MSComm1.OutBufferCount = 0 '设置和返回发送缓冲区的字节数,设为0时清空发送缓冲区 MSComm1.InBufferCount = 0 '设置和返回接收缓冲区的字节数,设为0时清空接收缓冲区 MSComm1.PortOpen = True Exit Sub err1: MsgBox Err.Description End Sub Function FCS(a$) As String '校验计算程序(异或) b% = 0 i% = Len(a$) For i = 1 To i% b% = b% Xor Asc(Mid(a$, i, 1)) Next ff$ = Hex$(b%) If Len(ff$) = 1 Then ff$ = "0" + ff$ End If FCS = ff$ + "*" End FunctionPrivate Sub Form_Resize() Me.Height = 4000 Me.Width = 6000 Me.Left = 0.5 * (MDIForm1.Width - Me.Width) Me.Top = 0.3 * (MDIForm1.Height - Me.Height)End SubPrivate Sub MSComm1_OnComm() Dim getdata As String 'getdata:读输入缓存区 Dim zhuangX As Boolean, zhuangX1 As Boolean 'zhuangX:干旱判断,zhuangX1:严重干旱判断 Dim zhuangY As Boolean, zhuangY1 As Boolean 'zhuangY:喷判断,zhuangY1:滴判断 If MSComm1.CommEvent = comEvReceive Then 'CommEvent的属性返回的值为comEvReceive时是发生了接收事件. getdata = MSComm1.Input If ONOFF = True And DATA = False Then '因操作按钮而产生的OnComm时,清除按钮操作标志与按钮操作判断并退出此事件,不做接收数据处理 ONOFF = False k = 0 Timer1.Enabled = True Exit Sub End If
'读数据时返回格式为:"@" + "00" + "RR"+"00"+"四位数据"+FCS+"*"+CHR(13) '@:固定格式,"00":站号,"00":正确处理时的结束码,FCS:校验和,"*"+CHR(13):固定格式 getdata = Mid(getdata, 11, 1) '因为我们要读的是继电器区的后两位状态,所以取四位数据的最后一位 DATA = False Select Case j Case 0 '读000.00与000.01的状态时 If Val(getdata) Mod 2 = 1 Then '除2的余数如果等于1,说明000.00闭合(8421---000.00为最后一位,只有它闭合getdata才为奇数) zhuangX = True Else zhuangX = False End If If Val(getdata) Mod 4 >= 2 Then '除4的余数如果大于或等于2,说明000.01闭合(8421---000.01为倒数第二位,只有它闭合getdata除4的余数才会大于或等于2) zhuangX1 = True Else zhuangX1 = False End If If zhuangX = False And zhuangX1 = False Then '如果000.00与000.01都不闭合,则显示湿润 Text1.Text = "湿润" Else If zhuangX = True Then '如果000.00闭合,则显示干旱 Text1.Text = "干旱" Else Text1.Text = "严重干旱" '如果000.01闭合,则显示严重干旱 End If End If Case 1 '读10.00与10.01的状态 If Val(getdata) Mod 2 = 1 Then '除2的余数如果等于1,说明10.00闭合(8421---10.00为最后一位,只有它闭合getdata才为奇数) zhuangY = True Else zhuangY = False End If If Val(getdata) Mod 4 >= 2 Then '除4的余数如果大于或等于2,说明10.01闭合(8421---10.01为倒数第二位,只有它闭合getdata除4的余数才会大于或等于2) zhuangY1 = True Else zhuangY1 = False End If If zhuangY = False And zhuangY1 = False Then '如果000.00与000.01都不闭合,则显示为空,喷嘴没有工作 Text2.Text = "" Else If zhuangY = True Then '如果10.00闭合,则显示喷 Text2.Text = "滴" Else Text2.Text = "喷" '如果10.01闭合,则显示滴 End If End If Case 2 If Val(getdata) Mod 2 = 1 Then '除2的余数如果等于1,说明200.00闭合(8421---200.00为最后一位,只有它闭合getdata才为奇数) Text3.Text = "自动" Else Text3.Text = "手动" End If j = -1 End Select j = j + 1 '进入一个读操作 Timer1.Enabled = True End If ' End SubPrivate Sub Timer1_Timer() If Text3.Text = "自动" Then '如果目前为自动状态,手动“喷”“滴”控制按钮失效 Command1.Enabled = False Command2.Enabled = False Else Command1.Enabled = True Command2.Enabled = True End If If ONOFF = True Then MSComm1.RThreshold = 11 '设定产生OnComm事件的字符数 '读命令返回格式为:"@" + "00" + "KS/KR"+"00"+FCS+"*"+CHR(13):正好11个字符,所以设定为返回11个字符后产生OnComm事件 '@:固定格式,"00":站号,"KS/KR":根据置/复位命令返回相对应的字符,"00":正确处理时的结束码,FCS:校验和,"*"+CHR(13):固定格式 Select Case k Case 1 MSComm1.InBufferCount = 0 '清空接收缓冲区 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.Output = sendata3 + FCS(sendata3) + Chr(13) '强制200.00置位 Case 2 MSComm1.InBufferCount = 0 '清空接收缓冲区 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.Output = sendata4 + FCS(sendata4) + Chr(13) '强制200.00复位 Case 3 MSComm1.InBufferCount = 0 '清空接收缓冲区 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.Output = sendata5 + FCS(sendata5) + Chr(13) '201.00置位,201.01复位 Case 4 MSComm1.InBufferCount = 0 '清空接收缓冲区 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.Output = sendata6 + FCS(sendata6) + Chr(13) '201.01置位,201.00复位 End Select Exit Sub End If DATA = True MSComm1.RThreshold = 15 '设定产生OnComm事件的字符数 '读命令返回格式为:"@" + "00" + "RR"+"00"+"四位数据"+FCS+"*"+CHR(13):正好15个字符,所以设定为返回15个字符后产生OnComm事件 '@:固定格式,"00":站号,"00":正确处理时的结束码,FCS:校验和,"*"+CHR(13):固定格式 Select Case j Case 0 MSComm1.InBufferCount = 0 '清空接收缓冲区 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.Output = sendata + FCS(sendata) + Chr(13) '读000.00与000.01的状态 Case 1 MSComm1.InBufferCount = 0 '清空接收缓冲区 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.Output = sendata1 + FCS(sendata1) + Chr(13) '读10.00与10.01的状态 Case 2 MSComm1.InBufferCount = 0 '清空接收缓冲区 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.Output = sendata2 + FCS(sendata2) + Chr(13) '读200.00与200.01的状态 End Select Timer1.Enabled = False '关闭定时器事件等待返回数据处理结束
http://download.csdn.net/source/1262066
Dim ONOFF As Boolean '按钮操作标志Dim k As Integer '按钮操作判断 k=1为发自动操作命令、k=2为发手动操作命令、k=3为发手动喷命令、k=4为发手动滴命令
Dim j As Integer '轮循判断
Dim DATA As Boolean '读操作标志
Dim sendata As String, sendata1 As String, sendata2 As String 'sendata:读输入,sendata1:读输出,sendata2:读内部继电器
Dim sendata3 As String, sendata4 As String, sendata5 As String, sendata6 As String 'sendata3:自动,sendata4:手动,sendata5:手动喷,sendata6:手动滴
Private Sub Command1_Click() '手动喷
k = 3
ONOFF = True '按钮操作置真
auto = False
End SubPrivate Sub Command2_Click() '手动滴
k = 4
ONOFF = True '按钮操作置真
auto = True
End SubPrivate Sub Command3_Click() '手动/自动转换
Dim sendata3 As String
If Text3.Text = "手动" Then '如果目前为手动状态,则转化为自动状态
k = 1
Else
k = 2
End If
ONOFF = True '按钮操作置真
End SubPrivate Sub Form_Load()
On Error GoTo err1
sendata = "@00RR00000001" '"@" + "00" + "RR" + "0000" + "0001"---@:固定格式,"00":站号,"RR":读出输入/输出、内部辅助继电器命令,"0000":继电器地址,"0001":读取数量
sendata1 = "@00RR00100001" '"@" + "00" + "RR" + "0010" + "0001"---@:固定格式,"00":站号,"RR":读出输入/输出、内部辅助继电器命令,"0010":继电器地址,"0001":读取数量
sendata2 = "@00RR02000001" '"@" + "00" + "RR" + "2000" + "0001"---@:固定格式,"00":站号,"RR":读出输入/输出、内部辅助继电器命令,"2000":继电器地址,"0001":读取数量
sendata3 = "@00KSCIO 020000" '"@" + "00" + "KS" + "CIO " + "0200" + "00"---@:固定格式,"00":站号,"KS":强制置位命令,"CIO ":置位的继电器种类(输出、输入、内部、特殊辅助),"0200":通道号,"00":接点
sendata4 = "@00KRCIO 020000" '"@" + "00" + "KR" + "CIO " + "0200" + "00"---@:固定格式,"00":站号,"KR":强制置位命令,"CIO ":置位的继电器种类(输出、输入、内部、特殊辅助),"0200":通道号,"00":接点
sendata5 = "@00WR02010001" '"@" + "00" + "WR" + "0200" + "0001"---@:固定格式,"00":站号,"WR":写入命令,"0201":通道号,"0001":置201.00并复位201.01
sendata6 = "@00WR02010002" '"@" + "00" + "WR" + "0200" + "0002"---@:固定格式,"00":站号,"WR":写入命令,"0201":通道号,"0002":置201.01并复位201.00
i = 0
k = 0
ONOFF = False
DATA = False
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
MSComm1.CommPort = 1 '通信口
MSComm1.Settings = "9600,E,7,2"
MSComm1.Handshaking = 0
MSComm1.InputLen = 0 '设置和返回input每次读出的字节数,设为0时读出接收缓冲区中的内容
MSComm1.OutBufferCount = 0 '设置和返回发送缓冲区的字节数,设为0时清空发送缓冲区
MSComm1.InBufferCount = 0 '设置和返回接收缓冲区的字节数,设为0时清空接收缓冲区
MSComm1.PortOpen = True
Exit Sub
err1:
MsgBox Err.Description
End Sub
Function FCS(a$) As String '校验计算程序(异或)
b% = 0
i% = Len(a$)
For i = 1 To i%
b% = b% Xor Asc(Mid(a$, i, 1))
Next
ff$ = Hex$(b%)
If Len(ff$) = 1 Then
ff$ = "0" + ff$
End If
FCS = ff$ + "*"
End FunctionPrivate Sub Form_Resize()
Me.Height = 4000
Me.Width = 6000
Me.Left = 0.5 * (MDIForm1.Width - Me.Width)
Me.Top = 0.3 * (MDIForm1.Height - Me.Height)End SubPrivate Sub MSComm1_OnComm()
Dim getdata As String 'getdata:读输入缓存区
Dim zhuangX As Boolean, zhuangX1 As Boolean 'zhuangX:干旱判断,zhuangX1:严重干旱判断
Dim zhuangY As Boolean, zhuangY1 As Boolean 'zhuangY:喷判断,zhuangY1:滴判断 If MSComm1.CommEvent = comEvReceive Then 'CommEvent的属性返回的值为comEvReceive时是发生了接收事件.
getdata = MSComm1.Input
If ONOFF = True And DATA = False Then '因操作按钮而产生的OnComm时,清除按钮操作标志与按钮操作判断并退出此事件,不做接收数据处理
ONOFF = False
k = 0
Timer1.Enabled = True
Exit Sub
End If
'读数据时返回格式为:"@" + "00" + "RR"+"00"+"四位数据"+FCS+"*"+CHR(13)
'@:固定格式,"00":站号,"00":正确处理时的结束码,FCS:校验和,"*"+CHR(13):固定格式
getdata = Mid(getdata, 11, 1) '因为我们要读的是继电器区的后两位状态,所以取四位数据的最后一位
DATA = False
Select Case j
Case 0 '读000.00与000.01的状态时
If Val(getdata) Mod 2 = 1 Then '除2的余数如果等于1,说明000.00闭合(8421---000.00为最后一位,只有它闭合getdata才为奇数)
zhuangX = True
Else
zhuangX = False
End If
If Val(getdata) Mod 4 >= 2 Then '除4的余数如果大于或等于2,说明000.01闭合(8421---000.01为倒数第二位,只有它闭合getdata除4的余数才会大于或等于2)
zhuangX1 = True
Else
zhuangX1 = False
End If
If zhuangX = False And zhuangX1 = False Then '如果000.00与000.01都不闭合,则显示湿润
Text1.Text = "湿润"
Else
If zhuangX = True Then '如果000.00闭合,则显示干旱
Text1.Text = "干旱"
Else
Text1.Text = "严重干旱" '如果000.01闭合,则显示严重干旱
End If
End If
Case 1 '读10.00与10.01的状态
If Val(getdata) Mod 2 = 1 Then '除2的余数如果等于1,说明10.00闭合(8421---10.00为最后一位,只有它闭合getdata才为奇数)
zhuangY = True
Else
zhuangY = False
End If
If Val(getdata) Mod 4 >= 2 Then '除4的余数如果大于或等于2,说明10.01闭合(8421---10.01为倒数第二位,只有它闭合getdata除4的余数才会大于或等于2)
zhuangY1 = True
Else
zhuangY1 = False
End If If zhuangY = False And zhuangY1 = False Then '如果000.00与000.01都不闭合,则显示为空,喷嘴没有工作
Text2.Text = ""
Else
If zhuangY = True Then '如果10.00闭合,则显示喷
Text2.Text = "滴"
Else
Text2.Text = "喷" '如果10.01闭合,则显示滴
End If
End If
Case 2
If Val(getdata) Mod 2 = 1 Then '除2的余数如果等于1,说明200.00闭合(8421---200.00为最后一位,只有它闭合getdata才为奇数)
Text3.Text = "自动"
Else
Text3.Text = "手动"
End If
j = -1
End Select
j = j + 1 '进入一个读操作
Timer1.Enabled = True
End If
'
End SubPrivate Sub Timer1_Timer() If Text3.Text = "自动" Then '如果目前为自动状态,手动“喷”“滴”控制按钮失效
Command1.Enabled = False
Command2.Enabled = False
Else
Command1.Enabled = True
Command2.Enabled = True
End If
If ONOFF = True Then
MSComm1.RThreshold = 11 '设定产生OnComm事件的字符数
'读命令返回格式为:"@" + "00" + "KS/KR"+"00"+FCS+"*"+CHR(13):正好11个字符,所以设定为返回11个字符后产生OnComm事件
'@:固定格式,"00":站号,"KS/KR":根据置/复位命令返回相对应的字符,"00":正确处理时的结束码,FCS:校验和,"*"+CHR(13):固定格式
Select Case k
Case 1
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = sendata3 + FCS(sendata3) + Chr(13) '强制200.00置位
Case 2
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = sendata4 + FCS(sendata4) + Chr(13) '强制200.00复位
Case 3
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = sendata5 + FCS(sendata5) + Chr(13) '201.00置位,201.01复位
Case 4
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = sendata6 + FCS(sendata6) + Chr(13) '201.01置位,201.00复位
End Select
Exit Sub
End If
DATA = True
MSComm1.RThreshold = 15 '设定产生OnComm事件的字符数
'读命令返回格式为:"@" + "00" + "RR"+"00"+"四位数据"+FCS+"*"+CHR(13):正好15个字符,所以设定为返回15个字符后产生OnComm事件
'@:固定格式,"00":站号,"00":正确处理时的结束码,FCS:校验和,"*"+CHR(13):固定格式
Select Case j
Case 0
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = sendata + FCS(sendata) + Chr(13) '读000.00与000.01的状态
Case 1
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = sendata1 + FCS(sendata1) + Chr(13) '读10.00与10.01的状态
Case 2
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = sendata2 + FCS(sendata2) + Chr(13) '读200.00与200.01的状态
End Select
Timer1.Enabled = False '关闭定时器事件等待返回数据处理结束
End Sub