?? communication.bas
字號:
COMM_ReSendTimes = 0 '重傳次數復位
'若消息隊列中仍有消息,則發送消息
SED_ExtractRealData COMM_RcvData '取出數據
COMM_CheckResumeSend
'If COMM_IsMessageGroupEmpty = False Then COMM_CheckMessageAndPack
'COMM_isSendOverFlag = True
' COMM_CurCmd = NO_CMD
Put #1, , "FUN_comm_processrcvdata" & "ack_ok_updata_reset" & vbCr & vbLf
' Else '復位
' COMM_ReSendTimes = 0 '重傳次數復位
' SED_ExtractRealData COMM_RcvData '取出數據
' COMM_isSendOverFlag = True
'若消息隊列中仍有消息,則發送消息
' COMM_CheckResumeSend
'If COMM_IsMessageGroupEmpty = False Then COMM_CheckMessageAndPack
End If 'end of process of all cmd
Else ' CorrectFlag = ACK_FAIL Then '下位機接收不正確
'重發,3次
If COMM_ReSendTimes < 2 Then
Put #1, , "FUN_comm_processrcvdata" & "ack_fail_resend_times-" & COMM_ReSendTimes & vbCr & vbLf
COMM_ReSendTimes = COMM_ReSendTimes + 1 '起始值為0
COMM_StartSendData '繼續該命令的傳送
Else
Put #1, , "FUN_comm_processrcvdata" & "ack_fail_resend_times >2 and_reset" & vbCr & vbLf
' COMM_isSendOverFlag = True
COMM_ReSendTimes = 0 '重傳 次數復位
' COMM_CurCmd = NO_CMD '重傳,及命令復位
COMM_CurHisPackIndex = 0 '?????
'若消息隊列中仍有消息,則發送消息
COMM_CheckResumeSend
'If COMM_IsMessageGroupEmpty = False Then COMM_CheckMessageAndPack
End If
End If ' end of ack-ok
Else '校驗錯誤
Put #1, , "_FUN_comm_processrcvdata" & "crc_fail" & vbCr & vbLf
'重發包,3次
If COMM_ReSendTimes < 2 Then
COMM_StartSendData '繼續該命令的傳送
Put #1, , "FUN_comm_processrcvdata" & "crc_fail_resend_times-" & COMM_ReSendTimes & vbCr & vbLf
Else
' COMM_isSendOverFlag = True
COMM_ReSendTimes = 0
' COMM_CurCmd = NO_CMD ' 命令,及重發 復位
COMM_CurHisPackIndex = 0
'若消息隊列中仍有消息,則發送消息
COMM_CheckResumeSend
'If COMM_IsMessageGroupEmpty = False Then COMM_CheckMessageAndPack
Put #1, , "FUN_comm_processrcvdata" & "crc_fail_resend_times >2,and reset" & vbCr & vbLf
End If
COMM_ReSendTimes = COMM_ReSendTimes + 1 '起始值為0
End If
End Sub
Private Sub COMM_StartSendData()
zhandianpic_fashe '亮
Dim num As Double, I, K As Integer
'num = UBound(COMM_SendPacket)
Put #1, , "start_fun_comm_startsendData:-" & vbCr & vbLf
Put #1, , ConvertChar(COMM_SendPacket) & vbCr & vbLf
'COMM_isSendOverFlag = False
COMM_isACKFlag = False '下位機應答初始化為無
overtime_timer.interval = ACK_OVERTIME
overtime_timer.Enabled = True
If COMM_SendMSCOMM.PortOpen = True Then COMM_SendMSCOMM.Output = COMM_SendPacket '發送數據
'Do
' K = DoEvents()
' Loop Until COMM_SendMSCOMM.OutBufferCount = 0
'Put #1, , COMM_SendPacket
End Sub
Public Sub COMM_Overtime_timer_timer()
Put #1, , "start_fun_overtime_timer_timer" & vbCr & vbLf
Put #1, , "start_fun_overtime_timer_timer-comm_isackflag:--" & COMM_isACKFlag & vbCr & vbLf
If COMM_isACKFlag = False Then
Dim tmp As Variant
ReDim COMM_RcvData(0) '清空接收緩沖區
tmp = COMM_RcVMSCOMM.InputLen
COMM_RcVMSCOMM.InBufferCount = 0 '清空串口接收緩沖區
RcvDataByteIndex = 0 '接收的字節數復位
If COMM_ReSendTimes < 2 Then
COMM_ReSendTimes = COMM_ReSendTimes + 1
COMM_StartSendData
Put #1, , "start_fun_overtime_timer_timer-resend:--" & COMM_ReSendTimes & vbCr & vbLf
Else
Put #1, , "start_fun_overtime_timer_timer-over" & vbCr & vbLf
'If COMM_IsMessageGroupEmpty = False Then COMM_CheckMessageAndPack
' COMM_isSendOverFlag = True '復位發送完標志
COMM_ReSendTimes = 0
overtime_timer.Enabled = False
COMM_CurHisPackIndex = 0 '歷史包索引復位
'若消息隊列中仍有消息,則發送消息
COMM_CheckResumeSend
End If
Else
End If
End Sub
Public Sub COMM_End()
Put #1, , "start_fun_comm_end" & vbCr & vbLf
If COMM_RcVMSCOMM.PortOpen = True Then COMM_RcVMSCOMM.PortOpen = False
If COMM_SendMSCOMM.PortOpen = True Then COMM_SendMSCOMM.PortOpen = False
End Sub
Public Function ConvertChar(dat() As Byte) As String
Dim I As Integer, str As String
str = " "
For I = 0 To UBound(dat)
str = str & (Hex(dat(I)))
Next I
ConvertChar = str
End Function
Private Sub sleep(I As Double, waitFlag As Boolean)
Dim K As Double, t As Double, R As Double, fir As Double
t = 0
For fir = 0 To I Step 1
For K = 0 To I Step 1
If waitFlag = True Then Exit Sub
t = t + 1
DoEvents
Next K
t = 0
Next fir
End Sub
'Public Sub checkSendAvilabeFlag_timer()
'End Sub
Public Sub COMM_CheckResumeSend()
Dim flag As Boolean, I As Integer
Dim count As Integer
count = UBound(COMM_CMDGroup)
If count <> 0 Then '有消息
If COMM_CMDGroup(1).BeenUsedFlag = True Then
'若命令已經用過,則從消息隊列中刪去
For I = 1 To count - 1
COMM_CMDGroup(I) = COMM_CMDGroup(I + 1)
Next I
ReDim Preserve COMM_CMDGroup(count - 1)
End If
End If
count = UBound(COMM_CMDGroup)
'flag = COMM_IsMessageGroupEmpty
If count > 0 Then
COMM_CheckMessageAndPack
Else
MainForm1.CheckUI_IOKey.Caption = "檢測"
COMM_TerminateSendByForce = False
MainForm1.CheckUI_IOKey.Enabled = True
MainForm1.Enable_CheckMethod
MainForm1.cmdPic = " " '圖片中發送命令標志空
' MainForm1.selectstioCombo.Text = 1
' MainForm1.DisplayStioName.Text = StioName(1)
End If
End Sub
Public Sub COMM_AddCMd(cmd As Byte, station As Integer)
Dim count As Integer '添加消息隊列
Dim I As Integer
count = UBound(COMM_CMDGroup)
ReDim Preserve COMM_CMDGroup(count + 1)
COMM_CMDGroup(count + 1).cmd = cmd
COMM_CMDGroup(count + 1).station = station
COMM_CMDGroup(count + 1).BeenUsedFlag = False
'若當前無命令發送,則發送新命令
count = UBound(COMM_CMDGroup)
Put #1, , "FUN_comm_addcmd: cmd: " & Hex(cmd) & " and station:= " & station & vbCr & vbLf
If count > 1 Then
For I = 1 To count
Put #1, , "FUN_comm_addcmd:per cmd: " & Hex(COMM_CMDGroup(I).cmd) & " and station:= " & COMM_CMDGroup(I).station & "--Boolean:=" & COMM_CMDGroup(I).BeenUsedFlag & "---" & I & vbCr & vbLf
Next I
End If
If COMM_CMDGroup(1).BeenUsedFlag = False Then COMM_CheckMessageAndPack
End Sub
Private Sub COMM_CheckMessageAndPack() 'outPackData() As Byte)
Dim count As Integer, cmd As Byte, station As Integer, dat() As Byte
Dim I, J As Integer
count = UBound(COMM_CMDGroup)
'If count <> 0 Then '有消息
' If COMM_CMDGroup(1).BeenUsedFlag = True Then
'若命令已經用過,則從消息隊列中刪去
' For I = 1 To count - 1
' COMM_CMDGroup(I) = COMM_CMDGroup(I + 1)
' Next I
' ReDim Preserve COMM_CMDGroup(count - 1)
' End If
'End If
' count = UBound(COMM_CMDGroup)
If count <> 0 And COMM_CMDGroup(1).BeenUsedFlag = False Then '有消息
cmd = COMM_CMDGroup(1).cmd: station = COMM_CMDGroup(1).station
COMM_CMDGroup(1).BeenUsedFlag = True
Dim cmdstr As String
Static num As Integer
Select Case cmd
Case UP_UI: cmdstr = "采集電壓電流,狀態信息": num = 0
Case UP_TIME: cmdstr = "上傳時間": num = 0
Case UP_HISRECORD: cmdstr = "上傳歷史記錄": num = 0
Case DOWN_STDTIME: cmdstr = "下傳標準時間"
If num = 0 Then SED_SetPCSysTime '設置系統時間
num = num + 1
Case DOWN_IO: cmdstr = "控制開關燈": num = 0
Case DOWN_OCTIME: cmdstr = "下傳開關燈時間": num = 0
End Select
'///////////
'站點,圖片顯示
'發送CAN 總線命令時,地址為10號機
If station > 0 And station <= StioNum Then
MainForm1.selectstioCombo.Text = station
MainForm1.DisplayStioName.Text = StioName(station)
'站點畫面更新
' If MainForm1.selectcheckmode(0).Value = False Then
MainForm1.stationPic.Caption = StioName(station)
MainForm1.cmdPic.Caption = cmdstr
module2_ChangeStationPic station
'endif
ElseIf station = 50 Then 'CAN地址 50號端口
MainForm1.selectstioCombo.Text = 1
MainForm1.DisplayStioName.Text = StioName(1)
module2_ChangeStationPic 1
MainForm1.stationPic.Caption = StioName(1)
MainForm1.cmdPic.Caption = "修改波特率 "
End If
'/'''''''''''
Put #1, , "FUN_comm_checkmessageandpack: cmd: " & Hex(cmd) & " and station:= " & station & vbCr & vbLf
SED_GetDataFromDataBase station, cmd, dat
COMM_CurDestADDR = COMM_MachineADDR(station - 1)
COMM_PacketData cmd, COMM_CurDestADDR, dat, COMM_SendPacket
COMM_StartSendData
End If
End Sub
Public Sub COMM_DelCMD(cmd As Byte, station As Integer)
'刪除命令,從而中斷發送
Dim count, K As Integer, Pos As Integer
Pos = 0
count = UBound(COMM_CMDGroup)
For K = 1 To count
If COMM_CMDGroup(K).cmd = cmd And COMM_CMDGroup(K).station = station Then Pos = K: Exit For
Next K
If Pos <> 0 Then
Put #1, , "FUN_comm_delcmd: cmd: " & Hex(cmd) & " and station:= " & station & vbCr & vbLf
For K = Pos To count - 1
COMM_CMDGroup(K) = COMM_CMDGroup(K + 1)
Next K
ReDim Preserve COMM_CMDGroup(count - 1)
End If
End Sub
Public Function COMM_IsMessageGroupEmpty() As Boolean
Dim count As Integer
count = UBound(COMM_CMDGroup)
If count = 0 Then
COMM_IsMessageGroupEmpty = True
'ElseIf count = 1 And COMM_CMDGroup(1).BeenUsedFlag = True Then
' ReDim Preserve COMM_CMDGroup(0)
' COMM_IsMessageGroupEmpty = True
Else
COMM_IsMessageGroupEmpty = False
End If
End Function
Public Sub COMM_GetCurProcessCMd(out_cmd As Integer, out_station As Integer)
Dim count As Integer
count = UBound(COMM_CMDGroup)
If count = 0 Then
out_cmd = 0: out_station = 0
Else
out_cmd = COMM_CMDGroup(1).cmd: out_station = COMM_CMDGroup(1).station
End If
End Sub
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -