Nesta seção vou mostrar o uso da linguagem Tcl/Tk para a automação de uma Válvula Multiposição da empresa VALCO™. Um equipamento muito versátil para a Automação em Laboratório.
Este trabalho teve como objetivo inicial automatizar a coleta de frações de água eluída de uma coluna preenchida com carvão ativo, como parte de um estudo do uso de carvão ativo para o tratamento de água.
Mas pode também ser usado para automatizar a coleta de frações de qualquer sistema cromatográfico ou, quando associado a uma bomba peristáltica, para coleta de frações em biorreatores.
É um exemplo bem ilustrativo do uso de Software Livre para a automação em um “Laboratório de Águas”.
Gostaria de esclarecer que esta válvula foi usada porque era o equipamento disponível no momento, no nosso laboratório. Ou seja, não estou fazendo propaganda ou recomendando o uso desta marca/modelo!
Existem também outros recursos para comutar fluxos de líquidos, dentre eles podemos citar a Válvula de Seleção de Fluxo da empresa BIOCHEM-Valve™
A empresa VALCO™ produz vários modelos de válvula multiposição para diversas aplicações.
Neste trabalho utilizamos uma válvula Cheminert de baixa pressão com 10 posições e tubo de Teflon™ de 1/8".
Essa válvula é controlada por um Módulo de Controle (atuador) que funciona como uma interface bidirecional entre um computador e a válvula.
Figura 128. Válvula multiposição com a interface de controle e o conector serial para comunicação com o PC.

A interface de controle recebe instruções ASCII pela porta serial RS232 de um computador e converte as instruções de alto nível em comandos no código BCD para o motor de passo que controla a válvula.
Mas felizmente não precisamos entender toda essa eletrônica! :^)
Basta conhecer a lista de comandos e mensagens ASCII que vamos usar para controlar a válvula através da nossa interface em Tcl/Tk.
O manual da Interface de Controle, com a lista dos comandos ASCII, está disponível para download no site do fabricante ou no nosso site.
Providenciamos a montagem desses componentes em uma estrutura de alumínio para uso na bancada do laboratório.
Figura 129. Montagem da válvula (com tubos de Teflon™), interface de controle, fonte de alimentação e controlador manual em um único módulo.

Estabelecemos 4 Requisitos Funcionais para o programa de controle da válvula:
Permitir carregar e executar um roteiro script contendo a sequência de comandos para a válvula em intervalos de tempo definidos
Registrar os eventos do início ao término da execução de um script permitindo a criação de um arquivo de registro (log).
Verificar a sintaxe dos comandos de um script antes da execução.
Configurar o número da porta serial na qual está conectada a válvula e testar a comunicação antes da execução de um script.
Com base nos requisitos funcionais elaboramos um projeto de interface gráfica com uma única tela.
Na figura seguinte mostramos o projeto de interface gráfica com a descrição dos principais elementos gráficos (Widgets).
Para criar essa interface usamos 3 frames principais (1, 2 e 3) e dividimos o frame 2 em dois frames filho (2a e 2b). O labelframe 2a foi chamado de PROGRAMA e serve para exibir o script a ser executado e o labelframe REGISTRO exibe os eventos (log), conforme mostra a figura seguinte.
Durante o desenvolvimento resolvemos incluir no labelframe PROGRAMA os botões Abrir e Gravar para permitir a exibição e edição simultânea do script sem precisar de um editor externo.
Na listagem abaixo, mostramos uma parte do programa referente à criação da interface gráfica:
set mensagem1 "Amostragem Automatizada em Colunas de Carvão (VMULT)"
set mensagem2 "Estado Atual:"
#Criação dos frames .f1, .f2 e .f3 que vão organizar os elementos da interface
set frame_topo [frame .f1]
set frame_int [frame .f2]
set frame_botoes [frame .f3]
set frame_int_esq [labelframe $frame_int.esq -font $fonte_media -text "PROGRAMA"]
#Frame intermediário do lado esquerdo para os botões "Abrir" e "Gravar"
set frame_int_esq_bot [frame $frame_int_esq.bot ]
set frame_int_dir [labelframe $frame_int.dir -font $fonte_media -text "REGISTRO"]
#Frame intermediário do lado direito para os botões "Abrir" e "Gravar"
set frame_int_dir_bot [frame $frame_int_dir.bot ]
#Label com o nome do programa
set nome_programa [label $frame_topo.msg -font $fonte_grande \
-text "$mensagem1"]
#Label com informações atualizadas sobre o andamento do script.
set status_programa [label $frame_topo.status -font $fonte_grande \
-textvariable mensagem2]
#Botões "Abrir" e "Gravar" do labelframe PROGRAMA, da esquerda, para permitir
#abrir e gravar um programa.
set abrir_programa [button $frame_int_esq_bot.abrir_prog \
-font $fonte_media -text "Abrir " ]
set gravar_programa [button $frame_int_esq_bot.gravar_prog \
-font $fonte_media -text "Gravar" ]
set ajuda_programa [button $frame_int_esq_bot.ajuda_prog \
-font $fonte_media -bg #3baed9 -text "Ajuda" -command ajuda]
#Botões "Abrir" e "Gravar" do labelframe REGISTRO, da direita, para permitir
#abrir e gravar um registro (log).
set abrir_registro [button $frame_int_dir_bot.abrir_reg \
-font $fonte_media -text "Abrir "]
set gravar_registro [button $frame_int_dir_bot.gravar_reg \
-font $fonte_media -text "Gravar"]
#Texto para exibição do programa a ser executado
set frame_texto_esq [frame $frame_int_esq.f]
set texto_programa [text $frame_texto_esq.texto -font $fonte_pequena \
-height 10 -width 35 -spacing1 10 -yscrollcommand "$frame_texto_esq.rol set"]
set rolagem_texto_programa [scrollbar $frame_texto_esq.rol \
-command "$texto_programa yview"]
$abrir_programa configure -command [list abrir_arquivo $texto_programa]
$gravar_programa configure -command [list gravar_arquivo $texto_programa]
#Texto para exibição do registro dos eventos (log)
set frame_texto_dir [frame $frame_int_dir.f]
set texto_registro [text $frame_texto_dir.texto -font $fonte_pequena \
-height 10 -width 35 -spacing1 10 -yscrollcommand "$frame_texto_dir.rol set"]
set rolagem_texto_registro [scrollbar $frame_texto_dir.rol \
-command "$texto_registro yview"]
$abrir_registro configure -command [list abrir_arquivo $texto_registro]
$gravar_registro configure -command [list gravar_arquivo $texto_registro]
#Botões para controle do programa
set botao_sair [button $frame_botoes.sair -font $fonte_media -bg #3baed9 -text " Sair " \
-command exit]
set botao_parar [button $frame_botoes.parar -font $fonte_media -text " Parar " \
-command [list parar $texto_registro]]
set botao_configurar [button $frame_botoes.configurar -font $fonte_media -text "Conexão" \
-command configurar]
set botao_verificar [button $frame_botoes.verificar -font $fonte_media -text "Verificar" \
-command [list verificar_programa $texto_programa $texto_registro]]
set botao_executar [button $frame_botoes.executar -font $fonte_media -text " Executar "]
$botao_executar configure -command " \
[list desabilitar_botoes $botao_configurar $botao_verificar $botao_executar]; \
[list executar_programa $texto_programa $texto_registro]; \
[list habilitar_botoes $botao_configurar $botao_verificar $botao_executar];"
pack $nome_programa
pack $status_programa
pack $ajuda_programa $abrir_programa $gravar_programa -side right -padx 10 -pady 10
pack $texto_programa $rolagem_texto_programa -side left -expand yes -fill y
pack $frame_texto_esq -side bottom
pack $abrir_registro $gravar_registro -side right -padx 10 -pady 10
pack $texto_registro $rolagem_texto_registro -side left -expand yes -fill y
pack $frame_texto_dir -side bottom
pack $frame_int_esq_bot -side top
pack $frame_int_dir_bot -side top
pack $frame_int_esq $frame_int_dir -side left -expand yes
pack $botao_sair $botao_parar $botao_configurar $botao_verificar $botao_executar -side left -expand yes
pack $frame_topo -side top
pack $frame_int -expand yes -fill x
pack $frame_botoes -side bottom -expand yes -fill x
Na página 7 do manual da interface (ou controlador) da válvula multiportas você encontra uma lista completa com todos os comandos para comunicação co com a válvula.
Na tabela seguinte selecionei apenas os comandos principais que utilizamos:
Tabela 7. Lista dos principais comandos seriais (ASCII) para o controle da Válvula Multiposição Valco™
| Comando | Ação |
|---|---|
| NP<enter> | Retorna o número de posições para o qual o atuador está configurado |
| NPnn<enter> | Define o número de posições (nn) da válvula |
| CWnn<enter> | A válvula gira no sentido horário até a posição nn |
| CCnn<enter> | A válvula gira no sentido anti-horário até a posição nn |
| GOnn<enter> | Válvula gira até a posição nn, seguindo o caminho mais curto |
| CP<enter> | Retorna a posição atual da válvula |
Dentre todos os comandos disponíveis usamos apenas dois: GOnn<enter> e CP<enter>
Segundo o manual do equipamento a porta serial deve ser configurada com os seguintes parâmetros de comunicação serial:
9600 baud (padrão)
sem paridade (no parity)
8 bits de dado
1 bit de parada
O programa completo está disponível no link: vmult.tcl.
O pacote Starpack (para Linux) do programa de controle VMULT foi criado seguindo, como exemplo, o procedimento descrito na seção “Procedimento para criação de um executável Starpack para Linux” e está disponível no link: VMULT
Espero que este material possa ser útil.
Sugestões, dúvidas e críticas podem ser encaminhadas para: