Dim Receiveover_shuzimokuai2 As Boolean '1號接收成功或失敗
'Dim Sendover As Boolean '發送完畢 comm事件
Dim sendshuzimokuai2(7) As Byte '數字模塊2發送查詢
Dim sendshuzimokuai2_Y1_c(7) As Byte '數字模塊2 Y1通 線圈接常開點用于啟動 c 代表closed
Dim sendshuzimokuai2_Y1_o(7) As Byte '數字模塊2 Y1斷 o 代表open
Dim sendshuzimokuai2_Y2_c(7) As Byte '數字模塊2 Y2通 線圈接常閉點用于停止
Dim sendshuzimokuai2_Y2_o(7) As Byte '數字模塊2 Y2斷
Public lunxun_jishu As Integer '輪詢計數,此程序只有一個模塊,先串口發送查詢,下一秒分析串口回傳數據
Public flag_Y1_c As Integer '標志位 Y1接通
Public flag_Y1_o As Integer
Public flag_Y2_c As Integer
Public flag_Y2_o As Integer
'''''''''''''''''''''''''''''''''''''
Dim receiveArr_shuzimokuai2() As Byte '下位機回傳數據
' CRC計算函數
Public Function CRC16(data() As Byte, crc() As Byte) As String
Dim CRC16Hi As Byte
Dim CRC16Lo As Byte
CRC16Hi = &HFF
CRC16Lo = &HFF
Dim i As Integer
Dim iIndex As Long
For i = 0 To 10 '不同情況下需修改數值,看具體回傳數據位數
iIndex = CRC16Lo Xor data(i)
CRC16Lo = CRC16Hi Xor GetCRCLo(iIndex)
CRC16Hi = GetCRCHi(iIndex)
Next i
crc(0) = CRC16Hi
crc(1) = CRC16Lo
End Function
'''''''''''''''''''''''''''''''''
'CRC低位字節值表
Public Function GetCRCLo(Ind As Long) As Byte
End Sub
'''''''''''''''''''''''''''''''''''''''
Private Sub Timer_lx_Timer()
lunxun_jishu = lunxun_jishu + 1 '計數正確,這樣1秒輪巡一次 最快
If lunxun_jishu = 1 Then
MSComm1.RThreshold = 13 '回傳數據13位,每13個字符到接收緩沖區引起觸發接收事件
Receiveover_shuzimokuai2 = False '先否定
MSComm1.OutBufferCount = 0 '清空輸出緩沖區
MSComm1.InBufferCount = 0 '清空輸入緩沖區
MSComm1.Output = sendshuzimokuai2 '發送 查詢作用
End If
If lunxun_jishu = 2 Then '分析數據
If (Receiveover_shuzimokuai2 = False) Then
txt_lunxun1 = "數字通訊失敗" '沒有收到回傳數據
End If
If (Receiveover_shuzimokuai2 = True) Then
txt_lunxun1 = "數字通訊正常"
End If
If flag_Y1_c = 1 Then '啟動按鈕按下
MSComm1.OutBufferCount = 0 '清空輸出緩沖區
MSComm1.Output = sendshuzimokuai2_Y1_c 'Y1接通
End If
If flag_Y2_c = 1 Then '停止按鈕按下
MSComm1.OutBufferCount = 0 '清空輸出緩沖區
MSComm1.Output = sendshuzimokuai2_Y2_c 'Y2接通
End If
End If
If lunxun_jishu = 3 Then
If flag_Y1_c = 1 Then
MSComm1.OutBufferCount = 0 '清空輸出緩沖區
MSComm1.Output = sendshuzimokuai2_Y1_o 'Y1斷開 相當于松開啟動按鈕,不能保持接通,因為接觸器會自鎖
flag_Y1_c = 0 '按鈕命令復位
End If
If flag_Y2_c = 1 Then
MSComm1.OutBufferCount = 0 '清空輸出緩沖區
MSComm1.Output = sendshuzimokuai2_Y2_o 'Y2斷開,常閉點閉合,為下一次啟動準備
flag_Y2_c = 0 '按鈕命令復位
End If
End If
If lunxun_jishu = 4 Then
lunxun_jishu = 0
End If
End Sub
''''''''''''''''''''''''''''''''''''''''
Private Sub hexReceive()
If (MSComm1.InBufferCount = 13) Then '數據回傳了
receiveArr_shuzimokuai2 = MSComm1.Input
Dim crcc(1) As Byte '用于CRC校驗
Dim jisuandedao(1) As Byte '計算得到
Dim ret As String
'如果計算得到的校驗碼與回傳的校驗碼一致,shape顏色改變
If (jisuandedao(0) = receiveArr_shuzimokuai2(11)) And (jisuandedao(1) = receiveArr_shuzimokuai2(12)) Then
Shape_yanzheng.FillColor = RGB(255, 123, 0)
End If
MSComm1.InBufferCount = 0 '清空輸入緩沖區
If receiveArr_shuzimokuai2(0) = &H2 Then '地址站號2
Receiveover_shuzimokuai2 = True
If (receiveArr_shuzimokuai2(4) = &H1) Then 'X1接通,代表接觸器吸合
Shape_run.FillColor = RGB(255, 0, 0) '運行小紅燈紅色,代表運行
Else
Shape_run.FillColor = RGB(255, 255, 255)
End If
End If
End If
End Sub
''''''''''''''''''''''''''''''''''''''''''
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent '
Case comEvReceive '接收事件 接收到?個字符,產生事件
Call hexReceive '去處理接收到的數據
Case comEvSend '發送事件 發送緩沖區空,發生事件 重要*,對應屬性
' Sendover = True '發送完畢