📄 datatoscreen.frm
字号:
A = Array("0.000", "0.000", "0.0", "0.00", "0.00", _
"0.000", "0.00", "0000", "0.000", "0", _
"0", "0.00", "0.00", "0.00", "0.00", _
"0.00", "0.00", "0.0", "0.0", "0.0", _
"0.0", "0.00", "0.00", "0.00", "0.00", _
"0.00", "0.00", "0.00", "0.00", "0.0", _
"0.0", "0.0", "0.0", "0.0", "0.0", _
"0.0", "0.0", "0.000", "0.000", "0.000", _
"0.000", "0.000", "0.000", "0.000", "0.00", _
"0.000", "0.00", "0.000", "0.0", "0.0", _
"0.000", "0.000", "0.00", "0.000", "0.000", _
"0.00")
For j = 0 To 55
Points(j) = A(j)
Next j
'信号灯颜色的初试化
rgBlack = 0
rgRed = 1
rgLime = 2
rgYellow = 3
'打开通讯端口
MSComm.PortOpen = True
Form1.Visible = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm.PortOpen = False
Server.Disconnect
End Sub
Private Sub Timer_Timer()
'从WinCC读入要发送的数据
ReadData
'转换数据格式
TransData
'发送遥信(数字量)
SendToScreenI
'发送遥测(模拟量)
SendToScreenF
End Sub
'左移函数
Public Function ByteLeft(byte1 As Byte, n As Integer)
Dim intem As Byte '临时变量
Dim intem1 As Byte '临时变量
Dim x, y As Integer
intem1 = byte1
For x = 1 To n '移多少位就循环多少次
For y = 8 To 1 Step -1 '从第八位(左边第一位)开始循环左移
Select Case y
Case 8
If (intem1 And &H80) = &H80 Then '如果临时变量intem1的第八位是1,
intem = &H1 '则将临时变量intem置1,
Else
intem = &H0 '反之置0
End If
Case 7
If (intem1 And &H40) = &H40 Then '如果临时变量intem1的第七位是1,
intem1 = intem1 Or &H80 '则将其第八位置1(其它位不变),
Else
intem1 = intem1 And &H7F '反之将第八位置0(其它位不变)
End If
Case 6
If (intem1 And &H20) = &H20 Then '操作与上面相同
intem1 = intem1 Or &H40
Else
intem1 = intem1 And &HBF
End If
Case 5
If (intem1 And &H10) = &H10 Then
intem1 = intem1 Or &H20
Else
intem1 = intem1 And &HDF
End If
Case 4
If (intem1 And &H8) = &H8 Then
intem1 = intem1 Or &H10
Else
intem1 = intem1 And &HEF
End If
Case 3
If (intem1 And &H4) = &H4 Then
intem1 = intem1 Or &H8
Else
intem1 = intem1 And &HF7
End If
Case 2
If (intem1 And &H2) = &H2 Then
intem1 = intem1 Or &H4
Else
intem1 = intem1 And &HFB
End If
Case 1
If (intem1 And &H1) = &H1 Then
intem1 = intem1 Or &H2
Else
intem1 = intem1 And &HFD
End If
If intem = &H1 Then '移完第一位后,如果intem是1(即第八位是1)
intem1 = intem1 Or &H1 '则将intem1的第一位置1
Else
intem1 = intem1 And &HFE '反之置0
End If
End Select
Next y
Next x
ByteLeft = intem1 '将intem1的值返回给函数名
End Function
Private Sub TransData()
Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim mo As Integer
Dim yu As Integer
Dim inter As Integer
Dim sign As Byte
Dim off As Integer
Dim str As String
'遥测数据转化
off = 48
For i = 0 To 55
AnalogString(i) = Format(AnalogValue(i), Points(i)) '转换成字符串
AnalogString(i) = KillPoint(AnalogString(i)) '去掉字符串中的小数点
sign = Len(AnalogString(i))
YaoCe(2 * i) = 0
YaoCe(2 * i + 1) = 0
If sign = 4 Then
YaoCe(2 * i) = ByteLeft(Asc(Mid(AnalogString(i), 1, 1)) - off, 4) + Asc(Mid(AnalogString(i), 2, 1)) - off
YaoCe(2 * i + 1) = ByteLeft(Asc(Mid(AnalogString(i), 3, 1)) - off, 4) + Asc(Mid(AnalogString(i), 4, 1)) - off
ElseIf sign = 3 Then
YaoCe(2 * i) = Asc(Mid(AnalogString(i), 1, 1)) - off
YaoCe(2 * i + 1) = ByteLeft(Asc(Mid(AnalogString(i), 2, 1)) - off, 4) + Asc(Mid(AnalogString(i), 3, 1)) - off
ElseIf sign = 2 Then
YaoCe(2 * i) = 0
YaoCe(2 * i + 1) = ByteLeft(Asc(Mid(AnalogString(i), 1, 1)) - off, 4) + Asc(Mid(AnalogString(i), 2, 1)) - off
ElseIf sign = 1 Then
YaoCe(2 * i) = 0
YaoCe(2 * i + 1) = Asc(Mid(AnalogString(i), 1, 1)) - off
End If
Next i
'遥信数据转化
For i = 0 To 27
YaoXin(i) = &H0
Next i
For i = 0 To 76
mo = i \ 4
yu = i Mod 4
m = DigitalValue(i)
If m = 0 Then
sign = rgLime
ElseIf m = 2 Then
sign = rgRed
Else
sign = rgYellow
End If
YaoXin(mo) = YaoXin(mo) + ByteLeft(sign, yu * 2)
Next i
End Sub
Private Sub SendToScreenI()
'发送遥信信号
Dim ch(1 To 1) As Byte
Dim CheckSum(1 To 1) As Byte
Dim i As Integer
ch(1) = &HF2 '同步字
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor &H0)
ch(1) = &H1 '成组遥信
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
ch(1) = 3 + 28 '报文长度
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
ch(1) = &H0 '起始位置高位
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
ch(1) = &H1 '起始位置低位
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
ch(1) = 112 '遥信个数
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
For i = 0 To 27
ch(1) = YaoXin(i)
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
Next i
MSComm.Output = CheckSum
End Sub
Private Sub SendToScreenF()
'发送遥测信号
Dim ch(1 To 1) As Byte
Dim CheckSum(1 To 1) As Byte
Dim i As Integer
ch(1) = &HF2 '同步字
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor &H0)
ch(1) = &H9 '成组遥信
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
ch(1) = 3 + 112 '报文长度
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
ch(1) = &H0 '起始位置高位
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
ch(1) = &H1 '起始位置低位
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
ch(1) = 56 '遥信个数
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
For i = 0 To 111
ch(1) = YaoCe(i)
MSComm.Output = ch
CheckSum(1) = &HFF Xor (ch(1) Xor CheckSum(1))
Next i
MSComm.Output = CheckSum
End Sub
Public Function KillPoint(str As String)
Dim str1, str2 As String
Dim n, length As Integer
n = InStr(1, str, ".")
If n > 0 Then
length = Len(str)
str1 = Left(str, n - 1)
str2 = Right(str, length - n)
KillPoint = str1 & str2
Else
KillPoint = str
End If
End Function
Private Sub ReadData()
'从WinCC中读出每个变量的值
DigitalGroup.SyncRead OPCCache, 142, DigitalServerHandles, DigitalRaw, DigitalErrors
AnalogGroup.SyncRead OPCCache, 53, AnalogServerHandles, AnalogRaw, AnalogErrors
'进行判断,将0,2,4或6存入DigitalValue
For i = 1 To 141 Step 2
If DigitalRaw(i) Then
DigitalValue((i - 1) / 2) = 4
Else
If DigitalRaw(i + 1) Then
DigitalValue((i - 1) / 2) = 2
Else
DigitalValue((i - 1) / 2) = 0
End If
End If
Next i
For j = 1 To 53
AnalogValue(j - 1) = AnalogRaw(j)
If AnalogValue(j - 1) < 0 Then
AnalogValue(j - 1) = 0
End If
Next j
'在WinCC中,液位差的单位是mm,但从大屏幕的数据表中看,它的单位是m,所以需要进行转换
AnalogValue(1) = AnalogValue(1) / 1000 '集水井液位差计
AnalogValue(5) = AnalogValue(5) / 1000 '沉沙池液位差计
AnalogValue(51) = AnalogValue(51) / 1000 '外泵房液位差计
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -