Edición 11 - Interpretando retornos y status de las Impresoras Fiscales Bematech utilizando BemaFI32.dll
En esta edición, serán expuestos métodos para trabajar con la librería BemaFI32.dll, utilizada para impresoras fiscales matriciales. Específicamente, trataremos informaciones sobre el archivo de Log para depuración de errores que ocurran en la etapa de desarrollo y producción, y el tratamiento de retornos y alertas mientras estés desarrollando la aplicación para compatibilizarlo con nuestra impresora.
En nuestra sección de descargas encuentras el paquete BemaFI32_ES.zip con la última versión de la DLL para su instalación, o si prefiere, haga clic aquí. Acompañan éste archivo:
- BemaFI32.dll, librería dll fiscal
- BemaFI32.ini, archivo de parámetros del dll
- BemaFI32_ES.chm, archivo de ayuda, con explicación de todo el procedimiento de configuración e instalación, todas las funciones con parámetros y retornos que componen la BemaFI32.dll
Después de seguir los pasos iniciales descritos en el archivo de ayuda BemaFI32_ES.chm:
- Configuración (BemaFI32.ini),
- Declaración del DLL en el lenguaje de su aplicativo,
- Programar funciones generales de inicialización como Símbolo de Moneda, Espacio entre Líneas, Valores de Alícuotas, etc. Su programa está listo para que empieces propiamente la etapa de programación.
Obs.: En el manual de la impresora MP-20 FI II que encuentras en la sección de descargas de nuestro sitio Web, hay un capítulo específico (capítulo 13 - pág. 192) que trata de las etapas que, como programador, debes seguir al desarrollar el aplicativo para utilizar nuestras impresoras.
En este proceso de desarrollo, su software tendrá de tratar los retornos de la impresora. Hay, de manera general, dos modos para realizar eso, y estos son:
- Utilizar variables y funciones (de la librería) de retorno y trabajar estos valores en su programa o,
- Utilizar archivos de log en txt creados con informaciones de status o retornos de la impresora.
La opción para uso de estos archivos log fue creada con objetivo de atender las necesidades específicas que algunos lenguajes de programación tienen para tratar retornos. Usualmente se utiliza el primer modo y éste será el tratado con más detalles en seguida.
En la llamada de cada función del dll es necesario realizar la lectura del status de la impresora para verificar si hubo algún error, cualquier que sea su naturaleza (error de transmisión, fin de papel, o en el caso de una venta si la tasa no está registrada, etc). Y el status de la impresora es transmitido al aplicativo vía 3 bytes, a saber: Ack, St1 y St2. La interpretación correspondiente a cada bit seteado, o no, sigue la siguiente tabla:
|
Composicion del Byte de Retorno |
Mensaje de la Impresora |
Valor de Retorno |
|
bit 7
|
fin de papel
|
128
|
|
bit 6
|
poco papel
|
64
|
|
bit 5
|
error en el reloj
|
32
|
|
bit 4
|
impresora con error
|
16
|
|
bit 3
|
primer dato de CMD no fue ESC(1Bh)
|
8
|
|
bit 2
|
comando inexistente
|
4
|
|
bit 1
|
cupón fiscal abierto
|
2
|
|
bit 0
|
número del parámetro de CMD inválido
|
1
|
|
Composicion del Byte de Retorno |
Mensaje de la Impresora |
Valor de Retorno |
|
bit 7
|
tipo de parámetro de CMD inválido
|
128
|
|
bit 6
|
memoria fiscal llena
|
64
|
|
bit 5
|
error en la memoria RAM CMOS no volatil
|
32
|
|
bit 4
|
alícuota no programada
|
16
|
|
bit 3
|
capacidad de alícuota agotada
|
8
|
|
bit 2
|
cancelamiento no permitido
|
4
|
|
bit 1
|
Id Fiscal del propietário no programados
|
2
|
|
bit 0
|
comando no ejecutado
|
1
|
Lógica de tratamiento:
- Cada byte está compuesto de 8 bits. Cada bit, dentro de un byte, tiene un valor, conforme la tabla de arriba.
- El valor recibido de la impresora para St1 y St2 debe ser comparado con cada bit.
- El código en Visual Basic abajo, es un ejemplo de como su aplicación puede controlar los diversos estados de la impresora fiscal descritos en la tabla. Para recibir estos estados se utiliza la función Bematech_FI_RetornoImpresora, conforme sigue:
iRetorno = Bematech_FI_RetornoImpressora(Ack, St1, St2)
If Ack = 21 Then
MsgBox "Status de la Impresora: 21" & vbCr & vbLf & "Comando no ejecutado", vbOKOnly + vbCritical, "Error"
End If
If (St1 <> 0 Or St2 <> 0) Then
sMsg = ""
'Codificando el St1
If St1 >= 128 Then 'bit 7
St1 = St1 - 128
sMsg = sMsg & vbCr & vbLf & "Fin de Papel"
End If
If St1 >= 64 Then 'bit 6
St1 = St1 - 64
sMsg = sMsg & vbCr & vbLf & "Poco Papel"
End If
If St1 >= 32 Then 'bit 5
St1 = St1 - 32
sMsg = sMsg & vbCr & vbLf & "Error en el Reloj"
End If
If St1 >= 16 Then 'bit 4
St1 = St1 - 16
sMsg = sMsg & vbCr & vbLf & "Impresora en Error"
End If
If St1 >= 8 Then 'bit 3
St1 = St1 - 8
sMsg = sMsg & vbCr & vbLf & "Comando no empezado con ESC"
End If
If St1 >= 4 Then 'bit 2
St1 = St1 - 4
sMsg = sMsg & vbCr & vbLf & "Comando Inexistente"
End If
If St1 >= 2 Then 'bit 1
St1 = St1 - 2
sMsg = sMsg & vbCr & vbLf & "Cupo Abierto"
End If
If St1 >= 1 Then 'bit 0
St1 = St1 - 1
sMsg = sMsg & vbCr & vbLf & "Número de Parámetro(s) Inválido(s)"
End If
'Codificando o St2
If St2 >= 128 Then 'bit 7
St2 = St2 - 128
sMsg = sMsg & vbCr & vbLf & "Tipo de Parámetro de Comando Inválido"
End If
If St2 >= 64 Then 'bit 6
St2 = St2 - 64
sMsg = sMsg & vbCr & vbLf & "Memoria Fiscal Llena"
End If
If St2 >= 32 Then 'bit 5
St2 = St2 - 32
sMsg = sMsg & vbCr & vbLf & "Error en la Memoria RAM"
End If
If St2 >= 16 Then 'bit 4
St2 = St2 - 16
sMsg = sMsg & vbCr & vbLf & "Alícuota No Programada"
End If
If St2 >= 8 Then 'bit 3
St2 = St2 - 8
sMsg = sMsg & vbCr & vbLf & "Capacidad de Alícuotas Llenada"
End If
If St2 >= 4 Then 'bit 2
St2 = St2 - 4
sMsg = sMsg & vbCr & vbLf & "Anulación No Permitida"
End If
If St2 >= 2 Then 'bit 1
St2 = St2 - 2
sMsg = sMsg & vbCr & vbLf & "Identificación Fiscal del Propietario No Programada"
End If
If St2 >= 1 Then 'bit 0
St2 = St2 - 1
sMsg = sMsg & vbCr & vbLf & "Comando No Ejecutado"
End If
MsgBox sMsg, vbOKOnly + vbInformation, "Status Impresora"
End If
Del análisis de la tabla, se puede concluir que si el comando fue ejecutado con éxito y ningún otro error o alerta ocurra, el status de la impresora inmediatamente será: 6,0,0. (Ack, St1, St2 respectivamente). O sea, su programa debe buscar el error o alerta correspondiente siempre que al ejecutar una lectura del status, lea algo distinto de aquél valor.
Para auxiliar ésta verificación y el desarrollo, el archivo de configuración BemaFI32.ini posee 2 claves: El uso StatusFunction (StatusFunction=1), activa una funcionalidad de la librería dll que automáticamente en la ejecución de cada función, realiza una lectura del status de la impresora. En el caso de éste ser diferente de 6,0,0 el retorno de aquella función será -27. O sea, su programa solamente en estos casos de retorno -27 necesitará hacer la lectura del status de la impresora (Bematech_FI_RetornoImpresora) para depurar su error o alerta actual. La clave Log=1, habilita la creación de un log relativo a toda comunicación hecha con la impresora. Es una facilidad para el proceso de desarrollo pues permite que el programador mismo abra éste archivo, y busque ahí los retornos de la impresora a toda función que su software ejecute sin la necesidad de desarrollar previamente su aplicación para que exhiba estos retornos en la pantalla. La dirección donde será creado el BEMAFI32.LOG es definida por otra clave del BemaFI32.ini, "Path" que por default es "C:\". Ejemplos completos de utilización del DLL en diversos lenguajes están disponibles en nuestro sitio. Entra a nuestra sección de descargas haciendo click aquí.
- StatusFuncion
- Log
