Business - Automação Comercial

Bematech: Utilizando o micro-terminal SB-2030E remotamente

Muitos desenvolvedores nos perguntam se é possível utilizar nosso micro-terminal SB-2030E em modo remoto, onde a aplicação comercial pudesse controlá-lo remotamente na rede, enviando e lendo informações. A resposta é "Sim"!

por André Luiz R. Munhoz



Muitos desenvolvedores nos perguntam se é possível utilizar nosso micro-terminal SB-2030E em modo remoto, onde a aplicação comercial pudesse controlá-lo remotamente na rede, enviando e lendo informações. A resposta é "Sim"!

É possível colocarmos o micro-terminal SB-2030E "escravo" de nossa aplicação, permitindo que toda a regra de negócio fique na aplicação que roda no PC, possibilitando que os comandos possam ser enviados diretamente para ele. Comandos de acesso ao display, teclado, portas serias, banco de dados, etc podem ser enviados da aplicação direto para o micro-terminal.

Observe que a linguagem de programação utilizada para programar o SB-2030E é "C/C++", mas através do modo remoto a linguagem que utilizamos é a própria linguagem de nossa aplicação (Delphi, VB ou C#, por exemplo), pois quem comanda o micro-terminal neste modo é a própria aplicação. Portanto, não precisamos conhecer da linguagem "C/C++" para utilizá-lo.

Nesta edição de nosso artigo, estaremos conhecendo e trabalhando com este recurso disponível em nosso micro-terminal.

Então… vamos lá!

- Conhecendo a função "modoremoto()"

No kit de desenvolvimento do micro-terminal SB-2030E (SDK), existe uma função chamada "modoremoto" que tem por finalidade colocar o micro-terminal em modo "escravo", dependente da aplicação que irá comandá-lo.

A implementação desta função no micro-terminal é muito simples, basta abrir um novo projeto no ambiente VisualSDK Builder (conforme já visto em edições passadas) e inserir o pequeno código abaixo:

#include <dos.h>
#include <mem.h>
#include "..\include\define.h"

void far main()
{
modoremoto();
}

Após transferir este código para o SB-2030E, aparecerá em seu display as seguintes informações:

MODO REMOTONum.Terminal=1
Velocidade Comunicacao=57600

Estas informações indicam que o SB-2030E está pronto para receber as instruções da aplicação via rede.


- Usando a BemaSB32.dll no envio de comandos para o SB-2030E remoto

Neste exemplo, usaremos as funções da dll BemaSB32 responsáveis pela comunicação com o micro-terminal em modo remoto. Vamos primeiro conhecer cada função para depois criarmos o código. Usaremos a linguagem Delphi para editá-lo.

- Bematech_SB_SelecionaInterface

: função que seleciona a interface de comunicação do SB-
2030E.

- Bematech_SB_AdicionaIp

: função que adiciona o IP do SB-2030E na aplicação.
- Bematech_SB_RS485_EnviaCmdTamanho : função que envia comandos SB-2030E.

Basicamente, são estas 3 funções que usaremos na implementação e comunicação com o SB-2030E.

Obs: A dll BemaSB32 é disponibilizada junto com a instalação do VisualSDK Builder.

- Declarando as funções da BemaSB32.dll

Abra um projeto novo e inclua estas linhas em seu início (se preferir, pode adicioná-las em seu módulo de declarações):

function Bematech_SB_SelecionaInterface( TipoInterface: Integer ): integer; StdCall; External ‘BEMASB32.DLL’;

function Bematech_SB_AdicionaIp( NumeroTerminal: Integer; NumeroIP : String): Integer; StdCall; far; External ‘BEMASB32.DLL’;

function Bematech_SB_RS485_EnviaCmdTamanho( Comando: String; IDterminal: String; nProcesso: String; Confirmacao: String; Dados: String; StRetorno: String; DataRetorno: String; TemRetorno: String; Tamanho: String ): Integer; StdCall; External ‘BEMASB32.DLL’;

Adicione um botão ao formulário chamado "Adiciona IP", que fará a associação do IP ao número do terminal. O código para este botão ficará assim:

procedure TForm1.Button1Click(Sender: TObject);
var
iRetorno: integer;
cIP: string;
begin
cIP := ‘10.10.100.100?;
iRetorno := Bematech_SB_SelecionaInterface( 2 );
if ( iRetorno <> 1 ) then
Application.MessageBox( ‘Erro ao selecionar interface!’, ‘Atenção’, MB_IconError + MB_OK )
else
begin
iRetorno := Bematech_SB_AdicionaIp( 1, pchar( cIP ) );
if ( iRetorno <> 1 ) then
Application.MessageBox( ‘Erro ao adicionar IP!’, ‘Atenção’, MB_IconError + MB_OK );
end;
end;

Repare que neste código já estamos definindo, através da função Bematech_FI_SelecionaInterface, a interface de comunicação que será usada: TCP/IP (parâmetro da função igual a 2). Estamos associando o IP 10.10.100.100 do SB-2030E ao terminal de número 1. Isso deverá ser feito, respectivamente, para cada SB-2030E disponível na rede.

Obs: Nas edições anteriores do artigo, vimos como procurar o SB-2030E na rede, retornando seu IP.

Todos os comandos disponíveis no modo remoto estão relacionados às funções do SDK. Por exemplo: para limpar o display do SB-2030E, usamos a função clrscrU() no modo programável e para o modo remoto usaremos o comando "111" com a sigla "U" - a sigla indica que é display do usuário.

Iremos utilizar alguns comandos básicos para conhecer esta funcionalidade do SB-2030E. Os demais comandos podem ser vistos no help do VisualSDK Builder, tópico "Trabalhando com o SB2000 remotamente". Baixe a versão atualizada aqui!

- Limpando o Display do Usuário

Adicione um botão ao formulário chamado "Limpa Display" e insira o seguinte código:

procedure TForm1.Button2Click(Sender: TObject);
var

cStatusSB2000 : string;
cBufferRetornoSB2000 : string;
cBufferEnviado : string;
cComando : string;
cNumeroTerminal : string;
cNumeroProcesso : string;
cEnviaStatus : string;
cTemRetorno : string;
cTamDados: string;

iConta : integer;
iRetorno : integer;
begin
{ Limpa o Display do Usuário.
Função clrscrU do SDK. }

for iConta := 1 to 2 do cStatusSB2000 := cStatusSB2000 + ‘ ‘;
for iConta := 1 to 256 do cBufferRetornoSB2000 := cBufferRetornoSB2000 + ‘ ‘;

cComando := ‘111?;
cNumeroTerminal := ‘1?;
cNumeroProcesso := ‘0001?;
cEnviaStatus := ‘1?;
cTemRetorno := ‘0?;
cBufferEnviado := ‘U’;
cTamDados := inttostr( length( cBufferEnviado ) );

iRetorno := Bematech_SB_RS485_EnviaCmdTamanho( cComando, cNumeroTerminal, cNumeroProcesso, cEnviaStatus, cBufferEnviado, cStatusSB2000, cBufferRetornoSB2000, cTemRetorno, cTamDados );
end;

A função Bematech_SB_RS485_EnviaCmdTamanho tem por finalidade enviar o comando para o micro-terminal. Esta é a função mais utilizada na comunicação, então vamos entender seus parâmetros:

cComando : STRING numérica de 3 caracteres com o identificador do comando.
cNumeroTerminal : STRING numérica de até 3 caracteres com o número do SB-2030E.
cNumeroProcesso : STRING numérica de 4 caracteres com o identificador do processo. Este
identificador pode ser fixo.
cEnviaStatus : STRING numérica de 1 caractere com a confirmação de envio de status
(ACK/NACK), onde:
"0": para não retornar o Status
"1": para retornar o Status.
cBufferEnviado : STRING alfanumérica de tamanho livre, onde serão passados os parâmetros que
o comando possuir.
cStatusSB2000

: STRING de 2 bytes, passada por referência, para armazenagem do retorno de
erro.

cBufferRetornoSB2000 : STRING de 256 bytes, passada por referência, para armazenagem do retorno de
dados.
cTemRetorno : STRING numérica de 1 caractere que indica se o comando possui ou não retorno
de dados, onde:
"0": para não retornar dados.
"1": para retornar dados.
cTamDados : STRING com o valor de tamanho do parâmetro cBufferEnviado.

Obs: mesmo possuindo o termo "RS485" (criado quando os modelos do SB-2030 eram de rede serial RS-485), a função também é compatível para o modelo SB-2030E (TCP/IP).

- Escrevendo uma Mensagem no Display do Usuário

Adicione um novo botão chamado "Imprime Mensagem" e insira o seguinte código:

procedure TForm1.Button3Click(Sender: TObject);
var
cStatusSB2000 : string;
cBufferRetornoSB2000 : string;
cBufferEnviado : string;
cComando : string;
cNumeroTerminal : string;
cNumeroProcesso : string;
cEnviaStatus : string;
cTemRetorno : string;
cTamDados: string;

iConta : integer;
iRetorno : integer;
begin
{ Imprime uma mensagem no Display do Usuário.
Função printfU do SDK. }

for iConta := 1 to 2 do cStatusSB2000 := cStatusSB2000 + ‘ ‘;
for iConta := 1 to 256 do cBufferRetornoSB2000 := cBufferRetornoSB2000 + ‘ ‘;

cComando := ‘117?;
cNumeroTerminal := ‘1?;
cNumeroProcesso := ‘0001?;
cEnviaStatus := ‘1?;
cTemRetorno := ‘0?;
cBufferEnviado := ‘U,TESTE DE MENSAGEM NO DISPLAY !!!’;
cTamDados := inttostr( length( cBufferEnviado ) );

iRetorno := Bematech_SB_RS485_EnviaCmdTamanho( cComando, cNumeroTerminal, cNumeroProcesso, cEnviaStatus, cBufferEnviado, cStatusSB2000, cBufferRetornoSB2000, cTemRetorno, cTamDados );
end;

- Ligando o Cursor no Display do Usuário

Adicione um novo botão chamado "Liga Cursor" e insira o seguinte código:

procedure TForm1.Button4Click(Sender: TObject);
var
cStatusSB2000 : string;
cBufferRetornoSB2000 : string;
cBufferEnviado : string;
cComando : string;
cNumeroTerminal : string;
cNumeroProcesso : string;
cEnviaStatus : string;
cTemRetorno : string;
cTamDados: string;

iConta : integer;
iRetorno : integer;
begin
{ Liga o cursor no Display do Usuário.
Função setcursorU( ON ) do SDK. }

for iConta := 1 to 2 do cStatusSB2000 := cStatusSB2000 + ‘ ‘;
for iConta := 1 to 256 do cBufferRetornoSB2000 := cBufferRetornoSB2000 + ‘ ‘;

cComando := ‘115?;
cNumeroTerminal := ‘1?;
cNumeroProcesso := ‘0001?;
cEnviaStatus := ‘1?;
cTemRetorno := ‘0?;
cBufferEnviado := ‘U,3?;
cTamDados := inttostr( length( cBufferEnviado ) );

iRetorno := Bematech_SB_RS485_EnviaCmdTamanho( cComando, cNumeroTerminal, cNumeroProcesso, cEnviaStatus, cBufferEnviado, cStatusSB2000, cBufferRetornoSB2000, cTemRetorno, cTamDados );
end;

- Solicitando uma String do Teclado

Adicione um novo botão chamado "Pede String" e insira o seguinte código:

procedure TForm1.Button5Click(Sender: TObject);
var
cStatusSB2000 : string;
cBufferRetornoSB2000 : string;
cBufferEnviado : string;
cComando : string;
cNumeroTerminal : string;
cNumeroProcesso : string;
cEnviaStatus : string;
cTemRetorno : string;
cTamDados: string;

iConta : integer;
iRetorno : integer;
begin
{ Habilita uma entrada de STRING via teclado.
Função getstring do SDK. }

for iConta := 1 to 2 do cStatusSB2000 := cStatusSB2000 + ‘ ‘;
for iConta := 1 to 256 do cBufferRetornoSB2000 := cBufferRetornoSB2000 + ‘ ‘;

cComando := ‘130?;
cNumeroTerminal := ‘1?;
cNumeroProcesso := ‘0001?;
cEnviaStatus := ‘1?;
cTemRetorno := ‘0?;
cBufferEnviado := ‘20,8,NULL,NULL’;
cTamDados := inttostr( length( cBufferEnviado ) );

iRetorno := Bematech_SB_RS485_EnviaCmdTamanho( cComando, cNumeroTerminal, cNumeroProcesso, cEnviaStatus, cBufferEnviado, cStatusSB2000, cBufferRetornoSB2000, cTemRetorno, cTamDados );
end;

- Recebendo uma String do Teclado

Adicione um novo botão chamado "Recebe String" e insira o seguinte código:

procedure TForm1.Button6Click(Sender: TObject);
var
cStatusSB2000 : string;
cBufferRetornoSB2000 : string;
cBufferEnviado : string;
cComando : string;
cNumeroTerminal : string;
cNumeroProcesso : string;
cEnviaStatus : string;
cTemRetorno : string;
cTamDados: string;

iConta : integer;
iRetorno : integer;
begin
{ Recebe uma String do Teclado. }

for iConta := 1 to 2 do cStatusSB2000 := cStatusSB2000 + ‘ ‘;
for iConta := 1 to 256 do cBufferRetornoSB2000 := cBufferRetornoSB2000 + ‘ ‘;

cComando:= ‘101?;
cNumeroTerminal := ‘1?;
cNumeroProcesso := ‘0001?;
cEnviaStatus := ‘1?;
cTemRetorno := ‘1?;
cBufferEnviado := ‘0001?;
cTamDados := inttostr( length( cBufferEnviado ) );

iRetorno := Bematech_SB_RS485_EnviaCmdTamanho( cComando, cNumeroTerminal, cNumeroProcesso, cEnviaStatus, cBufferEnviado, cStatusSB2000, cBufferRetornoSB2000, cTemRetorno, cTamDados );

if ( copy( cStatusSB2000, 1, 1 ) = ‘1? ) and( copy( cBufferRetornoSb2000, 1, 1 ) <> ‘2? ) then
Application.MessageBox( pchar( copy( cBufferRetornoSb2000, 3, length( cBufferRetornoSb2000 ) - 2 ) ), ‘Informação’, MB_ICONINFORMATION + MB_OK )
else
Application.MessageBox( ‘Não há dados !’, ‘Informação’, MB_ICONINFORMATION + MB_OK );

if copy( cBufferRetornoSb2000, 1, 1 ) = ‘2? then
Application.MessageBox( ‘Erro no retorno do Processo !’, ‘Erro’,
MB_ICONERROR + MB_OK )
else
Application.MessageBox( ‘Número do Processo OK !’, ‘Informação’, MB_ICONINFORMATION + MB_OK );
end;

- Verificando qual tecla foi pressionada

Adicione um novo botão chamado "Verifica Tecla Pressionada" e insira o seguinte código:

procedure TForm1.Button7Click(Sender: TObject);
var
cStatusSB2000 : string;
cBufferRetornoSB2000 : string;
cBufferEnviado : string;
cComando : string;
cNumeroTerminal : string;
cNumeroProcesso : string;
cEnviaStatus : string;
cTemRetorno : string;
cTamDados: string;

iConta : integer;
iRetorno : integer;
begin
{ Verifica qual tecla foi pressionada no SB-2030E.
Função waitkey do SDK. }

for iConta := 1 to 2 do cStatusSB2000 := cStatusSB2000 + ‘ ‘;
for iConta := 1 to 256 do cBufferRetornoSB2000 := cBufferRetornoSB2000 + ‘ ‘;

cComando := ‘134?;
cNumeroTerminal := ‘1?;
cNumeroProcesso := ‘0001?;
cEnviaStatus := ‘1?;
cTemRetorno := ‘1?;
cBufferEnviado := ‘0001?;
cTamDados := inttostr( length( cBufferEnviado ) );

iRetorno := Bematech_SB_RS485_EnviaCmdTamanho( cComando, cNumeroTerminal, cNumeroProcesso, cEnviaStatus, cBufferEnviado, cStatusSB2000, cBufferRetornoSB2000, cTemRetorno, cTamDados );

if ( copy( cStatusSB2000, 1, 1 ) = ‘1? ) and ( trim( cBufferRetornoSb2000 ) <> ” ) then
Application.MessageBox( pchar( copy( cBufferRetornoSb2000, 1, length( cBufferRetornoSb2000 ) ) ), ‘Informação’, MB_ICONINFORMATION + MB_OK )
else
Application.MessageBox( ‘Não há dados !’, ‘Informação’, MB_ICONINFORMATION + MB_OK );
end;

Assim, já temos o "caminho das pedras" para implementar outros comando e controlar o micro-terminal SB-2030E remotamente pela aplicação.

André Luiz R. Munhoz

André Luiz R. Munhoz - Bematech: DSP - Desenvolvimento de Software e Parcerias.
Visite o site: http://www.bematech.com.br.