Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
443
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. '*****************************************************
  2. '*   PLX-DAQ Data Acquisition for Excel              *
  3. '*   Copyright 2007, Parallax Inc.                   *
  4. '*   PLX-DAQ is a trademark of Parallax, Inc.        *
  5. '*   www.parallax.com                                *
  6. '*****************************************************
  7. '*   Programmed by:  Martin Hebel   January, 2007    *
  8. '*                   martin@selmaware.com            *
  9. '*****************************************************
  10. '*   Modified distribution of this macro is          *
  11. '*   not permitted.  Use of the SelmaDAQ Active-X    *
  12. '*   control for other uses requires permission of   *
  13. '*   SelmaWare Solutions -    www.selmaware.com      *
  14. '*****************************************************
  15.  
  16. '* Declaracao das variaveis globais *
  17. Dim Row
  18. Dim FlagConnect As Boolean
  19. Dim TimeStart
  20. Dim TimeLast
  21. Dim TimeAdd
  22.  
  23. '* TODO: Identificar essa variavel cc global
  24. Dim cc
  25.  
  26. '* cbo e a abreviacao de combo, ou combo box, sao as caixas que vc abre e selciona os dados *
  27. '* funcao responsavel por selecionar o Baud Rate, antes de mudar ela disconecta o objeto Stamp *
  28. '* muda o texto do botao na interface para Connect, indicando que esta disconnectado *
  29. '* seta a flag de conexão global como false
  30. '* seta o novo baudrate no objeto Stamp
  31. Private Sub cboBAUD_Change()
  32.     Stamp.Disconnect
  33.     cmdConnect.Caption = "Connect"
  34.     FlagConnect = False
  35.     Stamp.Baud = cboBAUD
  36. End Sub
  37.  
  38. '* combo box de selecao de porta
  39. '* funcao responsavel por selecionar a porta de conexão, antes de mudar, ela disconecta o objeto Stamp *
  40. '* muda o texto do botao na interface para Connect, indicando que esta disconnectado *
  41. '* seta a flag de conexão global como false
  42. '* seta a porta no objeto Stamp
  43. Private Sub cboPort_Click()
  44.    Stamp.Disconnect
  45.    cmdConnect.Caption = "Connect"
  46.    FlagConnect = False
  47.    Stamp.Port = cboPort
  48. End Sub
  49.  
  50.  
  51. '* emite som ao clicar no botao de reset do timer *
  52. Private Sub chkReset_Click()
  53.      Beep
  54. End Sub
  55.  
  56. '* emite som ao clicar no botao user1 na interface *
  57. Private Sub ChkUser1_Click()
  58.    Beep
  59. End Sub
  60.  
  61. '* emite som ao clicar no botao user2 na interface *
  62. Private Sub ChkUser2_Click()
  63.    Beep
  64. End Sub
  65.  
  66. '* emite som ao clicar no botao de limpar os dados da coluna *
  67. Private Sub cmdClear_Click()
  68.     Beep
  69.     Call clearSheet
  70.  
  71. End Sub
  72.  
  73. '* funcao que e chamada quando o usuario clica no botao de connectar *
  74. Private Sub cmdConnect_Click()
  75. '* se nao esta connectado entao: *
  76. If FlagConnect = False Then
  77.     '* esse comando funciona como um try catch de erros, ele vai tentar fazer os passos abaixo *
  78.    '* caso um desses passos emita um erro o programa pula para o label ConnectErr abaixo *
  79.    '* e exibe a janela de erro com o caso mais provavel (verificar a porta de conexao) *
  80.  On Error GoTo ConnectErr
  81.   '* 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 *
  82.  '* ele e baseado no Objeto SerialPort do .NET da Microsoft
  83.  '* https://msdn.microsoft.com/pt-br/library/system.io.ports.serialport.dtrenable(v=vs.110).aspx
  84.  '* DTRE stands for: Data Terminal Ready, faz parte do padrao de comunicacao "handshake" *
  85.  Stamp.DTREnabled = CBool(chkDTR)
  86.   '* Conecta, disconecta e conecta novamente, provavelmente buscando por erros uma vez que isso esta dentro do ON ERROR *
  87.  Stamp.Connect
  88.   Stamp.Disconnect
  89.   Stamp.Connect
  90.   '* Muda o texto do botao para Disconnect indicando que esse botao principal muda de estado de acordo com o estado da aplicacao *
  91.  cmdConnect.Caption = "Disconnect"
  92.   '* Seta a flag global de conexao *
  93.  FlagConnect = True
  94.   '* Escreve no campo da interface informando que esta disconectado *
  95.  txtStatus2 = "Connected"
  96.   '* As duas chamadas abaixo fazem com que o excel lembre as ultimas configuracoes de Baud e Porta que foram utilizadas *
  97.  Call SaveSetting("plx-daq", "app", "port", cboPort.Text)
  98.   Call SaveSetting("plx-daq", "app", "baud", cboBAUD.Text)
  99. Else
  100.   '* Caso o dispositivo ja esteja conectado e o usuario clicou no botao (que nesse caso esta escrito disconnect) *
  101.  '* O programa inicia o processo de desconectar e voltar a interface para o estado de espera por uma nova conexao *
  102.  '* Chama a rotina Disconnect do objeto Stamp *
  103.  Stamp.Disconnect
  104.   '* Muda o texto do botao para Connect, indicando que ao clicar o usuario sera conectado a porta serial *
  105.  cmdConnect.Caption = "Connect"
  106.   '* Seta a flag global de conexao para false *
  107.  FlagConnect = False
  108.   '* Escreve no display Disconnected informando o estado atual da aplicacao *
  109.  txtStatus2 = "Disconnected"
  110. End If
  111.  
  112. Exit Sub
  113.  '* Chamada caso aconteca algum erro durante o processo de conectar *
  114. ConnectErr:
  115. '* Chama a janela de erro do excell pedindo pra pessoa verificar a porta selecionada *
  116. Call MsgBox("StampDAQ could not connect." & vbCrLf & "Please check port settings", vbExclamation)
  117. End Sub
  118.  
  119. '* Emite som ao clicar no checkbox de Download dos dados *
  120. Private Sub chkDump_Click()
  121.     Beep
  122. End Sub
  123.  
  124. '* Reseta o Timer do VBA esse timer é interno do VBA e nao vem do arduino *
  125. Private Sub cmdResetTimer_Click()
  126.     TimeStart = Timer
  127.     TimeLast = Timer
  128.     TimeAdd = 0
  129. End Sub
  130.  
  131. '* Caso haja problemas de connexao o programa emite um som e a mensagem de erro *
  132. Private Sub stamp_CommError()
  133. ' On comm error beep and display
  134.  
  135. Beep
  136. MsgBox ("Data or Communications error")
  137.   txtStatus2 = "Data or Comm Error"
  138. End Sub
  139.  
  140. '* Caso o dado que foi enviado nao possa ser interpretado pela tabela ASCII emite o erro abaixo na interface *
  141. Private Sub stamp_DataError()
  142.   txtStatus2 = "Error: Data < ASCII 10 or > ASCII 200"
  143. End Sub
  144.  
  145. '* Esse e o Loop Principal durante toda a coleta de dados essa e a rotina que trata os dados e exibe na planilha *
  146. Private Sub stamp_DataReady()
  147. '* ON ERROR age como um try catch, se alguma chamada abaixo emitir um erro o programa escapa para o label Data_Error *
  148. On Error GoTo Data_Error
  149. Dim DataVal() As String
  150. Dim data As String
  151.  
  152. '* O Objeto Stamp seta esse valor quando recebe um dado *
  153. While Stamp.gotData = True
  154.   '* o dado e armazenado na variavel data com o formato string que foi convertido pelo objeto Stamp *
  155.  data = Stamp.GetData
  156.  
  157.   '* se o dado for diferente de Vazio, ou seja se existe mesmo dado lido *
  158.  If data <> "" Then
  159.     '* Quebra o valor nas virgulas transformando a String separada por virgulas em um vetor *
  160.    DataVal = Split(data, ",")
  161.    
  162.     '* Aqui entramos no Switch/Case DataVal(0) e o primeiro dado enviado  *
  163.    Select Case DataVal(0)
  164.     '* Compara o primeiro valor com a String "CMD?" *
  165.    Case "CMD?"
  166.         '* Escreve no display que esta recebendo uma instrucao do arduino *
  167.        txtStatus2 = "Stamp requesting instruction..."
  168.         '* TODO: nao tenho ideia do que esta acontecendo aqui preciso ver mais Exemplos do PLX DAQ com esse "CMD?" para entender *
  169.        '* Imagino que se possa Setar os valores de Data Export e Reset pelo Arduino com esse comando pelo que ele faz *
  170.        If chkDump.Value = True Then
  171.             Stamp.SendData ("11")
  172.             Exit Sub
  173.         End If
  174.        
  175.         If chkReset = True Then
  176.             Stamp.SendData ("22")
  177.             Exit Sub
  178.         End If
  179.        
  180.     '* Se Recebeu antes de Qualquer Virgula o comando CLEARDATA *
  181.    Case "CLEARDATA"
  182.         '* 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 *
  183.        Beep
  184.         txtStatus2 = "Clearing sheet"
  185.         Call clearSheet
  186.         Row = 1
  187.     '* Se o comando for RESETTIMER o timer do VBA e resetado e o texto e escrito na interface TODO: Testar *
  188.    Case "RESETTIMER"
  189.         TimeStart = Timer
  190.         TimeLast = Timer
  191.         TimeAdd = 0
  192.         txtStatus2 = "Timer Reset"
  193.        
  194.     '* Se o comando for LABEL *
  195.    Case "LABEL"
  196.         '* Conta quantas virgulas tem na String afim de definir o numero de colunas que serao utilizadas *
  197.        cc = countChar(data, ",")
  198.         '* Escreve na interface *
  199.        txtStatus2 = "Setting labels"
  200.         '* 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 *
  201.        For x = 1 To cc Mod 27
  202.           '* O programa sempre trabalha na primeira planilha basta reordenar as planilhas para fazer ele ler em uma planilha diferente *
  203.          '* o Comando Chr retorna uma Cadeia de caracteres com o caractere associado ao código de caracteres especificado.  *
  204.          '* portanto ele esta informando o Label da Coluna "A" "B" .... onde x incrementa o valor decimal da
  205.          '* o comando Cstr(1) converte o valor 1 inteiro para a String "1" pois os titulos sao escritos na primeira linha
  206.          '* entao o valor de A1 recebe a resultado da funcao ReplaceData() enviando o valor do Label na posicao x (depois de x virgulas) *
  207.          '* isso e um parser para dados separados por virgula ! a funcao Replace data apaga qualquer dado que tinha antes *
  208.          Worksheets(1).Range(Chr(64 + x) & CStr(1)).Value = ReplaceData(DataVal(x))
  209.         Next
  210.         '* 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 *
  211.        '* E podia ter usado CStr(Row) para facilitar a leitura do programa! *
  212.        Row = 1
  213.     '* Caso o comando comece com DATA (leitura real dos dados) *
  214.    Case "DATA"
  215.         '* novamente a contagem dados depois das virgulas para ver quantas colunas estao sendo enviadas *
  216.        cc = countChar(data, ",")
  217.         '* Incrementa a linha *
  218.        Row = Row + 1
  219.         '* Informa na interface que esta recebendo dados da linha (ROW -1) -1 porque a 1 refere-se aos labels *
  220.        txtStatus2 = "Accepting data for Row " & (Row - 1)
  221.        
  222.         '* Para de ler quando Row e maior 65000 esse criterio evita que o programa exploda a memoria do computador *
  223.        If Row < 65000 Then
  224.             '* Novamente o mesmo comportamento ate a coluna "Z" sem escrever na "AA" TODO: Testar*
  225.            For x = 1 To cc Mod 27
  226.                 '* 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 *
  227.              Worksheets(1).Range(Chr(64 + x) & CStr(Row)).Value = ReplaceData(DataVal(x))
  228.             Next
  229.         End If
  230.     '* Comando DUMPING pode-se enviar esse comando do arduino para o PLX_DAQ para que ele faca o download dos dados *
  231.    '* Porem nao vejo chamada de funcao para executar o download dos dados apenas retorno para a interface e a limpeza da planilha *
  232.    '* No Excel 2017 isso nao funciona e nao acredito que funcione em outras versoes com esse mesmo codigo *
  233.    Case "DUMPING"
  234.         txtStatus2 = "Download starting..."
  235.         Call clearSheet
  236.         Row = 1
  237.     '* Comando DUMPING *
  238.  
  239.     '* Comando de RESET *
  240.    Case "RESET"
  241.             '* Emite o som, infoma que os dados foram limpos e seta o checkbox do Reset como false TODO: Testar*
  242.            Beep
  243.             txtStatus2 = "Data cleared!"
  244.             chkReset.Value = False
  245.            
  246.     '* Comando DONE finalizando coleta *
  247.    Case "DONE"
  248.         '* Limpa o Buffer do Objeto Stamp *
  249.         Stamp.ClearBuffer
  250.          '* Marca o campo de download como false *
  251.         chkDump.Value = False
  252.          '* emite o som e escreve que a operação concluiu *
  253.         Beep
  254.          txtStatus2 = "Operation Complete!"
  255.        
  256.     '* Comando MSG *
  257.    Case "MSG"
  258.             '* Esse comando redireciona o print do arduino para a tela da interface TODO: Testar *
  259.           txtStatus1 = DataVal(1)
  260.    
  261.     '* Comando CELL *
  262.    Case "CELL"
  263.         '* Sub Comando pode ser GET ou SET *
  264.        Select Case DataVal(1)
  265.         '* SubComando GET *
  266.        Case "GET"
  267.             '* 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 *
  268.              Stamp.SendData (Worksheets(1).Range(DataVal(2)).Value)
  269.               txtStatus2 = "Getting Cell " & DataVal(2)
  270.        
  271.         '* Manualmente seta um valor em uma determinada Celula  *
  272.        Case "SET"
  273.             '* o comando "CELL,SET,A2,1000" coloca na celula A2 o valor 1000 *
  274.              Worksheets(1).Range(DataVal(2)).Value = ReplaceData(DataVal(3))
  275.               txtStatus2 = "Setting Cell " & DataVal(3)
  276.         End Select
  277.    
  278.     '* o comando "CELL,SET,A2,1000" coloca na celula A2 o valor 1000 *
  279.    Case "USER1"
  280.          Select Case DataVal(1)
  281.          Case "SET"
  282.             ChkUser1.Value = CBool(Val(DataVal(2)))
  283.             txtStatus2 = "Setting " & ChkUser1.Caption
  284.          Case "GET"
  285.              Stamp.SendData CStr(Abs(CInt(ChkUser1.Value)))
  286.              txtStatus2 = "Getting " & ChkUser1.Caption
  287.          Case "LABEL"
  288.              ChkUser1.Caption = DataVal(2)
  289.          End Select
  290.    
  291.     Case "USER2"
  292.          Select Case DataVal(1)
  293.          Case "SET"
  294.             ChkUser2.Value = CBool(Val(DataVal(2)))
  295.             txtStatus2 = "Setting " & ChkUser2.Caption
  296.          Case "GET"
  297.              Stamp.SendData CStr(Abs(CInt(ChkUser2.Value)))
  298.              txtStatus2 = "Getting " & ChkUser2.Caption
  299.          Case "LABEL"
  300.              ChkUser2.Caption = DataVal(2)
  301.          End Select
  302.    
  303.     Case "DOWNLOAD"
  304.          Select Case DataVal(1)
  305.          Case "SET"
  306.             chkDump.Value = CBool(Val(DataVal(2)))
  307.             txtStatus2 = "Setting " & chkDump.Caption
  308.          Case "GET"
  309.              Stamp.SendData CStr(Abs(CInt(chkDump.Value)))
  310.              txtStatus2 = "Getting " & chkDump.Caption
  311.          Case "LABEL"
  312.              chkDump.Caption = DataVal(2)
  313.          End Select
  314.    
  315.     Case "STORED"
  316.          Select Case DataVal(1)
  317.          Case "SET"
  318.             chkReset.Value = CBool(Val(DataVal(2)))
  319.             txtStatus2 = "Setting " & chkReset.Caption
  320.          Case "GET"
  321.              Stamp.SendData CStr(Abs(CInt(chkReset.Value)))
  322.              txtStatus2 = "Getting " & chkReset.Caption
  323.          Case "LABEL"
  324.              chkReset.Caption = DataVal(2)
  325.          End Select
  326.    
  327.      Case "ROW"
  328.          Select Case DataVal(1)
  329.          Case "SET"
  330.             Row = Val(DataVal(2)) - 1
  331.             txtStatus2 = "Setting Row"
  332.          Case "GET"
  333.              Stamp.SendData CStr(Row)
  334.          End Select
  335.    
  336.     End Select
  337. End If
  338. Wend
  339. Exit Sub
  340.  
  341. Data_Error:
  342. End Sub
  343. Private Sub clearSheet()
  344.         If Row < 5000 Then Row = 5000
  345.         Worksheets(1).Range("A2:" & Chr(64 + (cc Mod 27)) & CStr(Row + 10)).Value = Null
  346.         txtStatus2.Caption = "Cells cleared"
  347.         Row = 1
  348. End Sub
  349. Private Function countChar(stringIn As String, stringChar As String)
  350. For x = 1 To Len(stringIn)
  351.     If Mid(stringIn, x, 1) = stringChar Then
  352.         countChar = countChar + 1
  353.     End If
  354. Next
  355. End Function
  356. Private Function ReplaceData(strData)
  357.  
  358. If Timer < TimeLast Then
  359.     If TimeAdd = 0 Then
  360.         TimeAdd = (86400# - TimeStart)
  361.     Else
  362.         TimeAdd = TimeAdd + 86400#
  363.     End If
  364.     TimeStart = 0
  365. End If
  366.  
  367. TimeLast = Timer
  368.         strData = Replace(strData, "TIMER", Str(Timer - TimeStart + TimeAdd))
  369.         strData = Replace(strData, "TIME", Time)
  370.         strData = Replace(strData, "DATE", Date)
  371.         ReplaceData = strData
  372. End Function
  373.  
  374. Private Sub userform_Initialize()
  375. cboPort.AddItem "1"
  376. cboPort.AddItem "2"
  377. cboPort.AddItem "3"
  378. cboPort.AddItem "4"
  379. cboPort.AddItem "5"
  380. cboPort.AddItem "6"
  381. cboPort.AddItem "7"
  382. cboPort.AddItem "8"
  383. cboPort.AddItem "9"
  384. cboPort.AddItem "10"
  385. cboPort.AddItem "11"
  386. cboPort.AddItem "12"
  387. cboPort.AddItem "13"
  388. cboPort.AddItem "14"
  389. cboPort.AddItem "15"
  390. cboPort.Text = GetSetting("plx-daq", "app", "port", "1")
  391.  
  392. cboBAUD.AddItem ("300")
  393. cboBAUD.AddItem ("600")
  394. cboBAUD.AddItem ("1200")
  395. cboBAUD.AddItem ("2400")
  396. cboBAUD.AddItem ("4800")
  397. cboBAUD.AddItem ("9600")
  398. cboBAUD.AddItem ("14400")
  399. cboBAUD.AddItem ("19200")
  400. cboBAUD.AddItem ("28800")
  401. cboBAUD.AddItem ("38400")
  402. cboBAUD.AddItem ("56000")
  403. cboBAUD.AddItem ("128000")
  404. cboBAUD.Text = GetSetting("plx-daq", "app", "baud", "9600")
  405.  
  406. Stamp.Register = "Parallax:StampDAQ:A1F31"
  407. Row = 1
  408. cc = 10
  409. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement