O
FiscNET é o protocolo de comunicação de alto nível utilizado nos equipamentos da série Logger desenvolvidos pela empresa ZPM, e várias empresas fabricantes de ECF, que tem a ZPM como O.E.M, utilizam esse protocolo em seus equipamentos.
Sugiro que o manual de programação do protocolo seja lido de cabo a rabo, se precisarem de alguma ajuda com o mesmo podem entrar em contato ai que posso tentar ajudar. O download do manual pode ser feito aqui:
Abaixo seguem alguns trechos do manual que acho que podem dar uma introdução básica sobre o funcionamento do mesmo.
O protocolo FiscNET possui comandos de controle fiscal comandados sempre por um mestre (geralmente o computador) e obedecidos por um escravo (equipamento fiscal).
Os comandos são enfileirados para execução no equipamento fiscal e seu tempo de execução dependerá de diversos fatores como velocidade de impressão do mecanismo em uso, tempo de processamento do comando por parte do processador do equipamento fiscal e disponibilidade de recursos para sua execução como papel, por exemplo.
O conceito de fila de execução em equipamentos fiscais obriga à execução síncrona dos comandos, isto é, um comando precisa necessariamente ser concluído antes que um novo comando possa ser processado.
A configuração de comunicação para o protocolo FiscNET é a seguinte:
- Baudrate 115200 bps
- 8 data bits
- Paridade par
- 1 stop bit
Estrutura dos comandos:
A estrutura dos pacotes de dados do protocolo FiscNET é uma seqüência de caracteres ASCII dividida em seções, separadas pelo caracter ponto e vírgula (";"), onde cada seção possui a seguinte finalidade:
1ª seção:
Número de identificação do comando. É um número gerado pelo mestre da rede entre ZERO e 255 e deve ser diferente a cada novo comando enviado ao ECF (pelo menos não deve ser repetido num intervalo de 50 comandos). Como sugestão pode ser implementado como um número de auto incremento dos comandos. A finalidade desta número é identificar a que comando os retornos enviados pelo ECF se referem. Opcionalmente este identificador de comando pode ser preenchido em ZERO, caso em que não serão aceitos comandos enfileirados para execução.
2ª seção:
Quando enviado pelo mestre: Nome do comando. Quando enviado pelo escravo: Código de retorno.
3ª seção:
Quando enviado pelo mestre: Parâmetros do comando. Quando enviado pelo escravo: Parâmetros de retorno.
4ª seção:
Opcional: Tamanho do comando em bytes. Incluindo todos os espaços e caracteres especiais até o início desta seção. Se o comando recebido contiver esta seção o equipamento comandado também retornará esta seção na resposta. Esta seção serve como um verificador para o pacote.
Todos os comandos são identificados por uma constante ASCII. Cada comando pode ou não possuir parâmetros. Se houver a necessidade de informar mais de um parâmetro para um determinado comando, deverá ser informada uma lista de parâmetros na seção dos parâmetros. A lista de parâmetros exige um espaço que separe um parâmetro do outro.
Exemplo de comando sem parâmetros:
{172;EmiteLeituraX;;19}
Neste caso a primeira seção contém o valor 172 identificando o comando. A segunda seção contém o comando desejado EmiteLeituraX. Como este comando não requer parâmetros a terceira seção está vazia e a quarta está preenchida com o tamanho do comando desde o início da 1a até o início da 4a seção.
Exemplo de comando com um parâmetro:
{202;AvancaPapel;Avanco=100;}
Nesse caso note que a terceira seção contém o parâmetro para o comando AvancaPapel, e a quarta seção esta vazia, nesse caso a resposta enviada pelo escravo também não conterá nada nesta seção, porém é ressaltado no manual de programação que "O tamanho é fundamental como mecanismo de verificação da integridade do comando (sic)".
Exemplo de comando com uma lista de parâmetros:
{204;DefineAliquota;CodAliquotaProgramavel=2 PercentualAliquota=10;}
Bem, não vou me prolongar nesse assunto pois a intenção do artigo não é essa, mais uma vez sugiro o estudo do manual de programação do mesmo, e qualquer dúvida ou dificuldade não exitem em prender o grito aí.