Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '*****************************************************
- '* PLX-DAQ Data Acquisition for Excel *
- '* Copyright 2007, Parallax Inc. *
- '* PLX-DAQ is a trademark of Parallax, Inc. *
- '* www.parallax.com *
- '*****************************************************
- '* Programmed by: Martin Hebel January, 2007 *
- '* martin@selmaware.com *
- '*****************************************************
- '* Modified distribution of this macro is *
- '* not permitted. Use of the SelmaDAQ Active-X *
- '* control for other uses requires permission of *
- '* SelmaWare Solutions - www.selmaware.com *
- '*****************************************************
- '* Declaracao das variaveis globais *
- Dim Row
- Dim FlagConnect As Boolean
- Dim TimeStart
- Dim TimeLast
- Dim TimeAdd
- '* TODO: Identificar essa variavel cc global
- Dim cc
- '* cbo e a abreviacao de combo, ou combo box, sao as caixas que vc abre e selciona os dados *
- '* funcao responsavel por selecionar o Baud Rate, antes de mudar ela disconecta o objeto Stamp *
- '* muda o texto do botao na interface para Connect, indicando que esta disconnectado *
- '* seta a flag de conexão global como false
- '* seta o novo baudrate no objeto Stamp
- Private Sub cboBAUD_Change()
- Stamp.Disconnect
- cmdConnect.Caption = "Connect"
- FlagConnect = False
- Stamp.Baud = cboBAUD
- End Sub
- '* combo box de selecao de porta
- '* funcao responsavel por selecionar a porta de conexão, antes de mudar, ela disconecta o objeto Stamp *
- '* muda o texto do botao na interface para Connect, indicando que esta disconnectado *
- '* seta a flag de conexão global como false
- '* seta a porta no objeto Stamp
- Private Sub cboPort_Click()
- Stamp.Disconnect
- cmdConnect.Caption = "Connect"
- FlagConnect = False
- Stamp.Port = cboPort
- End Sub
- '* emite som ao clicar no botao de reset do timer *
- Private Sub chkReset_Click()
- Beep
- End Sub
- '* emite som ao clicar no botao user1 na interface *
- Private Sub ChkUser1_Click()
- Beep
- End Sub
- '* emite som ao clicar no botao user2 na interface *
- Private Sub ChkUser2_Click()
- Beep
- End Sub
- '* emite som ao clicar no botao de limpar os dados da coluna *
- Private Sub cmdClear_Click()
- Beep
- Call clearSheet
- End Sub
- '* funcao que e chamada quando o usuario clica no botao de connectar *
- Private Sub cmdConnect_Click()
- '* se nao esta connectado entao: *
- If FlagConnect = False Then
- '* esse comando funciona como um try catch de erros, ele vai tentar fazer os passos abaixo *
- '* caso um desses passos emita um erro o programa pula para o label ConnectErr abaixo *
- '* e exibe a janela de erro com o caso mais provavel (verificar a porta de conexao) *
- On Error GoTo ConnectErr
- '* Stamp e o objeto principal do programa ele que efetua a conexao com a porta de fato bem como o envio e recebimento de dados *
- '* ele e baseado no Objeto SerialPort do .NET da Microsoft
- '* https://msdn.microsoft.com/pt-br/library/system.io.ports.serialport.dtrenable(v=vs.110).aspx
- '* DTRE stands for: Data Terminal Ready, faz parte do padrao de comunicacao "handshake" *
- Stamp.DTREnabled = CBool(chkDTR)
- '* Conecta, disconecta e conecta novamente, provavelmente buscando por erros uma vez que isso esta dentro do ON ERROR *
- Stamp.Connect
- Stamp.Disconnect
- Stamp.Connect
- '* Muda o texto do botao para Disconnect indicando que esse botao principal muda de estado de acordo com o estado da aplicacao *
- cmdConnect.Caption = "Disconnect"
- '* Seta a flag global de conexao *
- FlagConnect = True
- '* Escreve no campo da interface informando que esta disconectado *
- txtStatus2 = "Connected"
- '* As duas chamadas abaixo fazem com que o excel lembre as ultimas configuracoes de Baud e Porta que foram utilizadas *
- Call SaveSetting("plx-daq", "app", "port", cboPort.Text)
- Call SaveSetting("plx-daq", "app", "baud", cboBAUD.Text)
- Else
- '* Caso o dispositivo ja esteja conectado e o usuario clicou no botao (que nesse caso esta escrito disconnect) *
- '* O programa inicia o processo de desconectar e voltar a interface para o estado de espera por uma nova conexao *
- '* Chama a rotina Disconnect do objeto Stamp *
- Stamp.Disconnect
- '* Muda o texto do botao para Connect, indicando que ao clicar o usuario sera conectado a porta serial *
- cmdConnect.Caption = "Connect"
- '* Seta a flag global de conexao para false *
- FlagConnect = False
- '* Escreve no display Disconnected informando o estado atual da aplicacao *
- txtStatus2 = "Disconnected"
- End If
- Exit Sub
- '* Chamada caso aconteca algum erro durante o processo de conectar *
- ConnectErr:
- '* Chama a janela de erro do excell pedindo pra pessoa verificar a porta selecionada *
- Call MsgBox("StampDAQ could not connect." & vbCrLf & "Please check port settings", vbExclamation)
- End Sub
- '* Emite som ao clicar no checkbox de Download dos dados *
- Private Sub chkDump_Click()
- Beep
- End Sub
- '* Reseta o Timer do VBA esse timer é interno do VBA e nao vem do arduino *
- Private Sub cmdResetTimer_Click()
- TimeStart = Timer
- TimeLast = Timer
- TimeAdd = 0
- End Sub
- '* Caso haja problemas de connexao o programa emite um som e a mensagem de erro *
- Private Sub stamp_CommError()
- ' On comm error beep and display
- Beep
- MsgBox ("Data or Communications error")
- txtStatus2 = "Data or Comm Error"
- End Sub
- '* Caso o dado que foi enviado nao possa ser interpretado pela tabela ASCII emite o erro abaixo na interface *
- Private Sub stamp_DataError()
- txtStatus2 = "Error: Data < ASCII 10 or > ASCII 200"
- End Sub
- '* Esse e o Loop Principal durante toda a coleta de dados essa e a rotina que trata os dados e exibe na planilha *
- Private Sub stamp_DataReady()
- '* ON ERROR age como um try catch, se alguma chamada abaixo emitir um erro o programa escapa para o label Data_Error *
- On Error GoTo Data_Error
- Dim DataVal() As String
- Dim data As String
- '* O Objeto Stamp seta esse valor quando recebe um dado *
- While Stamp.gotData = True
- '* o dado e armazenado na variavel data com o formato string que foi convertido pelo objeto Stamp *
- data = Stamp.GetData
- '* se o dado for diferente de Vazio, ou seja se existe mesmo dado lido *
- If data <> "" Then
- '* Quebra o valor nas virgulas transformando a String separada por virgulas em um vetor *
- DataVal = Split(data, ",")
- '* Aqui entramos no Switch/Case DataVal(0) e o primeiro dado enviado *
- Select Case DataVal(0)
- '* Compara o primeiro valor com a String "CMD?" *
- Case "CMD?"
- '* Escreve no display que esta recebendo uma instrucao do arduino *
- txtStatus2 = "Stamp requesting instruction..."
- '* TODO: nao tenho ideia do que esta acontecendo aqui preciso ver mais Exemplos do PLX DAQ com esse "CMD?" para entender *
- '* Imagino que se possa Setar os valores de Data Export e Reset pelo Arduino com esse comando pelo que ele faz *
- If chkDump.Value = True Then
- Stamp.SendData ("11")
- Exit Sub
- End If
- If chkReset = True Then
- Stamp.SendData ("22")
- Exit Sub
- End If
- '* Se Recebeu antes de Qualquer Virgula o comando CLEARDATA *
- Case "CLEARDATA"
- '* Emite um som e Limpa a planilha, alem de escrever no diplay Clearing Sheet e retornar a variavel para a Row 1 para recomecar a coleta *
- Beep
- txtStatus2 = "Clearing sheet"
- Call clearSheet
- Row = 1
- '* Se o comando for RESETTIMER o timer do VBA e resetado e o texto e escrito na interface TODO: Testar *
- Case "RESETTIMER"
- TimeStart = Timer
- TimeLast = Timer
- TimeAdd = 0
- txtStatus2 = "Timer Reset"
- '* Se o comando for LABEL *
- Case "LABEL"
- '* Conta quantas virgulas tem na String afim de definir o numero de colunas que serao utilizadas *
- cc = countChar(data, ",")
- '* Escreve na interface *
- txtStatus2 = "Setting labels"
- '* para cada um dos Labels (aqui ele faz um mod 27, se voce tiver mais de 27 colunas ele sobrescreve as primeiras com os dados que excedem ver teste do arduino de "A" a "Z" nao escreve na "AA" =( ) TODO: Testar *
- For x = 1 To cc Mod 27
- '* O programa sempre trabalha na primeira planilha basta reordenar as planilhas para fazer ele ler em uma planilha diferente *
- '* o Comando Chr retorna uma Cadeia de caracteres com o caractere associado ao código de caracteres especificado. *
- '* portanto ele esta informando o Label da Coluna "A" "B" .... onde x incrementa o valor decimal da
- '* o comando Cstr(1) converte o valor 1 inteiro para a String "1" pois os titulos sao escritos na primeira linha
- '* entao o valor de A1 recebe a resultado da funcao ReplaceData() enviando o valor do Label na posicao x (depois de x virgulas) *
- '* isso e um parser para dados separados por virgula ! a funcao Replace data apaga qualquer dado que tinha antes *
- Worksheets(1).Range(Chr(64 + x) & CStr(1)).Value = ReplaceData(DataVal(x))
- Next
- '* ao fim do for seta a variavel global para 1 pois ela sera incrementada quando os dados forem lidos isso podia ter sido feito antes *
- '* E podia ter usado CStr(Row) para facilitar a leitura do programa! *
- Row = 1
- '* Caso o comando comece com DATA (leitura real dos dados) *
- Case "DATA"
- '* novamente a contagem dados depois das virgulas para ver quantas colunas estao sendo enviadas *
- cc = countChar(data, ",")
- '* Incrementa a linha *
- Row = Row + 1
- '* Informa na interface que esta recebendo dados da linha (ROW -1) -1 porque a 1 refere-se aos labels *
- txtStatus2 = "Accepting data for Row " & (Row - 1)
- '* Para de ler quando Row e maior 65000 esse criterio evita que o programa exploda a memoria do computador *
- If Row < 65000 Then
- '* Novamente o mesmo comportamento ate a coluna "Z" sem escrever na "AA" TODO: Testar*
- For x = 1 To cc Mod 27
- '* Exatamente a mesma linha usada para escrever o Label so que dessa vez o argumento de CStr e ROW informando a linha que o dado deve ser escrito *
- Worksheets(1).Range(Chr(64 + x) & CStr(Row)).Value = ReplaceData(DataVal(x))
- Next
- End If
- '* Comando DUMPING pode-se enviar esse comando do arduino para o PLX_DAQ para que ele faca o download dos dados *
- '* Porem nao vejo chamada de funcao para executar o download dos dados apenas retorno para a interface e a limpeza da planilha *
- '* No Excel 2017 isso nao funciona e nao acredito que funcione em outras versoes com esse mesmo codigo *
- Case "DUMPING"
- txtStatus2 = "Download starting..."
- Call clearSheet
- Row = 1
- '* Comando DUMPING *
- '* Comando de RESET *
- Case "RESET"
- '* Emite o som, infoma que os dados foram limpos e seta o checkbox do Reset como false TODO: Testar*
- Beep
- txtStatus2 = "Data cleared!"
- chkReset.Value = False
- '* Comando DONE finalizando coleta *
- Case "DONE"
- '* Limpa o Buffer do Objeto Stamp *
- Stamp.ClearBuffer
- '* Marca o campo de download como false *
- chkDump.Value = False
- '* emite o som e escreve que a operação concluiu *
- Beep
- txtStatus2 = "Operation Complete!"
- '* Comando MSG *
- Case "MSG"
- '* Esse comando redireciona o print do arduino para a tela da interface TODO: Testar *
- txtStatus1 = DataVal(1)
- '* Comando CELL *
- Case "CELL"
- '* Sub Comando pode ser GET ou SET *
- Select Case DataVal(1)
- '* SubComando GET *
- Case "GET"
- '* Coleta um valor da planilha e manda para o arduino por exemplo o comando "CELL,GET,A1" envia para o arduino o valor da celula A1 *
- Stamp.SendData (Worksheets(1).Range(DataVal(2)).Value)
- txtStatus2 = "Getting Cell " & DataVal(2)
- '* Manualmente seta um valor em uma determinada Celula *
- Case "SET"
- '* o comando "CELL,SET,A2,1000" coloca na celula A2 o valor 1000 *
- Worksheets(1).Range(DataVal(2)).Value = ReplaceData(DataVal(3))
- txtStatus2 = "Setting Cell " & DataVal(3)
- End Select
- '* o comando "CELL,SET,A2,1000" coloca na celula A2 o valor 1000 *
- Case "USER1"
- Select Case DataVal(1)
- Case "SET"
- ChkUser1.Value = CBool(Val(DataVal(2)))
- txtStatus2 = "Setting " & ChkUser1.Caption
- Case "GET"
- Stamp.SendData CStr(Abs(CInt(ChkUser1.Value)))
- txtStatus2 = "Getting " & ChkUser1.Caption
- Case "LABEL"
- ChkUser1.Caption = DataVal(2)
- End Select
- Case "USER2"
- Select Case DataVal(1)
- Case "SET"
- ChkUser2.Value = CBool(Val(DataVal(2)))
- txtStatus2 = "Setting " & ChkUser2.Caption
- Case "GET"
- Stamp.SendData CStr(Abs(CInt(ChkUser2.Value)))
- txtStatus2 = "Getting " & ChkUser2.Caption
- Case "LABEL"
- ChkUser2.Caption = DataVal(2)
- End Select
- Case "DOWNLOAD"
- Select Case DataVal(1)
- Case "SET"
- chkDump.Value = CBool(Val(DataVal(2)))
- txtStatus2 = "Setting " & chkDump.Caption
- Case "GET"
- Stamp.SendData CStr(Abs(CInt(chkDump.Value)))
- txtStatus2 = "Getting " & chkDump.Caption
- Case "LABEL"
- chkDump.Caption = DataVal(2)
- End Select
- Case "STORED"
- Select Case DataVal(1)
- Case "SET"
- chkReset.Value = CBool(Val(DataVal(2)))
- txtStatus2 = "Setting " & chkReset.Caption
- Case "GET"
- Stamp.SendData CStr(Abs(CInt(chkReset.Value)))
- txtStatus2 = "Getting " & chkReset.Caption
- Case "LABEL"
- chkReset.Caption = DataVal(2)
- End Select
- Case "ROW"
- Select Case DataVal(1)
- Case "SET"
- Row = Val(DataVal(2)) - 1
- txtStatus2 = "Setting Row"
- Case "GET"
- Stamp.SendData CStr(Row)
- End Select
- End Select
- End If
- Wend
- Exit Sub
- Data_Error:
- End Sub
- Private Sub clearSheet()
- If Row < 5000 Then Row = 5000
- Worksheets(1).Range("A2:" & Chr(64 + (cc Mod 27)) & CStr(Row + 10)).Value = Null
- txtStatus2.Caption = "Cells cleared"
- Row = 1
- End Sub
- Private Function countChar(stringIn As String, stringChar As String)
- For x = 1 To Len(stringIn)
- If Mid(stringIn, x, 1) = stringChar Then
- countChar = countChar + 1
- End If
- Next
- End Function
- Private Function ReplaceData(strData)
- If Timer < TimeLast Then
- If TimeAdd = 0 Then
- TimeAdd = (86400# - TimeStart)
- Else
- TimeAdd = TimeAdd + 86400#
- End If
- TimeStart = 0
- End If
- TimeLast = Timer
- strData = Replace(strData, "TIMER", Str(Timer - TimeStart + TimeAdd))
- strData = Replace(strData, "TIME", Time)
- strData = Replace(strData, "DATE", Date)
- ReplaceData = strData
- End Function
- Private Sub userform_Initialize()
- cboPort.AddItem "1"
- cboPort.AddItem "2"
- cboPort.AddItem "3"
- cboPort.AddItem "4"
- cboPort.AddItem "5"
- cboPort.AddItem "6"
- cboPort.AddItem "7"
- cboPort.AddItem "8"
- cboPort.AddItem "9"
- cboPort.AddItem "10"
- cboPort.AddItem "11"
- cboPort.AddItem "12"
- cboPort.AddItem "13"
- cboPort.AddItem "14"
- cboPort.AddItem "15"
- cboPort.Text = GetSetting("plx-daq", "app", "port", "1")
- cboBAUD.AddItem ("300")
- cboBAUD.AddItem ("600")
- cboBAUD.AddItem ("1200")
- cboBAUD.AddItem ("2400")
- cboBAUD.AddItem ("4800")
- cboBAUD.AddItem ("9600")
- cboBAUD.AddItem ("14400")
- cboBAUD.AddItem ("19200")
- cboBAUD.AddItem ("28800")
- cboBAUD.AddItem ("38400")
- cboBAUD.AddItem ("56000")
- cboBAUD.AddItem ("128000")
- cboBAUD.Text = GetSetting("plx-daq", "app", "baud", "9600")
- Stamp.Register = "Parallax:StampDAQ:A1F31"
- Row = 1
- cc = 10
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement