Marquin escreveu:Boa tarde,
Alguem poderia me ajudar referente ao retorno da impressora fiscal. do tipo: se o papel esta pouco ou se o comando não foi executado e etc...
Não estou conseguindo a logica para fazer a pergunta
"a impressora não esta respondendo. Continuar?, { "sim", "não" }"
Obrigados a todos pela atenção
Marquin
Boa tarde amigo,
Eu faço a pergunta de acordo com o que a impressora retorna. Primeiro eu preencho uma matriz com os retornos do ecf:
**--- ST1
AADD(aST1,{" 7 Fim de papel ","F"})
AADD(aST1,{" 6 Impressora com pouco papel ","T"})
AADD(aST1,{" 5 Erro no rel¢gio ","F"})
AADD(aST1,{" 4 Impressora em erro ","F"})
AADD(aST1,{" 3 Primeiro dado de CMD nao foi ESC (1Bh) ","F"})
AADD(aST1,{" 2 Comando inexistente ","F"})
AADD(aST1,{" 1 Impressora com Cupom aberto ",""})
AADD(aST1,{" 0 N£mero de parƒmetros de CMD inv lido ","F"})
**--- ST2
AADD(aST2,{" 7 Tipo de parƒmetro de CMD inv lido ","F"})
AADD(aST2,{" 6 Mem¢ria fiscal lotada ","F"})
AADD(aST2,{" 5 Erro na Mem¢ria RAM CMOS nao vol til ","F"})
AADD(aST2,{" 4 Al¡quota nao programada ","F"})
AADD(aST2,{" 3 Capacidade de al¡quotas program veis lotada ","F"})
AADD(aST2,{" 2 Cancelamento nÆo permitido ","F"})
AADD(aST2,{" 1 CGC/IE do propriet rio nao programados ","F"})
AADD(aST2,{" 0 Comando nao executado ","F"})
Depois envio o comando e pego o retorno:
**--- Envia sequencia de bytes para impressora
**************************************************************************************
FUNCTION COMUNICA_COM_ECF(buffer_a_ser_enviado,InicioRetorno,LenRetorno,StringRetorno)
LOCAL nErro:=0
IF UPPER(cMarca_Ecf)==[BEMATECH]
IF cTipoDriver_Ecf==[1]
FWRITE(NUMERO_PORTA, @buffer_a_ser_enviado, LEN(buffer_a_ser_enviado))
ELSEIF cTipoDriver_Ecf==[2]
IF !ECFGRAVAARQ(buffer_a_ser_enviado)
RETURN(.F.)
ENDIF
ELSEIF cTipoDriver_Ecf==[3]
ECFGRAVAARQ(buffer_a_ser_enviado)
!BEMAFI.EXE
ENDIF
ELSEIF UPPER(cMarca_Ecf)==[SWEDA]
IF cTipoDriver_Ecf==[1]
set device to printer
set printer to ifsweda
@ prow(),pcol() say buffer_a_ser_enviado
set printer to
set device to screen
ELSEIF cTipoDriver_Ecf==[3]
IF !ECFGRAVAARQ(buffer_a_ser_enviado)
RETURN(.F.)
ENDIF
ENDIF
ELSEIF UPPER(cMarca_Ecf)==[DARUMA]
IF !ECFGRAVAARQ(buffer_a_ser_enviado)
RETURN(.F.)
ENDIF
ENDIF
nErro := VER_STATUS(InicioRetorno,LenRetorno,@StringRetorno)
IF nErro=0
RETURN(.T.)
ELSE
RETURN(.F.)
ENDIF
Depois no Ver_Status do Ecf jogo a mensagem para o operador:
**************************************************************
FUNCTION VER_STATUS(pInicioRetorno,pLenRetorno,pStringRetorno)
LOCAL iArqStatus, iTamArqStatus, iTamArqRetorno
LOCAL ack,st1,st2,Sinal,Letra,nTentativas,H:=0,nRetorno:=0,retecf:=""
pInicioRetorno:=IF(pInicioRetorno==NIL,0,pInicioRetorno)
pLenRetorno :=IF(pLenRetorno==NIL,0,pLenRetorno)
pStringRetorno:=IF(pStringRetorno==NIL,"",pStringRetorno)
nTentativas := 0
Buffer :=" "
IF UPPER(cMarca_Ecf)==[SWEDA]
nRetorno:=0
IF cTipoDriver_Ecf ==[1]
Numero_Porta := fopen("ifsweda.prn")
retecf := freadstr(Numero_Porta,128)
fclose(Numero_Porta)
ELSEIF cTipoDriver_Ecf ==[3]
Numero_Porta := fopen(cEcfDirRet+"\SW_RESP.CMD")
retecf := freadstr(numero_porta,128)
fclose(numero_porta)
ECFDELETAARQ(cEcfDirRet+"\SW_RESP.CMD")
ENDIF
IF EMPTY(retecf)
DIALOGUE({" Falha na Comunica‡Æo com o Ecf! "})
tone(400, 2)
nRetorno:=1
ENDIF
Sinal := SUBST(retecf, 2, 1)
Letra := SUBST(retecf, 3, 1)
aut := SUBST(retecf, 4, 1)
slip := SUBST(retecf, 5, 1)
Bobina:= SUBST(retecf, 6, 1)
IF Sinal == "-"
tone(400, 2)
nRetorno:=1
aMSG:=TRATAMSG(retecf)
IF !EMPTY(aMsg)
DIALOGUE(aMsg)
ENDIF
IF Letra == "P"
MSG:={}
DO CASE
CASE aut = "0"
// AADD(MSG," AUT: H documento para autenticar ")
CASE aut = "1"
AADD(MSG," AUT: Impressora off-line ")
CASE aut = "2"
AADD(MSG," AUT: Time-out de Transmissao ")
CASE aut = "5"
AADD(MSG," AUT: Sem documento para autenticar ")
CASE aut = "6"
AADD(MSG," AUT: Sem documento ou resposta ")
ENDCASE
DO CASE
CASE slip = "0"
// AADD(MSG," SLIP: H folha presente ")
CASE slip = "1"
AADD(MSG," SLIP: Impressora off-line ")
CASE slip = "2"
AADD(MSG," SLIP: Time-out de Transmissao ")
CASE slip = "5"
AADD(MSG," SLIP: Sem folha solta presente ")
CASE slip = "6"
AADD(MSG," SLIP: Time-out de recepcao ")
ENDCASE
DO CASE
CASE Bobina = "0"
//AADD(MSG," Bobina: Impressora tem papel ")
CASE Bobina = "1"
AADD(MSG," Bobina: Impressora off-line ")
CASE Bobina = "2"
AADD(MSG," Bobina: Time-out de Transmissao ")
CASE Bobina = "3"
AADD(MSG," Bobina: Sem papel, lado Jornal ")
CASE Bobina = "4"
AADD(MSG," Bobina: Sem papel, lado cupom ")
CASE Bobina = "5"
AADD(MSG," Bobina: Sem papel, cupom e jornal ")
CASE Bobina = "6"
AADD(MSG," Bobina: Time-out de recepcao ")
ENDCASE
DIALOGUE(MSG)
ENDIF
ELSEIF Sinal == "+"
nRetorno:=0
IF Letra == [G]
IF Bobina == "0"
//DIALOGUE({" Gaveta Aberta "})
ELSEIF Bobina == "1"
//DIALOGUE({" Gaveta Fechada "})
ENDIF
ELSEIF Letra==[C]
ENDIF
IF TEM_LETRA(Letra)
pStringRetorno:= SUBST(RetEcf,4,AT("}",RetEcf)-1)
ELSE
pStringRetorno:= SUBST(RetEcf,3,AT("}",RetEcf)-1)
ENDIF
pStringRetorno:= SUBST(pStringRetorno,pInicioRetorno,pLenRetorno)
ENDIF
RETURN(nRetorno)
ELSE
IF UPPER(cMarca_Ecf)==[BEMATECH]
IF cTipoDriver_Ecf==[1] // Usando Driver Dos
PROCESSO(@H,"Lendo status da impressora...")
**--- Pega ack
ack := ""
fread(Numero_Porta, @Buffer, 1 )
ack := asc(Buffer)
**--- Pega ST1
st1 := ""
fread(Numero_Porta, @Buffer, 1 )
st1 := ASC(Buffer)
**--- Pega ST2
st2 := ""
fread(Numero_Porta, @Buffer, 1 )
st2 := ASC(Buffer)
**--- Pega String de Retorno
**--------------------------
pStringRetorno := ""
for x:= 1 to pLenRetorno
fread( Numero_Porta, @Buffer, 1 )
if Buffer = "," .OR. Buffer = "" .OR. Buffer = " " .OR. ASC(Buffer)=0
EXIT
else
pStringRetorno += Buffer
endif
next x
ELSEIF cTipoDriver_Ecf==[2] .OR. cTipoDriver_Ecf==[3] // Usando Comunica‡Æo direta
DO WHILE .T.
IF FILE(cEcfDirRet+"\STATUS.TXT" ) .AND. FREADSTR(FILE( cEcfDirRet+"\STATUS.TXT" ) ) <> "0"
iArqStatus := FOpen( cEcfDirRet+"\STATUS.TXT" )
iTamArqStatus := FSeek( iArqStatus, 0, 2 )
FClose( iArqStatus )
iArqStatus := FOpen( cEcfDirRet+"\STATUS.TXT" )
sRetorno := " "
sDadosStatus:= ""
For x := 1 to iTamArqStatus
FRead( iArqStatus, @sRetorno, 1 )
sDadosStatus = sDadosStatus + sRetorno
Next
FClose( iArqStatus )
IF EMPTY(sDadosStatus)
LOOP
ENDIF
sinal := sdadosstatus
**--- Pega ACK
ack := ""
IF cTipoDriver_Ecf==[2]
ack := SUBST(sDadosStatus,1,AT(",",sDadosStatus)-1)
sDadosStatus:=SUBST(sDadosStatus,AT(",",sDadosStatus)+1)
ELSE
ack := SUBST(sDadosStatus,1,3)
sDadosStatus:=SUBST(sDadosStatus,4)
ENDIF
**--- Pega ST1
st1 := ""
IF cTipoDriver_Ecf==[2]
st1 := SUBST(sDadosStatus,1,AT(",",sDadosStatus)-1)
sDadosStatus:=SUBST(sDadosStatus,AT(",",sDadosStatus)+1)
ELSE
st1 := SUBST(sDadosStatus,1,3)
sDadosStatus:=SUBST(sDadosStatus,4)
ENDIF
**--- Pega ST2
st2 := ""
IF cTipoDriver_Ecf==[2]
st2 := SUBST(sDadosStatus,1,AT(CHR(13)+CHR(10),sDadosStatus)-1)
sDadosStatus:=SUBST(sDadosStatus,AT(CHR(13)+CHR(10),sDadosStatus)+1)
ELSE
st2 := SUBST(sDadosStatus,1,3)
sDadosStatus:=SUBST(sDadosStatus,4)
ENDIF
ack := val(ack)
st1 := val(st1)
st2 := val(st2)
IF File (cEcfDirRet+"\RETORNO.TXT" )
iArqRetorno := FOpen( cEcfDirRet+"\RETORNO.TXT" )
iTamArqRetorno := FSeek( iArqRetorno, 0, 2 )
FClose( iArqRetorno )
iArqRetorno := FOpen( cEcfDirRet+"\RETORNO.TXT" )
sRetorno := " "
sDadosRetorno := ""
For x := 1 to iTamArqRetorno
FRead( iArqRetorno, @sRetorno, 1 )
sDadosRetorno = sDadosRetorno + sRetorno
Next
pStringRetorno := sDadosRetorno
FClose( iArqRetorno )
//delete file( cEcfDirRet+"\RETORNO.TXT" )
ENDIF
EXIT
ENDIF
ENDDO
ENDIF
ELSEIF UPPER(cMarca_Ecf)==[DARUMA]
nTamanhoRetorno:=0
DO WHILE nTamanhoRetorno==0
PROCESSO(@H,"Lendo Conte£do do Arquivo...")
nHandle :=FOPEN("C:\DARUMA.RET")
nTamanhoRetorno:=FSEEK(nHandle,0,FS_END)
FCLOSE(nHandle)
ENDDO
/* Pega o retorno da impressora */
nHandle:=FOPEN("C:\DARUMA.RET")
nPosRetorno:=0
cRetornoCMD:=" "
cAuxiliar :=" "
IF nTamanhoRetorno > 0
FOR nPosRetorno:=1 TO nTamanhoRetorno-1
FREAD(nHandle,@cAuxiliar,1)
IF cAuxiliar <> CHR(13)
cRetornoCMD:=cRetornoCMD+cAuxiliar
ENDIF
NEXT
ENDIF
FCLOSE(nHandle)
cRetornoCMD := ALLTRIM(cRetornoCMD)
pStringRetorno:= SUBST(STRTRAN(cRetornoCMD,";"),13)
**-- Pega ACK
ack:=" "
ack:=SUBST(cRetornoCMD,5,3)
**-- Pega ST1
st1:=" "
st1:=SUBST(cRetornoCMD,9,3)
**-- Pega ST2
st2:=" "
st2:=SUBST(cRetornoCMD,13,3)
ack:=val(ack)
st1:=val(st1)
st2:=val(st2)
ENDIF
RESULT := ""
aMsg := {" Aten‡Æo ",;
" "}
***--- Verificando ack
IF ack<>6
AADD(aMsg,"Erro de Comunica‡ao o ECF retornou ACK="+alltrim(str(ack))+" ")
RESULT+="P"
ENDIF
***--- Verificando o st1
FOR I:=1 TO LEN(aBits)
IF ST1 >= aBits
IF ST1 <> 2
AADD(aMsg,aST1[I,1])
ENDIF
ST1 -= aBits
RESULT+=aST1[I,2]
ENDIF
NEXT
***---- Verificando o ST2
FOR I:=1 TO LEN(aBits)
IF ST2 >= aBits
AADD(aMsg,aST2[I,1])
ST2 -= aBits
RESULT+=aST2[I,2]
ENDIF
NEXT
IF LEN(aMsg)>2
DIALOGUE(aMsg)
IF EMPTY(RESULT)
nRetorno:=0
ELSE
IF "F" $ RESULT ; nRetorno:=1 ; ENDIF
IF "P" $ RESULT ; nRetorno:=9 ; ENDIF
ENDIF
ECFERROR(aMsg,ack,st1,st2)
ENDIF
ENDIF
RETURN(nRetorno)
Espero que tenha ajudado. Qualquer dúvida entre em contato pelo msn geraldo_p_franca@hotmail.com ou skype gpfranca.