VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 221|回复: 5

[求助] 监控界面开始记录数据后,实时数据会出现卡顿现象

[复制链接]
发表于 2018-9-10 10:39:42 | 显示全部楼层 |阅读模式
       这是我写的代码,在不记录数据时界面实时数据都正常,一但开始记录数据就会出现卡顿现象,运行3分钟左右就会卡顿一下。
之前数据记录是放到另一个时间控件中的,与数据解析是分开的但也存在同样的问题。考虑到有可能是CAN卡的寄存器存满后会导致数据实时性变差,
又对寄存器定时清空,但问题还是没有解决。不记录数据时界面数据的实时显示都正常。请大家看一下程序给点建议,我自己没有什么思路了。

Private Sub Timer1_OnTimer1()
   
    '---高压系统数据接收---
   
    Dim ErrInfo As VCI_ERR_INFO
    Dim can_data_id As Long
    Dim length As Long
    Dim frameinfo(99) As VCI_CAN_OBJ
    Dim frame_sum As Long
   
    m_cannum = 0
    length = VCI_Receive(m_devtype, m_devind, m_cannum, frameinfo(0), 100, 10)
   
    If length <= 0 Then
   
        VCI_ReadErrInfo m_devtype, m_devind, m_cannum, ErrInfo      '注意:如果没有读取到数据则调用此函数显示当前的错误码
        Timer1.Enabled1 = True
        Exit Sub
   
    End If
   
    For i = 0 To length - 1         '报文ID和数据分配
   
        can_data_id = frameinfo(i).ID
        
            If frameinfo(i).RemoteFlag = 0 Then
            
                If frameinfo(i).DataLen > 8 Then
                    frameinfo(i).DataLen = 8
                End If
            
                For j = 0 To frameinfo(i).DataLen - 1
                    can_rdata(j) = frameinfo(i).data(j)
                Next
                '----电机参数----
                If can_data_id = tm_r_id1 Then
                    For j = 0 To 7
                        can_tm_rdata1(j) = can_rdata(j)
                    Next
                End If
            
                If can_data_id = tm_r_id2 Then
                    For j = 0 To 7
                        can_tm_rdata2(j) = can_rdata(j)
                    Next
                End If
               
                If can_data_id = isg_r_id1 Then
                    For j = 0 To 7
                        can_isg_rdata1(j) = can_rdata(j)
                    Next
                End If
            
                If can_data_id = isg_r_id2 Then
                    For j = 0 To 7
                        can_isg_rdata2(j) = can_rdata(j)
                    Next
                End If
               
                If can_data_id = hcu_mcu_cmd_id Then
                    For j = 0 To 7
                        can_hcu_mcu_tdata(j) = can_rdata(j)
                    Next
                End If
                '----电机参数----
               
                '----整车控制器参数----
                 
                If can_data_id = hcu_id Then
                    For j = 0 To 7
                        can_hcu_tdata(j) = can_rdata(j)
                    Next
                End If
               
                '----整车状态参数----
               
                '----电池参数----
                If can_data_id = bms_hcu1_id Then
                    For j = 0 To 7
                        can_battery_volt_rdata(j) = can_rdata(j)
                    Next
                End If
               
                If can_data_id = bms_hcu2_id Then
                    For j = 0 To 7
                        can_battery_state_rdata(j) = can_rdata(j)
                    Next
                End If
               
                If can_data_id = bms_hcu3_id Then
                    For j = 0 To 7
                        can_battery_cur_rdata(j) = can_rdata(j)
                    Next
                End If
               
                If can_data_id = hcu_bms_id Then
                    For j = 0 To 7
                        can_bms_shangdian_rdata(j) = can_rdata(j)
                    Next
                End If
               
                '----电池参数----
               
            End If
    Next
   
    '---高压系统数据接收---
   
    frame_sum = VCI_GetReceiveNum(m_devtype, m_devind, m_cannum)
   
    If frame_sum >= 100 Then
   
        m_devind = 0
        VCI_ClearBuffer m_devtype, m_devind, m_cannum
        
    End If
   
    m_cannum = 1
    length = VCI_Receive(m_devtype, m_devind, m_cannum, frameinfo(0), 100, 10)     '接收函数帧数组长度调整为100
   
    If length <= 0 Then
        
        VCI_ReadErrInfo m_devtype, m_devind, m_cannum, ErrInfo      '注意:如果没有读取到数据则调用此函数显示当前的错误码
        Timer1.Enabled2 = True
        Exit Sub
        
    End If
                                                            
    For i = 0 To length - 1         '报文ID和数据分配
   
        can_data_id = frameinfo(i).ID
        
            If frameinfo(i).RemoteFlag = 0 Then
            
                If frameinfo(i).DataLen > 8 Then
                    frameinfo(i).DataLen = 8
                End If
                    
                For j = 0 To frameinfo(i).DataLen - 1
                    can_rdata1(j) = frameinfo(i).data(j)
                Next
                    
                If can_data_id = hcu_eng_request_id Then
                    For j = 0 To 7
                        can_hcu_eng_tdata(j) = can_rdata1(j)
                    Next
                End If
                    
                If can_data_id = eng_act_speed_id1 Then
                    For j = 0 To 7
                        can_eng_yunxing_rdata(j) = can_rdata1(j)
                    Next
                End If
                    
                If can_data_id = eng_temp_id1 Then
                    For j = 0 To 7
                        can_eng_zhuangtai_rdata(j) = can_rdata1(j)
                    Next
                End If
                    
                If can_data_id = eng_youhao_id Then
                    For j = 0 To 7
                        can_eng_youhao_rdata(j) = can_rdata1(j)
                    Next
                End If
                        
            End If
    Next
   
    frame_sum = VCI_GetReceiveNum(m_devtype, m_devind, m_cannum)
   
    If frame_sum >= 100 Then
   
        m_devind = 0
        VCI_ClearBuffer m_devtype, m_devind, m_cannum
        
    End If
   
     '---发电机参数解析---
   
    ISG_enable_cmd = CLng(can_hcu_mcu_tdata(0)) And &H1
    isg_set_trq1 = (CLng(can_hcu_mcu_tdata(2)) * 256 + can_hcu_mcu_tdata(1)) * 0.1 - 1000
    isg_spd1 = CLng(can_isg_rdata1(1) * 256 + can_isg_rdata1(0)) - 15000
    isg_trq1 = (CLng(can_isg_rdata1(3) * 256 + can_isg_rdata1(2))) * 0.1 - 1000
    isg_cur1 = (CLng(can_isg_rdata1(5) * 256 + can_isg_rdata1(4))) * 0.1 - 500
    isg_volt1 = (CLng(can_isg_rdata1(7) * 256 + can_isg_rdata1(6))) * 0.1 - 1000
    isg_temp1 = CLng(can_isg_rdata2(2)) - 40
    isg_control_temp1 = CLng(can_isg_rdata2(3)) - 40
    isg_fault1 = CLng(can_isg_rdata2(7)) * 256 + can_isg_rdata2(6)
   
   
    ISG_set_trq(0).Value = isg_set_trq1
    ISG_trq(0).Value = isg_trq1
    ISG_spd(0).Value = isg_spd1
    ISG_volt(0).Position = isg_volt1
    ISG_volt_1(0).Value = isg_volt1
    ISG_cur(1).Position = isg_cur1
    ISG_cur_1(0).Value = isg_cur1
    ISG_MCU_temp(1).Position = isg_control_temp1
    ISG_MCU_temp_1(0).Value = isg_control_temp1
    ISG_temp(0).Position = isg_temp1
    ISG_temp_1(0).Value = isg_temp1
    isg_fault_code(0).Value = isg_fault1
   
    If ISG_enable_cmd = &H1 Then
        ISG_enable(0).Active = True
    Else
        ISG_enable(0).Active = False
    End If
   
    '---发电机参数解析---
   
   
    '---驱动电机参数解析---
   
    TM_enable_cmd = CLng(can_hcu_mcu_tdata(4)) And &H1
    tm_set_trq1 = (CLng(can_hcu_mcu_tdata(6)) * 256 + can_hcu_mcu_tdata(5)) * 0.1 - 1000
    tm_spd1 = CLng(can_tm_rdata1(1)) * 256 + can_tm_rdata1(0) - 15000
    tm_trq1 = (CLng(can_tm_rdata1(3)) * 256 + can_tm_rdata1(2)) * 0.1 - 1000
    tm_cur1 = (CLng(can_tm_rdata1(5)) * 256 + can_tm_rdata1(4)) * 0.1 - 500
    tm_volt1 = (CLng(can_tm_rdata1(7)) * 256 + can_tm_rdata1(6)) * 0.1 - 1000
    tm_temp1 = CLng(can_tm_rdata2(2)) - 40
    tm_control_temp1 = CLng(can_tm_rdata2(3)) - 40
    tm_fault1 = CLng(can_tm_rdata2(7)) * 256 + can_tm_rdata2(6)
   
   
    TM_volt(1).Position = tm_volt1
    TM_volt_1(1).Value = tm_volt1
    TM_cur(0).Position = tm_cur1
    TM_cur_1(1).Value = tm_cur1
    TM_MCU_temp(0).Position = tm_control_temp1
    TM_MCU_temp_1(1).Value = tm_control_temp1
    TM_temp(1).Position = tm_temp1
    TM_temp_1(1).Value = tm_temp1
    TM_set_trq(1).Value = tm_set_trq1
    TM_trq(1).Value = tm_trq1
    TM_spd(1).Value = tm_spd1
    tm_fault_code(1).Value = tm_fault1
   
    If TM_enable_cmd = &H1 Then
        TM_enable(1).Active = True
    Else
        TM_enable(1).Active = False
    End If
   
    '---驱动电机参数解析---
   
   
    '---BMS参数解析---
   
    battery_soc = CLng(can_battery_volt_rdata(0)) * 0.4
    battery_volt1 = (CLng(can_battery_volt_rdata(4)) * 256 + can_battery_volt_rdata(3)) * 0.01
    battery_cur1 = (CLng(can_battery_volt_rdata(2)) * 256 + can_battery_volt_rdata(1)) * 0.01 - 300
    battery_temp1 = CLng(can_battery_volt_rdata(5)) - 40
    battery_state = CLng(can_battery_volt_rdata(7)) \ 16
    hcu_bms_request = CLng(can_battery_volt_rdata(6))
    battery_cell_max_volt = (CLng(can_battery_state_rdata(1)) * 256 + can_battery_state_rdata(0)) * 0.001
    battery_cell_min_volt = (CLng(can_battery_state_rdata(3)) * 256 + can_battery_state_rdata(2)) * 0.001
    battery_cell_max_temp = CLng(can_battery_state_rdata(4)) - 40
    battery_cell_min_temp = CLng(can_battery_state_rdata(5)) - 40
    battery_jueyuan = CLng(can_battery_state_rdata(6)) * 40
    battery_charge_power = (CLng(can_battery_cur_rdata(1)) * 256 + can_battery_cur_rdata(0)) * 0.004
    battery_discharge_power = (CLng(can_battery_cur_rdata(3)) * 256 + can_battery_cur_rdata(2)) * 0.004
    battery_fault_code1 = CLng(can_battery_cur_rdata(4))
    battery_fault_code2 = CLng(can_battery_cur_rdata(5))
    battery_fault_code3 = CLng(can_battery_cur_rdata(6))
    battery_fault_code4 = CLng(can_battery_cur_rdata(7))
    battery_fault_level = CLng(can_battery_volt_rdata(6)) \ 64
   
   
    SOC.Position = battery_soc
    SOC_1.Value = battery_soc
    BAT_volt.Position = battery_volt1
    BAT_volt_1.Value = battery_volt1
    BAT_cur.Position = battery_cur1
    BAT_cur_1.Value = battery_cur1
    BAT_cell_volt_max.Value = battery_cell_max_volt
    BAT_cell_volt_min.Value = battery_cell_min_volt
    BAT_temp.Value = battery_temp1
    BAT_cell_temp_max.Value = battery_cell_max_temp
    BAT_cell_temp_min.Value = battery_cell_min_temp
    BAT_ins.Value = battery_jueyuan
    BAT_chg_max.Value = battery_charge_power
    BAT_dischg_max.Value = battery_discharge_power
    BAT_fault_level.Value = battery_fault_level
   
   
    If (hcu_bms_request And 1) = 1 Then
        shangdian_cmd.Active = True
    ElseIf (hcu_bms_request And 2) = 2 Then
        shangdian_cmd.Active = False
    Else
        shangdian_cmd.Active = False
    End If
   
    If battery_state = 0 Then
        BAT_system_run.Active = False
    ElseIf battery_state = 5 Then
        BAT_system_run.Active = True
    Else
        BAT_system_run.Active = False
    End If
   
    If battery_state = 3 Then
        BAT_precharge.Active = True
    Else
        BAT_precharge.Active = False
    End If
   
    '----电池故障----
   
    If battery_fault_level = 1 Then
        BAT_system_fault.Active = True
        BAT_system_fault.ActiveColor = vbYellow
    ElseIf battery_fault_level = 2 Then
        BAT_system_fault.Active = True
        BAT_system_fault.ActiveColor = vbRed
    Else
        BAT_system_fault.Active = False
        BAT_system_fault.ActiveColor = vbGreen
    End If
   
    If battery_fault_code1 = 1 Or battery_fault_code1 = 3 Then
        bat_cell_gaoya.Active = True
    Else
        bat_cell_gaoya.Active = False
    End If
                    
    If battery_fault_code1 = 4 Or battery_fault_code1 = 12 Then
        bat_cell_diya.Active = True
    Else
        bat_cell_diya.Active = False
    End If
            
    If battery_fault_code1 = 16 Or battery_fault_code1 = 48 Then
        bat_system_gaowen.Active = True
    Else
        bat_system_gaowen.Active = False
    End If
            
    If battery_fault_code1 = 64 Or battery_fault_code1 = 192 Then
        bat_system_diwen.Active = True
    Else
        bat_system_diwen.Active = False
    End If
              
    If battery_fault_code2 = 1 Or battery_fault_code2 = 3 Then
        bat_system_wencha.Active = True
    Else
        bat_system_wencha.Active = False
    End If
            
    If battery_fault_code2 = 4 Or battery_fault_code2 = 12 Then
        bat_system_yacha.Active = True
    Else
        bat_system_yacha.Active = False
    End If
            
    If battery_fault_code2 = 16 Or battery_fault_code2 = 48 Then
        bat_soc_guodi.Active = True
    Else
        bat_soc_guodi.Active = False
    End If
            
    If battery_fault_code2 = 64 Or battery_fault_code2 = 192 Then
        bat_soc_guogao.Active = True
    Else
        bat_soc_guogao.Active = False
    End If
                  
    If battery_fault_code3 = 1 Or battery_fault_code3 = 3 Then
        bat_dischg.Active = True
    Else
        bat_dischg.Active = False
    End If
            
    If battery_fault_code3 = 4 Or battery_fault_code3 = 12 Then
        bat_chg.Active = True
    Else
        bat_chg.Active = False
    End If
                  
    If battery_fault_code3 = 16 Or battery_fault_code3 = 48 Then
        bat_sum_volt_gao.Active = True
    Else
        bat_sum_volt_gao.Active = False
    End If
                  
    If battery_fault_code3 = 64 Or battery_fault_code3 = 192 Then
        bat_sum_volt_di.Active = True
    Else
        bat_sum_volt_di.Active = False
    End If
            
    If battery_fault_code4 = 1 Or battery_fault_code4 = 3 Then
        bat_ins_di.Active = True
    Else
        bat_ins_di.Active = False
    End If
            
    If battery_fault_code4 = 4 Or battery_fault_code4 = 12 Then
        bat_system_can_fault.Active = True
    Else
        bat_system_can_fault.Active = False
    End If
   
    '----电池故障----
   
    '---BMS参数解析---
   
    '---整车参数解析---
   
    hcu_ig = CLng(can_hcu_tdata(0))
    hcu_gear = CLng(can_hcu_tdata(1))
    hcu_acc = CLng(can_hcu_tdata(2))
    hcu_brake = CLng(can_hcu_tdata(7))
    hcu_qita_sw = CInt(can_hcu_tdata(5))
    eng_dianhuo = CInt(can_hcu_tdata(6)) And 2
   
    If hcu_ig = 0 Then
        ignition_sw.Position = 0         
        vehicle_state.Active = False
        ready.Caption = "READY"
    End If
   
    If hcu_ig = 1 Then
        ignition_sw.Position = 1      
        vehicle_state.Active = False
        ready.Caption = "READY"
    End If
   
    If hcu_ig = 2 Then
        ignition_sw.Position = 2        
    End If
      
    If hcu_ig = 3 Then
        ignition_sw.Position = 3         
    End If
   
    If (hcu_ig = 2) And (ISG_enable_cmd = 0) Then
        vehicle_state.Active = True
    Else
        vehicle_state.Active = False
    End If
   
    If (hcu_ig = 2) And (ISG_enable_cmd = 1) Then
        vehicle_state1.Active = True
    Else
        vehicle_state1.Active = False
    End If
   
    If hcu_gear = 1 Or hcu_gear = &H81 Then
        P.Active = True                 
    Else
        P.Active = False
    End If
   
    If hcu_gear = 2 Or hcu_gear = &H82 Then
        R.Active = True                 
    Else
        R.Active = False
    End If
        
    If hcu_gear = 3 Or hcu_gear = &H83 Then
        N.Active = True                  
    Else
        N.Active = False
    End If
   
    If hcu_gear = 4 Or hcu_gear = &H84 Then
        D.Active = True                 
    Else
        D.Active = False
    End If
   
    If (hcu_gear And &H80) = &H80 Then
        EV.Active = True               
    Else
        EV.Active = False
    End If
   
   
    If (hcu_qita_sw And 1) = 1 Then
        jianxiu_sw.Active = True
    Else
        jianxiu_sw.Active = False
    End If
   
    If (hcu_qita_sw And 2) = 2 Then
        houcangmen_sw.Active = True
    Else
        houcangmen_sw.Active = False
    End If
   
    If (hcu_qita_sw And 4) = 4 Then
        jianxiu_start_sw.Active = True
    Else
        jianxiu_start_sw.Active = False
    End If
   
    If (hcu_qita_sw And 8) = 8 Then
        jianxiu_stop_sw.Active = True
    Else
        jianxiu_stop_sw.Active = False
    End If
   
    If (hcu_qita_sw And 16) = 16 Then
        AC_sw.Active = True
    Else
        AC_sw.Active = False
    End If
   
    If (hcu_qita_sw And 32) = 32 Then
        ganzaoqi_sw.Active = True
    Else
        ganzaoqi_sw.Active = False
    End If
   
    If (hcu_qita_sw And 64) = 64 Then
        shoudong_start_sw.Active = True
    Else
        shoudong_start_sw.Active = False
    End If
   
    If eng_dianhuo = 2 Then
        eng_dianhuojidianqi_signal.Active = True
    Else
        eng_dianhuojidianqi_signal.Active = False
    End If
   
    acc.Position = hcu_acc
    acc1.Value = hcu_acc
    brake.Position = hcu_brake
    brake1.Value = hcu_brake
   
   
    '---整车参数解析---
   
   
    '---发动机参数解析---
         
    hcu_eng_speed_request = (CLng(can_hcu_eng_tdata(2)) * 256 + can_hcu_eng_tdata(1)) * 0.125
    eng_act_speed = (CLng(can_eng_yunxing_rdata(4)) * 256 + can_eng_yunxing_rdata(3)) * 0.125
    eng_trq_percent1 = CLng(can_eng_yunxing_rdata(2)) - 125
    eng_temp1 = CLng(can_eng_zhuangtai_rdata(0)) - 40
   
    eng_act_spd.Position = eng_act_speed
    eng_act_spd_1.Value = eng_act_speed
    eng_aim_spd.Value = hcu_eng_speed_request
    eng_temp.Position = eng_temp1
    eng_temp_1.Value = eng_temp1
    eng_trq_percent.Value = eng_trq_percent1
   
    '----发动机计算转速----
   
    eng_count_spd.Value = (isg_spd1 + 2.1 / 3.1 * tm_spd1) / 3.1
   
    '----发动机计算转速----
        
    If eng_act_speed > 500 And eng_act_speed < 8000 Then
        eng_run_signal.Active = True
    Else
        eng_run_signal.Active = False
    End If
   
    '---发动机参数解析---
   
    '--获取系统时间--
   
    GetSystemTime t
    t1 = Format(Time, "hh:mm:ss") & "." & Format(t.wMilliseconds, "000")
   
    '--获取系统时间--
   
    '---数据保存---
   
    If save_flag = 1 Then
      
        Dim outstring$
        Dim FSdata1 As New FileSystemObject
        Dim dataFile1  As TextStream
        
            
            
        outstring = spaceone & hcu_acc & spacetwo & hcu_brake & spacetwo & hcu_ig & spacetwo & hcu_gear & _
                    spacetwo & spacetwo & isg_spd1 & spacetwo & isg_trq1 & spacetwo & isg_cur1 & spacetwo & isg_volt1 & spacetwo & isg_temp1 & spacetwo & isg_control_temp1 & spacetwo & isg_fault1 & spacetwo & isg_set_trq1 & _
                    spacetwo & spacetwo & tm_spd1 & spacetwo & tm_trq1 & spacetwo & tm_cur1 & spacetwo & tm_volt1 & spacetwo & tm_temp1 & spacetwo & tm_control_temp1 & spacetwo & tm_fault1 & spacetwo & tm_set_trq1 & _
                    spacetwo & spacetwo & battery_volt1 & spacetwo & battery_cur1 & spacetwo & battery_soc & spacetwo & battery_jueyuan & spacetwo & battery_cell_max_volt & spacetwo & battery_cell_min_volt & spacetwo & battery_temp1 & spacetwo & battery_cell_max_temp & spacetwo & battery_cell_min_temp & spacetwo & battery_charge_power & spacetwo & battery_discharge_power & spacetwo & battery_state & spacetwo & hcu_bms_request & spacetwo & battery_fault_level & spacetwo & battery_fault_code1 & spacetwo & battery_fault_code2 & spacetwo & battery_fault_code3 & spacetwo & battery_fault_code4 & _
                    spacetwo & spacetwo & hcu_eng_speed_request & spacetwo & eng_act_speed & spacetwo & eng_trq_percent1 & spacetwo & eng_dianhuo & spacetwo & spacetwo & t1 & spacetwo & vbCrLf
                          
        Set dataFile1 = FSdata1.OpenTextFile(App.Path + "\datasave\" + dataFileName, ForAppending) '每次换行并写入文件末尾
        dataFile1.Write outstring
        dataFile1.Close: Set objFile = Nothing
        
    End If
            
    '---数据保存---
   
    Timer1.Enabled1 = True
   
End Sub
 楼主| 发表于 2018-9-10 10:43:54 | 显示全部楼层
问题如果能够解决,我会给大家共享我的工业控件,可以记VB编写的界面更美观更好用。
回复 支持 反对

使用道具 举报

发表于 2018-9-10 15:59:49 | 显示全部楼层
IO的速度跟不上吧,保存数据操作之后有延迟正常的。
数据可以通过消息队列或者共享内存缓存,然后由另外一个程序来进行保存操作。
如果能多线程的话一个进程内也是可以完成的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-10 16:05:31 | 显示全部楼层
JuncoJet 发表于 2018-9-10 15:59
IO的速度跟不上吧,保存数据操作之后有延迟正常的。
数据可以通过消息队列或者共享内存缓存,然后由另外一 ...


你好,我学习VB时间不长,有些问题解决不了,讲问多线程怎么用,可以给个例程让我学习一下吗?谢谢

点评

如果不放弃VB的话,那就采用多进程的多任务方法。VB和C/C++程序通讯,可以采用消息队列或者共享内存  发表于 2018-9-12 12:14
VB目前没有稳定方便的多线程,如果需要多线程转C/C++开发  发表于 2018-9-12 12:11
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2018-9-22 04:05

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表