Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Manejo OCX impresora Fiscal Epson nueva generación


fastpho
10 de abril de 2017, 23:27
Hola Amigos tengo problemas con la ocx de las impresoras Fiscales de la nueva generacion
alguien esta trabajando con ella ?

Saludos y gracias

Kuk
11 de abril de 2017, 09:16
fastpho, y el resto de los foreros...

Diciendo simplemente "tengo problemas" ¡prácticamente no decís nada! Cuando contáis un problema, dadnos detalles (como qué tipo de error tenéis exactamente) y cuantos más detalles deis mejor os podremos ayudar.

fastpho
12 de abril de 2017, 15:02
Buen dia amigos : Les cuento un poco de cero , la empresa Epson Argentina provee una ocx para
comunicarte con la impresora fiscal , posee comandos para enviarle a la impresora para que haga algo ... Por ejemplo hay un comando que es para saber el estado de la impresora que puede ser fiscal o estado de hardware del impresor los datos hay que mandarlos en hexadecimal cuando ejecuto el comando la fiscal me da el siguiente error : el frame con contiene el minimo aceptado
He bajado un soft que monitorea los datos enviados y comparando con un programa que funciona
en visual comparo lo que yo envio y lo que envia el otro soft y aca les dejo las diferencias:


06 02 99 00 01 1C 00 00 03 30 30 42 42 bien el de visual

06 02 FF 00 1C 00 03 30 31 32 30 mal mi soft




WORKING-STORAGE SECTION.
01 ReturnDEValue PIC S9(9) COMP-5 VALUE 0.
01 LINEA-ESTADO.
03 Comando PIC X VALUE X"00".
03 Comandobis PIC X VALUE X"01".
01 LINEA-EXTRA.
03 DataField1 PIC X VALUE X"00".
03 DataField2 PIC X VALUE X"00".
*01 ReturnString PIC X(12).
*01 Variable PIC 9(3).
PROCEDURE DIVISION.
* abre el puerto
INVOKE EpsonFPHostControl1 "OpenPort" RETURNING ReturnDEValue.
* dato a enviar al impresor
INVOKE EpsonFPHostControl1 "AddDataField" USING LINEA-ESTADO RETURNING ReturnDEValue.
* dato a enviar al impresor
INVOKE EpsonFPHostControl1 "AddDataField" USING LINEA-EXTRA RETURNING ReturnDEValue.
* aca envia el paquete de datos
INVOKE EpsonFPHostControl1 "SendCommand" RETURNING ReturnDEValue.

Kuk
13 de abril de 2017, 08:54
fastpho, ambas colecciones de valores que muestras son bastante más largos que lo que tienes en el código COBOL que has publicado.

¿Tu problema es que no sabes cómo enviar a la impresora un string con estos valores? ¿Tienes algún ejemplo de un programa que funcione, sea en el lenguaje que sea (el de "Visual" por ejemplo)?

También, publica aquí las instrucciones exactas de esa OCX. No hace falta que sea todo el manual, pero un ejemplo de lo que quieres hacer. E intentaremos crear el código desde 0 de nuevo, a lo mejor se te ha escapado algo y es por eso que no te funciona.

fastpho
17 de abril de 2017, 14:41
Gracias Kuk por tu respuesta voy a tratar de explicar y pongo un parte del codigo en visual basic que funciona con la ocx que provee epson , el string ha enviar deben ser valores en hexadecimal por lo que veo de la linea que dice LINEA-ESTADO la ocx se come el valor que dice (01) ... 03 Comandobis PIC X VALUE X"01"
de la linea LINEA-EXTRA se come los valores nulos y me agrega "00"
Las lineas que pege en power cobol corresponde al comando estado
Voy a pegar aqui la linea de visual que funcionan (comando x , comando z y comando estado) :


Case 0
'---------------------------
' Cierre X
'---------------------------
sCmd = Chr$(&H8) + Chr$(&H2)
MsgBox sCmd
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmd)
sCmdExt = Chr$(&HC) + Chr$(&H21)
' sCmdExt = Chr$(&H0) + Chr$(&H1)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmdExt)
If bAnswer Then bAnswer = Me.EpsonFP.SendCommand
Call FPDelay
If Me.EpsonFP.ReturnCode <> 0 Then ShowMsg

Case 1
'---------------------------
' Cierre Z
'---------------------------
sCmd = Chr$(&H8) + Chr$(&H1)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmd)
sCmdExt = Chr$(&HC) + Chr$(&H0)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmdExt)
If bAnswer Then bAnswer = Me.EpsonFP.SendCommand
Call FPDelay
If Me.EpsonFP.ReturnCode <> 0 Then ShowMsg

Case 6
'---------------------------
' Estado
'---------------------------
sCmd = Chr$(&H0) + Chr$(&H1)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmd)
sCmdExt = Chr$(&H0) + Chr$(&H0)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmdExt)
If bAnswer Then bAnswer = Me.EpsonFP.SendCommand
Call FPDelay
ShowMsg
desde ya muchas gracias por su ayuda

Kuk
17 de abril de 2017, 16:02
fastpho, usa los Tag-s de resalto de sintaxis como lo dicen las normas del foro (enlace en mi firma): [Información] "No sé dónde y cómo publicar posts..." - COBOL Foro (http://cobolforo.es/showthread.php?t=561)

En cuanto al código VB que has citado, me parece que te has liado. Estamos hablando de 1 byte cada vez, con lo cual el siguiente


sCmd = Chr$(&H0) + Chr$(&H1)
sCmdExt = Chr$(&HC) + Chr$(&H0)


En COBOL equivale a:


01 sCmd PIC X(2) VALUE X'0001'.
01 sCmdExt PIC X(2) VALUE X'0C00'.


Es decir, que cada valor mencionado en VB se ubique en 1 byte, dando así el conjunto de resultado de llamada de las 2 funciones Chr$ daría un String de un total de 2 bytes.

Haz las modificaciones correspondientes según el ejemplo que te he dado, pruébalo y nos cuentas.

fastpho
18 de abril de 2017, 22:18
Gracias Kuk por tu respuesta pero no me funciona me hace lo mismo que antes, lo que he notado que solo envia el caracter nulo 00 , por que use el comando reporte x y en ese caso si me envia el string que corresponde pero me agrega el caracter nulo

Estado del Impresor

06 02 99 00 01 1C 00 00 03 30 30 42 42 forma correcta soft en vb6

06 02 FF 00 1C 00 03 30 31 32 30 forma incorrecta powercobol


informe x

06 02 FA 08 1B 02 1C 0C 21 03 30 31 36 44 forma correcta soft en vb6

06 02 9C 08 1B 02 00 1C 0C 21 00 03 30 31 30 46 forma incorrecta powercobol

Kuk
19 de abril de 2017, 08:56
fastpho, explícame bien qué son todos estos valores porque la verdad es que no me estoy enterando de dónde vienen tantos si sólo enviamos un par de Bytes... ¿Estos churros de datos de dónde los sacas?

Mira, te voy a traducir exactamente una parte del código, debería ser así que yo sepa:


WORKING-STORAGE SECTION.
01 sCmd PIC X(2) VALUE X'0001'.
01 sCmdExt PIC X(2) VALUE X'0C00'.
01 bAnswer PIC S9(9) COMP-5.
PROCEDURE DIVISION

*> código de antes...............

*> Estado
MOVE X'00' & X'01' TO sCmd

IF bAnswer NOT = ZEROS
INVOKE EpsonFP "AddDataField" USING sCmd RETURNING bAnswer

MOVE X'00' & X'00' TO sCmdExt

IF bAnswer NOT = ZEROS
INVOKE EpsonFP "AddDataField" USING sCmdExt RETURNING bAnswer

IF bAnswer NOT = ZEROS
INVOKE EpsonFP "SendCommand"

CALL "FPDelay"

PERFORM ShowMsg
END-IF
END-IF
END-IF


Rapinto, Dasije, corregidme si me estoy equivocando en algo.

fastpho
19 de abril de 2017, 16:03
Gracias Kuk, esos valores que me preguntas es el string de datos que le envia la ocx de epson al impresor que tiene un formato :
06 (ack) 02 (stx) 99(nro secuencia) 00 01 (comando a ejecutar sCmd) 1C (separador de campo) 00 00 (campo extra sCmdExt) 03 (etx) y los numero restantes checksum 30 30 42 42
Estos valores los puedo ver porque estoy corriendo un programa que monitorea los datos que salen por el puerto serie (com1) donde esta conectada la impresora fiscal
Y el problema que veo es que al comparar los datos enviados por el programa en vb6 a la ocx y lo que envia el powercobol 5.0 a la ocx es el caracter 00
En el caso del comando estado que es sCmd 00 01 y el comando extra que es 00 00 estos valores cuando los envia a la ocx que es el intermediario entre la fiscal y la aplication

Kuk
20 de abril de 2017, 14:52
fastpho, la verdad es que no lo entiendo... Enviamos 2 bytes con los mismos valores... Parece ser que la OCX no recibe lo mismo, si envía cosas diferentes a la impresora.

¿Cual es la codificación del OCX, no será Unicode?

fastpho
20 de abril de 2017, 16:08
Hola Kuk claro vos le mandas a la ocx el comando a ejecutar sobre la impresora y la ocx lo que hace es completar con los datos necesarios para cumplir con el protocolo de comunicacion de la impresora , la ocx es la que se encarga realmente de comunicarse con el impresor y procesar la respuesta del dato enviado.
Cuando uno invoca al comando "SendCommand" Este método retorna verdadero , si las condiciones internas del control son válidas para el inicio de la transacción con la impresora fiscal. Si el estado del control indica que esta cerrado o que existe una operación en progreso el retorno es falso.
Esto es lo que dice la ayuda del comando "AddDataField" :

Descripción

Suma un campo al buffer de comandos.

Parámetro
String

Retorno

Booleano

Requerido
Si

Observaciones

Cada comando que recibe la impresora fiscal esta compuesto comúnmente por varios campos separados por un carácter especial que oficia de separador. Cuando el comando así lo requiera ejecute tantas veces este método, con el campo específico como parámetro, para llenar toda la información que requiera el comando. Este método retorna verdadero si los campos especificados en los parámetros son validos, la siguiente regla se aplica según el tipo del protocolo.


Protocolo compatible son válidos los caracteres entre el 32 y el 255 de la tabla ASCII
Protocolo extendido son válidos los caracteres de toda la tabla ASCII


Si el comando requiere caracteres no imprimibles, utilice la notación específica de su lenguaje de programación para embeber estos.

Voy a subir el ejemplo completo en vb6 y la ayuda de la ocx junto con la ocx

Rapinto
21 de abril de 2017, 00:04
Kuk,

os dados a enviar para a impressora, pelo exemplo Chr$(&H8)
podem ter que ser enviados em decimal e não em hexadecimal.
POderá ter que converter X"0A" para 10.
Eu não conheço a epson fiscale, pois em Portugal não se usa muito.
Só com o OCX e alguma documentação (não tenho a impressora para testar)
é que poderíamos analisar melhor.
(Desculpa escrever em Português).
Un saludo,
Rui Pinto

fastpho
21 de abril de 2017, 00:25
Gracias Rapinto probe de mandar los datos en decimal tambien pero no funciona, con el comando informe x lo que logre ver es que le agrega siempre el caracter 00 despues del comando sCmd y del sCmdExt que no lo hace en el ejemplo de visual.-

Rapinto
21 de abril de 2017, 00:46
Em VB todas as strings terminal com o Hex 00
O cobol não faz isso. Temos que adicionar o Hex 00
por exemplo:

01 aa pic x(015).

move "abcde" to aa.
move x"00" to aa(5:1).

Poderá ser isso?
Rui

Kuk
21 de abril de 2017, 08:55
Em VB todas as strings terminal com o Hex 00
Es vedad, podría ser por eso. Casi todos los lenguajes, al menos bajo Windows, suelen trabajar con "null-terminated strings" y posiblemente el OCX espere por defecto recibir siempre un nulo al final de cada string, de manera implícita... :piensa:

fastpho
21 de abril de 2017, 16:54
voy a probar de mandar esto a ver que hace :
move X'00' & X'01' & X'00' to sCmd.
move X'00' & X'00' & X'00' to sCmdExt

---------- Post añadido : 15:54 ---------- Post anterior : 15:11 ----------

No es al reves el power le manda al final de cada string el caracter X"00" el tema es como sacarlo
cuando es necesario porque para el informe "X" no es necesario enviarlo por que para

move X"08" & X"02" to sCmd.
INVOKE EpsonFPHostControl1 "AddDataField" USING sCmd RETURNING ReturnDEValue.
move X"0C" & X"21" to sCmdExt.
INVOKE EpsonFPHostControl1 "AddDataField" USING sCmdExt RETURNING ReturnDEValue.

y escribe en el puerto
06 02 9C 08 1B 02 00 1C 0C 21 00 03 30 31 30 46
no deberia ir el X"00"
para el caso del informe estado

move X'00' & X'01' to sCmd.
if bAnswer not = zeros
INVOKE EpsonFPHostControl1 "AddDataField" USING sCmd RETURNING bAnswer
move X'00' & X'00' to sCmdExt
if bAnswer not = zeros
INVOKE EpsonFPHostControl1 "AddDataField" USING sCmdExt RETURNING bAnswer

if bAnswer not = zeros
INVOKE EpsonFPHostControl1 "SendCommand" RETURNING bAnswer
CALL "BUSY"
end-if
end-if
end-if.


y escribe en el puerto
06 02 FF 00 1C 00 03 30 31 32 30

Kuk
21 de abril de 2017, 17:29
fastpho, lo siguiente:
No es al reves el power le manda al final de cada string el caracter X"00"

Pasa porque hemos definido los campos como:


01 sCmd PIC X(2) VALUE X'0001'.
01 sCmdExt PIC X(2) VALUE X'0C00'.


Intenta hacer pruebas con:


01 sCmd PIC X(250) VALUE X'0001'.
01 sCmdExt PIC X(250) VALUE X'0C00'.

fastpho
21 de abril de 2017, 23:38
le mande esto para obtener el informe

01 sCmd PIC X(250) VALUE X'0802'.
01 sCmdExt PIC X(250) VALUE X'0C21'.

y es lo mismo que esto

01 sCmd PIC X(4) VALUE X'0802'.
01 sCmdExt PIC X(4) VALUE X'0C21'.

siempre le ponde el x'00' al final de cada campo

---------- Post añadido : 22:38 ---------- Post anterior : 22:29 ----------

tengo que lograr sacarle el "null-terminated strings" para que me funcione

Kuk
22 de abril de 2017, 10:38
siempre le pone el x'00' al final de cada campo

¿Estas seguro de ello? Porque no es normal, en COBOL aunque hagamos

MOVE "A" TO WS-CAMPO *> PIC X(1000)


Se le mueve la "A" en la posición 1 y el resto se rellena de espacios.

Rapinto
24 de abril de 2017, 00:07
fastpho,
Alguns exemplos de Argentina que eu vi, dizem que o OCX é para .Net (Dot.NET)
vi alguns exemplos e usavam Visual Studio 10.
O problema deve ser esse.
Un saludo,
Rui Pinto

fastpho
24 de abril de 2017, 14:54
Gracias Rapinto el ejemplo que yo pase y que estoy trabajando esta en vb6 y funciona bien

Kuk
24 de abril de 2017, 15:21
Rapinto, la tecnología .NET comparte ciertas características con ActiveX, como declaración del contenido de la DLL en el registro de Windows. Pero sigue siendo otra tecnología y no es compartible con ActiveX. Así que en este caso si se hubiera tratado de una biblioteca .NET sería imposible registrarla en PowerCOBOL. Además, estamos hablando de una OCX, esta extensión que yo sepa es exclusiva para ActiveX y nunca se usa en .NET.

fastpho, me sigue pareciendo un sin sentido lo que está pasando... No me entra en la cabeza de dónde y cómo salen los nulos.

Intenta lo siguiente:


WORKING-STORAGE SECTION.
01 sCmd PIC X(250).
01 sCmdExt PIC X(250).

PROCEDURE DIVISION.

MOVE X'0802' TO sCmd (1:2)
MOVE X'0C21' TO sCmdExt(1:2)
MOVE SPACES TO sCmd (3:)
sCmdExt(3:)


Si no te da buen resultado, también añade un nulo al final del campo, o sea:


WORKING-STORAGE SECTION.
01 sCmd PIC X(250).
01 sCmdExt PIC X(250).

PROCEDURE DIVISION.

MOVE X'0802' TO sCmd (1:2)
MOVE X'0C21' TO sCmdExt(1:2)
MOVE SPACES TO sCmd (3:)
sCmdExt(3:)
MOVE X'00' TO sCmd (250:1)
sCmdExt(250:1)

fastpho
24 de abril de 2017, 22:14
Gracias Kuk voy a probar , de todas maneras estoy buscando alguna libreria de kernel32 o de user32 para ver si puedo eliminar el null terminated del string


WORKING-STORAGE SECTION.
01 ReturnDEValue PIC S9(9) COMP-5 VALUE 0.
01 sCmd PIC X(250).
01 sCmdExt PIC X(250).
PROCEDURE DIVISION.
MOVE X'0802' TO sCmd (1:2).
MOVE X'0C21' TO sCmdExt(1:2).
MOVE SPACES TO sCmd (3:)
sCmdExt(3:).
MOVE X'00' TO sCmd (250:1)
sCmdExt(250:1)
INVOKE EpsonFPHostControl1 "OpenPort" RETURNING ReturnDEValue.
INVOKE EpsonFPHostControl1 "AddDataField" USING sCmd RETURNING ReturnDEValue.
INVOKE EpsonFPHostControl1 "AddDataField" USING sCmdExt RETURNING ReturnDEValue.
INVOKE EpsonFPHostControl1 "SendCommand" RETURNING ReturnDEValue.
call "BUSY".
INVOKE EpsonFPHostControl1 "ClosePort" RETURNING ReturnDEValue.


Con este codigo me manda esto al puerto lo muestro un print screen

Kuk
24 de abril de 2017, 23:36
fastpho, esto para mi quiere decir que es la OCX la que añade los nulos porque el valor X'20' es espacios.

fastpho
25 de abril de 2017, 00:45
no los x'20' los ´pone cuando envio estas lineas

MOVE X'00' TO sCmd (250:1)
sCmdExt(250:1)


---------- Post añadido : 23:36 ---------- Post anterior : 23:31 ----------

Mira ese link kuk
IBM Knowledge Center (https://www.ibm.com/support/knowledgecenter/en/SS6SG3_3.4.0/com.ibm.entcobol.doc_3.4/rllitnul.htm)

---------- Post añadido : 23:45 ---------- Post anterior : 23:36 ----------

IBM Knowledge Center (https://www.ibm.com/support/knowledgecenter/SS6SG3_4.2.0/com.ibm.entcobol.doc_4.2/PGandLR/tasks/tpshr09.htm)

Kuk
25 de abril de 2017, 08:50
fastpho, el formato Z"Mi texto terminado por nulo" no es soportado por Fujitsu. Es soportando por IBM (a partir de cierta versión) y por MicroFocus. Con lo cual no es el caso ;)


no los x'20' los ´pone cuando envio estas lineas
Yo lo que veo en el pantallazo es que hay espacios hasta el final del campo recibido por la OCX y no hay ni un sólo nulo. Pero sigue sin funcionarte, según entiendo... :tonto:

fastpho
25 de abril de 2017, 15:01
En el pantallazo que mande si te fijas bien antes del separador de campo 1c esta el 00 y vuelve a repetir con el scmdext

Kuk
25 de abril de 2017, 15:44
antes del separador de campo 1c esta el 00

A ver, no sé si me estoy liando pero estoy mirando WRITTEN DATA COM1 y no veo ningún nulo. El READ DATA COM1 sí que los contiene pero según entiendo es la salida, o sea la respuesta del COM1 y no lo que se haya enviado a él. WRITTEN DATA COM1 es lo que se le ha enviado, y ahí no hay ningún nulo por medio, sólo los 2 que nosotros fijamos al final del campo en la posición 250.

Con esto quiero decir que seguramente se nos está escapando algo, y el problema no son los nulos.

fastpho
26 de abril de 2017, 15:42
hola Kuk voy a subir la imagen de nuevo y marque en rojo con circulo los x'00'
el write es lo que envia a la impresora
gracias

Kuk
26 de abril de 2017, 17:28
fastpho, esos 2 nulos son los 2 que ponemos al final de cada campo:


MOVE X'00' TO sCmd (250:1)
sCmdExt(250:1)


Es decir, en total añadimos al supuesto "Stack" 2 campos de 250 bytes cada uno, al final de los cuales movemos un nulo.

fastpho
26 de abril de 2017, 22:34
La linea de los nulos las saque por no van e igual me estan apareciendo me tiene loco
Me baje de la pagina de Epson una dll y un .lib
Y viene una ocx tambien y tiene manual

La ocx cuando la quiero insertar me da un error
Voy a seguir probando

Kuk
26 de abril de 2017, 23:11
fastpho, ¿qué error te da exactamente la OCX?

¿La DLL de qué va, qué hace exactamente, lo mismo que la OCX?

fastpho
27 de abril de 2017, 14:34
Este nuevo de paque de datos que baje viene con una com dice para windows y una dll y . lib para windows 32 y 64 bits cuando quise insertar el objecto no me figura en lo objetos insertables entonces me fui al boton browse y cuando la inserto me da el siguiente error : this is not a custom controls file Prove con vb6 y me hace lo mismo .
Bueno dije entonces voy por la dll pero no tengo el conocimiento para implementarla
No me deja subir el zip porque es muy pesado solo subo el pdf que explica

voy a dejar el link de epson para ver si la podes bajar KUK
Epson TM-T900FA | Impresoras fiscales | Punto de venta | Soporte | Epson Argentina (https://epson.com.ar/Soporte/Punto-de-venta/Impresoras-fiscales/Epson-TM-T900FA/s/SPT_C31CB76402)

Kuk
27 de abril de 2017, 15:40
fastpho, el uso de la DLL no es complicada. Debes añadir el archivo *.LIB a tu proyecto en PowerCOBOL. Luego copiar la DLL a la carpeta debug/release de tu proyecto PowerCOBOL donde te deja los EXE y DLL de tu proyecto.

En cuanto a la sintaxis. Te lo voy a explicar con ejemplos del PDF que has colgado.
Por ejemplo, dice que en la DLL hay una función (que por cierto no está disponible en la OCX) que es:


void setComPort( int Port )



This method configures the port number to be used. It is not available in the COM (.ocx) library.

Variable Type Value Description
Port int Numeric 0 – USB
1 – COM1
2 – COM2
x - COMx


Void - quiere decir "nada", o sea que la función no devuelve resultado.

Para llamar esta función debes hacer:


WORKING-STORAGE SECTION.
01 sPort PIC S9(9) COMP-5.

PROCEDURE DIVISION.

MOVE 0 TO sPort *> activamos USB

CALL "setComPort" WITH STDCALL USING BY VALUE sPort


Este es un ejemplo básico. Ahora para llamar la función que llamábamos antes:


void AddDataField( char *in_buffer, int in_buffer_length )



This method adds a new field (binary data) for the next command.

Variable Type Value Description
in_buffer char Binary Max size buffer is 8192
in_buffer_length int Numeric Max length is 8192


Para llamar esta función debes hacer:

WORKING-STORAGE SECTION.
01 InBuffer PIC X(250).
01 BufferLen PIC S9(9) COMP-5.

PROCEDURE DIVISION.

*> Prueba con cada una de estas combinaciones
MOVE X"08" & X"02" TO InBuffer
MOVE 2 TO BufferLen

MOVE X"08" & X"02" & X"00" TO InBuffer
MOVE 2 TO BufferLen

MOVE X"08" & X"02" & X"00" TO InBuffer
MOVE 3 TO BufferLen

*> La propia llamada a la Función:
CALL "AddDataField" WITH STDCALL USING BY REFERENCE InBuffer
BY VALUE BufferLen


Siguiendo estos ejemplos puedes invocar cualquier función en la DLL.

fastpho
27 de abril de 2017, 16:27
gracias Kuk por tu tiempo voy a probar y lo que me sugieres y despues aviso como me fue

WORKING-STORAGE SECTION.
01 sPort PIC S9(9) COMP-5.
01 InBuffer PIC X(250).
01 BufferLen PIC S9(9) COMP-5.
PROCEDURE DIVISION.
MOVE 1 TO sPort *> activamos COM1

CALL "setComPort" WITH STDCALL USING BY VALUE sPort

*> Prueba con cada una de estas combinaciones
MOVE X"08" & X"02" TO InBuffer
MOVE 2 TO BufferLen
*> La propia llamada a la Función:
CALL "AddDataField" WITH STDCALL USING BY REFERENCE InBuffer
BY VALUE BufferLen

Inserte la libreria y copie la dll y el lib en el directorio donde trabajo cuando compilo me tira esta cantidad de errores que estoy haciendo mal
voy a subir el printscreen de la compilacion

Kuk
27 de abril de 2017, 17:04
fastpho, parece ser una LIB estática (y no una LIB de importación) la cual además tiene sus propias dependencias. Acerca de las LIB: [Noticia] Diferentes tipos de librerías *.LIB que existen - COBOL Foro (http://cobolforo.es/showthread.php?t=442&highlight=diferentes+tipos)

¿Has instalado el EpsonFiscalDriver_01.09.00.exe? Aunque no creo que esto ayude para hacer el LINK.

Mira, cambia el código según explico en este hilo y convierte las llamadas en dinámicas: [Aporte] CALL de cualquier DLL sin *.LIB ni "LoadLibrary" - COBOL Foro (http://cobolforo.es/showthread.php?t=216). Así no necesitas la LIB en el proyecto, las funciones serán localizadas vía WinAPI por el Run-Time de Fujitsu, así que no olvides de quitar la LIB del proyecto.

fastpho
28 de abril de 2017, 15:51
Hola Kuk instale el paquete EpsonFiscalDriver_01.09.00.exe , quite la lib del proyecto pero cuando compilo me da el siguiente error :

Linking C:\epsontm\epsontm900.exe ...
APPEPSON.obj : error LNK2001: unresolved external symbol _FUNC@4
C:\epsontm\epsontm900.exe : fatal error LNK1120: 1 unresolved externals

** The build has failed **
este es el archivo que cree cobol85.cbr que contiene :

[APPEPSON.ENTRY]
setComPort=EpsonFiscalDriver.DLL
AddDataField=EpsonFiscalDriver.DLL


ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FUNC PIC X(10).
01 sPort PIC S9(9) COMP-5.
01 InBuffer PIC X(250).
01 BufferLen PIC S9(9) COMP-5.
PROCEDURE DIVISION.
MOVE "setComPort" TO FUNC.
MOVE 1 TO sPort *> activamos COM1

CALL "FUNC" WITH STDCALL USING BY VALUE sPort

Kuk
28 de abril de 2017, 16:16
fastpho, estás haciendo llamada estática:


CALL "FUNC" WITH STDCALL USING BY VALUE sPort


Quítale las comillas al FUNC para que tire de la varibale WORKING y no lo tome por literal:


ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FUNC PIC X(10). *> nombre función <===[
01 sPort PIC S9(9) COMP-5.
01 InBuffer PIC X(250).
01 BufferLen PIC S9(9) COMP-5.
PROCEDURE DIVISION.
MOVE "setComPort" TO FUNC. *> nombre función <===[
MOVE 1 TO sPort *> activamos COM1

CALL FUNC WITH STDCALL USING BY VALUE sPort

fastpho
28 de abril de 2017, 23:33
Al fin pude Imprimir un Informe X Gracias Kuk
Ahora a laburar cualquier cosa estare informando

fastpho
4 de mayo de 2017, 23:59
Hola KUK tengo problemas con estos metodos que me devuelven ningun valor y me parece que el problema es que estan mal implementadas :
Por ejemplo el metodo

getPrinterStatus
Prototype:
int getPrinterStatus( void )
Inputs:
Nothing.
Outputs:
Nothing.
Returns:
Only the least significant 16 bits are valid.

yo llamandola asi

move "getPrinterStatus" TO FUNC.
CALL FUNC WITH STDCALL USING BY REFERENCE CODIGO-CmImpresor.
MOVE CODIGO-CmImpresor TO "Text" OF CmImpresor.

Pero siempre me da zero cuando me deberia dar algun valor por ejemplo cuando se abre la tapa del impresor o falta papel
Desde ya muchas gracias

Rapinto
5 de mayo de 2017, 00:27
fastpho,

Não será necessário utilizar:

* define na Working
01 WSRESULT PIC S9(009) COMP-5.

CALL FUNC WITH STDCALL USING BY REFERENCE CODIGO-CmImpresor
RETURNING WSRESULT.

Espero que resolva.
Un saludo,
Rui Pinto

Kuk
5 de mayo de 2017, 08:48
fastpho, mirando el prototipo C de la función, vemos:

int getPrinterStatus( void )

int - es el Integer, equivalente a PIC S9(9) COMP-5 y es lo que la función devuelve.
void - quiere decir NADA, o sea que no hay parámetros a pasar para esta función.

Ahora, viendo cómo lo haces tú:

CALL FUNC WITH STDCALL USING BY REFERENCE CODIGO-CmImpresor.

Le estás pasando un puntero (la dirección del campo CODIGO-CmImpresor) y por el contrario no recibes el valor Integer que devuelve dicha función.

La forma correcta de llamarla sería:

CALL FUNC WITH STDCALL RETURNING CODIGO-CmImpresor.

fastpho
5 de mayo de 2017, 14:29
Gracias Kuk y Rui voy a probar y despues cuento como me fue

---------- Post añadido : 13:29 ---------- Post anterior : 13:24 ----------

Funciona de las dos maneras Gracias Kuk y Rui

CALL FUNC WITH STDCALL USING BY REFERENCE CODIGO-CmImpresor returning CODIGO-CmImpresor.
CALL FUNC WITH STDCALL RETURNING CODIGO-CmImpresor.

Laura
7 de diciembre de 2017, 22:29
Kuk, Hola.. Necesito hacer funcionar la impresora EPSON TM 900 nueva generación y no encuentro la forma de usar la OCX o la DLL.. Vi en el foro que la están usando.. me pueden ayudar x favor?

Gracias...

Josber
8 de diciembre de 2017, 19:34
Laura, Kuk, no está usándo ese controlador, supongo que por que aquí en España, fiscalmente no es obligatorio, el que te tendría que ayudar es fastpho, que parece ser que ha conseguido ponerlo en marcha. Lo único que ha hecho Kuk y otros, y no es poco, es ayudar con un problema.

Un saludo.-

Kuk
9 de diciembre de 2017, 11:11
Laura, como ha dicho Josber, yo no las uso. Pero dinos qué problema tienes, técnicamente te podremos ayudar.

fastpho
11 de diciembre de 2017, 14:39
Laura, Hola Laura , tendrias que bajar desde la pagina web de epson argentina , yo logre hacerla andar yo estoy utilizando EpsonFiscalDriver.DLL para facturar y sacar informes
bajatelos y te ayudo
Suerte

Laura
11 de diciembre de 2017, 20:07
Hola.. buenísimo.. yo tengo la DLL (EpsonFiscalInterface.DLL) y la OCX (comEsponFiscalDriver.OCX) q me enviaron de Espon, incluso fui a un curso pero no supieron decirme como usarlas en el Fujitsu. La OCX intento incluirla como un Custom Control pero pero me sale una leyenda This is not a custom control file.. Podés pasarme los códigos para incluir la DLL? NO encuentro la forma.. Muchísimas gracias..

---------- Post añadido : 16:07 ---------- Post anterior : 15:59 ----------

Gracias.. Te cuento rápido mi problema. Espon provee una DLL para la impresora fiscal para lenguaje de alto nivel y también una OCX para lenguaje de bajo nivel.. No se como utilizar la DLL en el Fujitsu y así utilizarla. Tampoco puedo incluir la OCX como custom control porq me dice This is not a custom control file y tampoco conozco otra forma de utilizarla. Fui a un curso en Espon y no hay nadie q desarrolle en Fijitsu, somos pocos y entonces no tienen las respuestas para ayudarnos.

fastpho
11 de diciembre de 2017, 22:09
Laura, Si lees bien el problema en paginas anteriores en el foro la ocx no funciona con pwc y como te dije tenes que usar la libreria EpsonFiscalDriver.DLL que funciona muy bien.
Tenes que copiar tal libreria donde compile tu programa y en el archivo cobol85.cbr incluir las llamadas de las funciones que necesitas te paso unas lineas de programa y lo que debe incluir
el archivo cobol85.cbr


Lineas de Cobol85.cbr
[TPV.ENTRY]
AddDataField=EpsonFiscalDriver.DLL
ClosePort=EpsonFiscalDriver.DLL
GetAPIVersion=EpsonFiscalDriver.DLL
GetExtraField=EpsonFiscalDriver.DLL
GetReceivedFrame=EpsonFiscalDriver.DLL
GetSentFrame=EpsonFiscalDriver.DLL
OpenPort=EpsonFiscalDriver.DLL
Purge=EpsonFiscalDriver.DLL
SendCommand=EpsonFiscalDriver.DLL
getBaudRate=EpsonFiscalDriver.DLL
getComPort=EpsonFiscalDriver.DLL
getExtraFieldCount=EpsonFiscalDriver.DLL
getFiscalStatus=EpsonFiscalDriver.DLL
getLastError=EpsonFiscalDriver.DLL
getPrinterStatus=EpsonFiscalDriver.DLL
getProtocolType=EpsonFiscalDriver.DLL
getReturnCode=EpsonFiscalDriver.DLL
getState=EpsonFiscalDriver.DLL
setBaudRate=EpsonFiscalDriver.DLL
setComPort=EpsonFiscalDriver.DLL
setProtocolType=EpsonFiscalDriver.DLL
setComPort=EpsonFiscalDriver.DLL
setLog=EpsonFiscalDriver.DLL

Lineas de Programa:

MOVE "GetAPIVersion" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
*** set log
** move spaces to FUNC-EPSON-LIB.
** MOVE "SetLog" TO FUNC-EPSON-LIB.
** MOVE "./" TO InBuffer.
** MOVE 0 TO BufferLen.
** CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE InBuffer
** * BY VALUE BufferLen
** COM SET
move spaces TO FUNC-EPSON-LIB.
MOVE "setComPort" TO FUNC-EPSON-LIB.
MOVE 1 TO sPort *> activamos COM1
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE sPort.
** BAUDIOS SET
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "setBaudRate" TO FUNC-EPSON-LIB.
move 9600 TO sBaudio *> set baudios
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE sBaudio.
** MOVE spaces TO FUNC-EPSON-LIB.
** MOVE "getBaudRate" TO FUNC-EPSON-LIB.
** CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE sBaudio.
** DISPLAY sBaudio
** PROTOCOL SET
move spaces TO FUNC-EPSON-LIB.
MOVE "setProtocolType" TO FUNC-EPSON-LIB.
MOVE 1 TO SProtocol.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE SProtocol.
*> OPEN PORT.
move spaces TO FUNC-EPSON-LIB.
MOVE "OpenPort" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.

move spaces TO FUNC-EPSON-LIB.
MOVE "getLastError" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL RETURNING iError.
IF iError = 0 then MOVE "ok" to "Text" OF CmCOMUNICACION.
IF iError = 1 then MOVE "Puerto ocupado" to "Text" OF CmCOMUNICACION.
IF iError = 2 then MOVE "Puerto invalido" to "Text" OF CmCOMUNICACION.
IF iError = 10 then MOVE "Error de escritura verifique el impresor" to "Text" OF CmCOMUNICACION.
** display iError
*
*
* MOVE "ClosePort" TO FUNC-EPSON-LIB.
* CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
*

Laura
12 de diciembre de 2017, 00:18
Estuve probando con un ejemplo q pusieron justamente con lo de "setComPort" y copié la DLL en mi release pero cuando lo ejecuto me da error, como q no reconoce el setComPort, lo moví a la variable también.. pero con éste ejemplo q vos me pusiste voy a seguir probando mañana. Muchas gracias.. ojalá también pueda ayudar en algo..

fastpho
4 de enero de 2018, 23:38
Laura, Hola!!! te molesto otra vez xq no hay manera q me funcione la DLL en mi programa. Te comento, estoy usando pwc versión 7.. vos cuál usas?

Creé mi cobol85.cbr igual al q vos me indicaste, copié la DLL en la release (y x las dudas también en la del proyecto)

Hice la prueba con el comando de setear el puerto moviéndolo a una variable y sin moverlo, y cuando lo ejecuto me da el siguiente error:

JMP0015I-U [PID:000011A8 TID:00000698] CANNOT CALL PROGRAM 'setComPort'. CODE=0x7e PGM=PRUEBA ADR=0040173F


mi código es el sgte:


move spaces TO FUNC-EPSON-LIB.
MOVE "setComPort" TO FUNC-EPSON-LIB.
MOVE 1 TO sPort
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE sPort.

Estaría super agradecida q me ayudes xq si o si tengo q hacerlas funcionar. Decime si tengo q pagarte la capacitación o lo q sea..

Muchas gracias..

Laura
El problema lo tenes me parecen en el archivo cobol85.cbr , el nombre del formulario principal es el nombre que tenes que utilizar en el archivo cobol85.cbr

Laura
8 de enero de 2018, 23:48
Mi error es q usaba la otra DLL "EpsonFiscalInterface.DLL", ahora al menos no me dio error cuando lo ejecuto. Voy a probar con los comandos. Te cuento como me va..

fastpho
9 de enero de 2018, 20:14
Laura, Tenes que usar la libreria EpsonFiscalDriver.DLL , en el archivo cobol85.cbr que te mande especifica esa libreria

Joseg
10 de enero de 2018, 13:42
Laura, Tenes que usar la libreria EpsonFiscalDriver.DLL , en el archivo cobol85.cbr que te mande especifica esa libreria

Usar DLLs/OCX feitos em "C/C++", é em ALGUNS CASOS, necessário compilar com a diretiva "BINARY(BYTE)".

Ter igualmente atenção a campos com sinal PIC S9...

Por exemplo:
01 aaa pic s9(5) COMP-5 em fujitsu representa-se de uma forma em Microfocus/Outros tem outro valor (analisando em hexadecimal da para ver as diferenças).

Laura
16 de enero de 2018, 22:12
fastpho, Hola.. tenés algún ejemplo para mostrarme de como x ejemplo enviar un cierre Z o X, no encuentro ejemplos bien claros, los q tengo y muchos es con la otra DLL q no me sirve. O sino donde puedo conseguir ejemplos así arranco xq estoy estancada..

Muchas gracias..

fastpho
17 de enero de 2018, 14:06
Laura, te paso un ejemplo de Informe X e Informe Z
Informe X

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ReturnDEValue PIC S9(9) COMP-5 VALUE 0.
01 LINEA-INFORME-X.
03 Comando PIC X VALUE X"08".
03 Comandobis PIC X VALUE X"02".
01 LINEA-EXTRA.
03 DataField1 PIC X VALUE X"0C".
03 DataField2 PIC X VALUE X"21".
01 ReturnValue Pic S9(9) Comp-5 Value 0.
01 N-Length pic 99 value zero.
01 lpString1 pic x(2).
01 lpString2 pic x(2).

01 x pic x(4).
01 Cantidad PIC S9(9) COMP-5 VALUE 0.
01 ReturnString PIC X(4) VALUE HIGH-VALUE.
01 Variable PIC 9(3).
PROCEDURE DIVISION.
move spaces TO FUNC-EPSON-LIB.
MOVE 2 TO BufferLen
MOVE "AddDataField" TO FUNC-EPSON-LIB
*> La propia llamada a la FUNC-EPSON-LIBión:
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-INFORME-X
BY VALUE BufferLen

move spaces TO FUNC-EPSON-LIB.

MOVE 2 TO BufferLen
MOVE "AddDataField" TO FUNC-EPSON-LIB
*> La propia llamada a la FUNC-EPSON-LIBión:
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-EXTRA
BY VALUE BufferLen
*SEND COMMAND
move spaces TO FUNC-EPSON-LIB.
MOVE "SendCommand" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.

Informe Z

WORKING-STORAGE SECTION.
01 ReturnDEValue PIC S9(9) COMP-5 VALUE 0.
01 Comando PIC X VALUE X"39".
01 LINEA-INFORME-Z.
03 Comando PIC X VALUE X"08".
03 Comandobis PIC X VALUE X"01".
01 LINEA-EXTRA.
03 DataField1 PIC X VALUE X"0C".
03 DataField2 PIC X VALUE X"00".

01 Cantidad PIC S9(9) COMP-5 VALUE 0.
01 ReturnString PIC X(12).
01 Variable PIC 9(3).
PROCEDURE DIVISION.



move spaces TO FUNC-EPSON-LIB.
MOVE 2 TO BufferLen
MOVE "AddDataField" TO FUNC-EPSON-LIB

CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-INFORME-Z
BY VALUE BufferLen

move spaces TO FUNC-EPSON-LIB.

MOVE 2 TO BufferLen
MOVE "AddDataField" TO FUNC-EPSON-LIB

CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-EXTRA
BY VALUE BufferLen
*SEND COMMAND
move spaces TO FUNC-EPSON-LIB.
MOVE "SendCommand" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.

Laura
17 de enero de 2018, 22:12
GRACIAS!!! Voy a probar entonces.. después te cuento..

Softdac
3 de agosto de 2018, 00:37
Estimada Laura, disculpe el atrevimiento, pero me podría resumir como soluciono el inconveniente? ya que tengo desarrollado un sistema en powercobol 7 con la ocx EpsonFPHostControlX en modo compatible funcionando Ok, hasta que me solicitaron confeccionar notas de debitos, y ahí se me vino la noche, renegué un montón, hasta que consultando en Epson, me indicaron que debía usar el protocolo extendido del ocx, pero no encontré manera de hacerla funcionar, me dieron varias alternativas pero nada, hasta que encontré este tema en el foro, por lo que decidí molestarla.
Desde ya muchas gracias, por su atención.
Saludos
Daniel

drvedia1981
3 de agosto de 2018, 17:04
Hola tenes un sistema funcionando con EpsonFPHostControlX en una tm220af o anteriores o las nuevas con cual queres hacer nota de credito ? Saludos

Softdac
4 de agosto de 2018, 05:54
Hola drvedia1981, el sistema viene funcionando desde ya hace unos años, con powercobol 7 y el ocx EpsonFPHostControlX, en modo compatible en impresora tm220AFII, pero ojo, lo que no puedo hacer es notas de débitos, ya para eso tengo trabajar en modo extendido, y es ahí en donde reniego para pasarles los valores hexadecimales al controlador. Según la gente de epson, me dijo que cuando le paso en un comando el valor x'00' el controlador lo toma como nulo, por lo que me descarta el comando, pero hasta ahora no le encontré la vuelta.
Gracias por tu interes.

panzaverde
12 de febrero de 2019, 18:55
Hola, estoy trabajando con PowerCobol v3, y queria saber si funciona el EpsonFiscalDriver.DLL con esta version.
He copiado los ejemplos que ustedes han posteado, e instalado la .DLL y creado el cobol85.cbr con los metodos y propiedades, referenciados a "=EpsonFiscalDriver" enlazado con el nombre dl form principal, pero al ejecutar me da un error de ejecucion y no me devuelve codigo alguno. Cancela "pgm.exe dejo de funcionar. Cerrar el programa".
Desde ya muchas gracias.
Saludos.
Alberto

Kuk
12 de febrero de 2019, 21:05
"=EpsonFiscalDriver"
¿No era EpsonFiscalDriver.dll?

Revisalo todo bien, porque por lo visto a la gente le ha funcionado. Y el mecanismo de usar una DLL vía COBOL85.CBR no ha evolucionado desde la v3, que yo sepa.

panzaverde
13 de febrero de 2019, 17:31
Gracias Kuk, por la respuesta.
Como te comente, copie los post de Uds, rutina, definiciones.
La definición de cobol85.cbr yo me equivoque al pasarte la pregunta, lo copie un posteo de Fastpho
[SHEET1.ENTRY]
AddDataField=EpsonFiscalDriver.DLL
ClosePort=EpsonFiscalDriver.DLL", etc, eso por un lado.

Por otra parte puede ser que la opción "returning" no este soportada por la version v3.

El manual explica
[Format 1] ON OVERFLOW phrase
CALL [WITH STDCALL LINKAGE]
[BY REFERENCE] {identifier-2} …
USING BY CONTENT … …
BY VALUE { identifier-3} …]
[ON OVERFLOW imperative-statement-1]
[END-CALL]

Desde ya muchas gracias.
Saludos Alberto.

Kuk
13 de febrero de 2019, 22:15
panzaverde, efectivamente, creo recordar que RETURNING no existe en Power v3. Pero lo que devuelve el returning en otras versiones, en Power v3 lo tienes en el campo reservado PROGRAM-STATUS.

¿Tu Form se llama SHEET1? Si es otro nombre, no va a funcionar. Debes poner [nombre_de_tu_form.ENTRY]

panzaverde
14 de febrero de 2019, 01:14
Muchas gracias Kuk por la respuesta. Probe el PROGRAM-STATUS y me devuelve el valor del campo enviado o no devuelve nada.
Voy a seguir investigando un poco mas y seguramente te molestare nuevamente.
Saludos Alberto.

---------- Post añadido : 21:14 ---------- Post anterior : 21:10 ----------

Kuk me olvidaba, el form principal se llama "SHEET1".
Gracias.

rodolfo
18 de marzo de 2019, 21:34
Buenas tardes, estoy utilizando epsonFiscalDriver.dll y puedo imprimir Cierre X/Z, pero con la impresión de un ticket llego hasta la impresión de ítem, no toma el pago, a pesar que utilizó los parámetros tal como figuran en https://files.support.epson.com/pdf/pos/bulk/tmt900fa_pc_manual_revc.pdf, página 150.
La secuencia utilizada de comandos es:

Establecer protocolo (1)
Establecer velocidad
Establecer puerto
Abrir puerto
Abrir ticket
Item
Pago
Cerrar ticket
Cerrar puerto

Agradecería algún ejemplo puntual.

Kuk
19 de marzo de 2019, 19:21
rodolfo, ¿qué modelo de impresora es?

rodolfo
20 de marzo de 2019, 14:18
rodolfo, ¿qué modelo de impresora es?

Buen día, es una TM-T900FA.

fastpho
21 de marzo de 2019, 15:29
rodolfo Para realizar el pago primero fijate el importe que estas enviando sea mayor al valor del item de todas maneras sin realizar el pago con el comando cerrar te lo deberia hacer sin el pago

rodolfo
2 de abril de 2019, 03:18
Gracias por responder, ya logro imprimir un comprobante completo, lo que no puedo es imprimir una devolución dentro de un ticket, según la documentación es:

EnviarComando("0A02|0001|||||Item devuelto|Cantidad|PrecioUnitario|AlicuotaIVA|||||| |")

No logro que imprima dicha línea, las otras correspondientes a venta de ítem, si lo hace.
Y el importe total del ítem devuelto lo suma como pago EFECTIVO en vez de restarlo del total de pagos.
Desde ya muchas gracias.
Saludos.

fastpho
4 de abril de 2019, 00:01
rodolfo que libreria estas utilizando pq en la libreria EpsonFiscalDriver.dll no existe ese comando

rodolfo
8 de abril de 2019, 02:27
rodolfo que libreria estas utilizando pq en la libreria EpsonFiscalDriver.dll no existe ese comando

Hola fastpho, estoy usando EpsonFiscalInterface.dll.

Fito
13 de agosto de 2019, 23:01
Holaaa:

Estoy renegando con la Epson TM-T900FA, ya pude hacer un X y un Z. Pero ahora quiero recuperar desde la impresora el puesto de venta y no logro hacerlo. Mando un comando OBTENER ID que en el campo 5 tiene el puesto de venta y no logro nada.


WORKING-STORAGE SECTION.

01 LINEA-OBTENER-ID pic xx value X"0005".
01 LINEA-EXTRA pic xx value X"0000".

01 xsucursal pic x(500).
01 redefines xsucursal.
02 wsucursal pic 99999.
02 pic x(495).

01 variables-nuevas.
02 BufferLen pic s9(9) comp-5.
02 campo pic s9(9) comp-5.

PROCEDURE DIVISION.

*...... Obtener el punto de venta ..................................
move "OpenPort" to Epson
call Epson with stdcall using by reference version.

move "Purge" to Epson
call Epson with stdcall using by reference version.

move 2 to BufferLen
move "AddDataField" to Epson
call Epson with stdcall using by reference LINEA-OBTENER-ID
by value BufferLen

move 2 to BufferLen
move "AddDataField" to Epson
call Epson with stdcall using by reference LINEA-EXTRA
by value BufferLen.

move "SendCommand" to Epson
call Epson with stdcall using by reference version.

move "GetExtraField" to Epson
move 5 to campo
move 5 to BufferLen
call Epson with stdcall using by value campo
by reference xsucursal
by value BufferLen.

move wsucursal to suc-default.

invoke pow-self "DisplayMessage" using xsucursal.


move "ClosePort" to Epson
call Epson with stdcall using by reference version.
*...... /Obtener el punto de venta ..................................



Si alguien tiene una idea, bienvenida sea.

Saludos.

Fito...

fastpho
14 de agosto de 2019, 02:47
Hola Fito, el problema lo tenes en :

01 LINEA-OBTENER-ID pic xx value X"00".
01 LINEA-EXTRA pic xx value X"05".

esta es la manera correcta , lo tenes al reves
Saludos

---------- Post añadido : 01:47 ---------- Post anterior : 00:36 ----------

Fito te conste cualquiera ...
ahora re leyendo me di cuenta
Que están bien los parametros
Mañana lo pruebo bien yo utilizo otra función pq la getextra field nunca me devolvió nada

Fito
14 de agosto de 2019, 04:52
Hola Fastpho:

Gracias por contestar. Hasta ahora logré solamente hacer cierre x y z. A la tiqueadora la conecté por usb pero instalé y configuré el Epson Virtual Port y lo manejo como serial.

Ahora estoy intentando hacer un tique factura, veremos cómo me va.

Gracias. Saludos.

Fito...

fastpho
14 de agosto de 2019, 15:06
Fito, Buen dia mira probe tu codigo con el simulador , y tu codigo me esta
devolviendo el la variable xsucursal el valor 12345 que es el punto de venta en el simulador

Fito
14 de agosto de 2019, 16:13
Holaaaa:

Entonces será problema de conexión? Tenga la tiqueadora sin inicializar, será por eso que no puedo hacer mucho? porque intenté hacer la cabecera del Tique Factura y tampoco logré nada.

Saludos.

Fito...

fastpho
14 de agosto de 2019, 16:54
Fito, cuando la impresora esta sin fiscalizar no te va ha dar el pto de venta pq el campo es zero , podes facturar , sacar x y z no podes obtener las declaraciones juradas , no podes re imprimir comprobantes , por eso es mejor trabajar con el simulador

Fito
19 de agosto de 2019, 17:21
Holaa Fastpho:

Qué emulador estás usando?

Y otengo uno, pero no tiene este modelo ..

Saludos.

Fito...

fastpho
20 de agosto de 2019, 14:42
Fito, Buen dia , el simulador de impresora fiscal para la tm900 es la version 1.3
es con el que yo trabajo o tambien si tenes la impresora es que casi igual como te comente anteriormente , con el simulador podes hacer casi todas las funciones del protocolo : facturar , sacar informes , obtener los informes de ventas para presentar a la afip (f8010,f8011,f8012) , reimprimir algun comprobante por cualquier motivo , etc y la comunicacion con el simulador es serie , para el caso de trabajar directamente con la impresora la comunicacion puede ser serie o usb (recomendada por la gente de epson) en este caso si esta sin fiscalizar el impresor podes facturar (ticket c.final , ticket "a"y "b" , nota de credito "a" y "b" , sacar x y z
Saludos

Fito
27 de agosto de 2019, 15:20
Hola Amigos:

Me puse a trabajar de nuevo en el fiscal. Una pregunta, la EpsonFiscalInterface.dll funciona?

Saludos.

Fito...

fastpho
27 de agosto de 2019, 22:43
Buenas Fito, si la EpsonFiscalInterface.dll funciona perfectamente , yo solo utilizo una sola funcion (descargar) que es la q baja los formularios 8010 ,8011,8012 , para subir a la afip

Fito
28 de agosto de 2019, 06:46
Hola:

Al final lo hice todo con EpsonFiscalInterface.dll, funciona perfecto.

Saludos.

Fito...

rubenhduarte
26 de abril de 2020, 17:37
Hola, soy nuevo en el foro, en realidad trabajo mas con c#, llegue a este foro buscando informacion de simulador de TM-T900FA, veo que alguien ya se lo descargo, yo no lo puedo encontrar, solo encontre emuladores de Hasar, alguien tiene algun link de descarga del emulador de Epson?
Muchas gracias!

jhjacomo
12 de julio de 2020, 02:57
@panzaverde,
Hola buenas tardes.
Leí que estas usando la versión de pwc v3.0. Yo tengo un sistema de facturación con esta versión y ahora tengo la urgencia de hacerlo funcionar con una TM-T900AF. Leí todas las consultas y consejos de este tag, pero no encuentro la forma de hacerlo funcionar. Modifique el COBOL85.CBR como aconsejan pero me tira el error:
JMP0015I-U [PID:000011A8 TID:00000698] CANNOT CALL PROGRAM 'AddDataField'. CODE=0xC1 PGM=INFOFIS ADR=00405C2B. Algun consejo.Gracias.

fastpho
12 de julio de 2020, 16:03
@jhjacomo, Buen dia , que libreria estas usando .. ? Los ejemplos que hay para abrir el puerto Sacar un informe x o z son para la libreria epsonfiscaldriver.dll....

jhjacomo
12 de julio de 2020, 16:54
Hola fastpro, gracias por tu respuesta.
Ampliemos.
Estoy usando la librería EpsonFiscalDriver.dll.
El archivo COBOL85.CBR:

[INFOFIS]
@EnvSetWindow=UNUSE
PRTLIS=PRTLIS.ENV
PRT1=FAELE.ENV
PRINTER=lpt3

[INFOFIS.ENTRY]
AddDataField=EpsonFiscalDriver.dll
ClosePort=EpsonFiscalDriver.dll
GetAPIVersion=EpsonFiscalDriver.dll
GetExtraField=EpsonFiscalDriver.dll
GetReceivedFrame=EpsonFiscalDriver.dll
GetSentFrame=EpsonFiscalDriver.dll
OpenPort=EpsonFiscalDriver.dll
Purge=EpsonFiscalDriver.dll
SendCommand=EpsonFiscalDriver.dll
getBaudRate=EpsonFiscalDriver.dll
......

En el formulario tengo un botón, que se envía al controlador la selección del operador

if caj-tipoprv = 12
call "A-EPSONTM900"
cancel "A-EPSONTM900"
end-if.

En la PROCEDURE del formulario principal, tengo un copy con las lineas de programación:

#include "procedur\InfoFis.pro".

Y en el archivo InfoFis.pro, lo siguiente:

003010 IDENTIFICATION DIVISION.
003020 PROGRAM-ID. A-EPSONTM900 is common.
003040 ENVIRONMENT DIVISION.
003160 DATA DIVISION.
003350 WORKING-STORAGE SECTION.
003360 01 ReturnDEValue PIC S9(9) COMP-5 VALUE 0.
003370 01 LINEA-INFORME-X.
003380 03 Comando PIC X VALUE X"08".
003390 03 Comandobis PIC X VALUE X"02".
003400 01 LINEA-EXTRA.
003410 03 DataField1 PIC X VALUE X"0C".
003420 03 DataField2 PIC X VALUE X"21".
003430 01 ReturnValue Pic S9(9) Comp-5 Value 0.
003440 01 N-Length pic 99 value zero.
003450 01 lpString1 pic x(2).
003460 01 lpString2 pic x(2).
003470 01 x pic x(4).
003480 01 Cantidad PIC S9(9) COMP-5 VALUE 0.
003490 01 ReturnString PIC X(4) VALUE HIGH-VALUE.
003500 01 Variable PIC 9(3).
003620 01 i pic 99.
003630*
003640 01 FUNC-EPSON-LIB Pic x(40).
003640 01 BufferLen pic S9(9) COMP-5 VALUE 0.
003650 01 version pic x(250).
004100 PROCEDURE DIVISION.
004310 la-x.
004320 move spaces TO FUNC-EPSON-LIB.
004330 MOVE 2 TO BufferLen
004340 MOVE "AddDataField" TO FUNC-EPSON-LIB.
004350*> La propia llamada a la FUNC-EPSON-LIB:
004360 CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-INFORME-X
004370 BY VALUE BufferLen.
004380
004390 move spaces TO FUNC-EPSON-LIB.
004400
004410 MOVE 2 TO BufferLen.
004420 MOVE "AddDataField" TO FUNC-EPSON-LIB.
004430*> La propia llamada a la FUNC-EPSON-LIB:
004440 CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-EXTRA
004450 BY VALUE BufferLen.
004460*SEND COMMAND
004470 move spaces TO FUNC-EPSON-LIB.
004480 MOVE "SendCommand" TO FUNC-EPSON-LIB.
004490 CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
004500
005520 END PROGRAM A-EPSONTM900.

Y el error me da en la linea 004360, con el mensaje que envié anteriormente.

Gracias.

fastpho
12 de julio de 2020, 19:38
@jhjacomo, Cuando llamas SetComPort no te da error ? , verifica que tanto tu aplicación, como el cbr y la dll esten en el mismo lugar...

jhjacomo
13 de julio de 2020, 01:00
Hola FASTPHO, en realidad yo me baje el ejemplo de x y z que le sugeriste a Laura, el comando SetComPort no lo estaba usando,pero al leer tu respuesta, se lo agregué y el error sigue siendo el mismo, solo que ahora me da con SetComPort.
Verifique que el ejecutable, el archivo cobol85.cbr y la dll estén en la misma carpeta.
Yo me bajé de epson el EpsonFiscalDriver_03.02.00.zip, lo descomprimí y lo instalé, luego me copie de la carpeta donde se instaló (C:\Program Files (x86)\EpsonFiscalDriver\64) la DLL EpsonFiscalDriver.DLL. Estoy trabajando con un Windows 7 64 bits y estoy compilando con el FSC 3 que Kuk adapto para los 64 bits.
Saludos FASTPHO y gracias por tu ayuda.

fastpho
13 de julio de 2020, 01:55
@jhjacomo, Para poder enviar algun comando al impresor primero tenes que setear la puerta la velocidad etc en el post 49 hay un ejemplo, con respecto al error el compilador no encuentra la dll o estas usando la libreria de 64 en vez de la 32 ...
Saludos

jhjacomo
13 de julio de 2020, 03:14
@fastpho, Hay algo que no entiendo, cuando dices "con respecto al error el compilador no encuentra la dll".
Yo entendía que el compilador ni se entera de la dll a usar, que es el RUNTIME a través del archivo COBOL85.CBR que se encarga de ubicar las funciones dentro de la DLL.
Como te decia estoy trabajando con una maquina con WINDOWS 7 de 64 bits, entonces creí que lo mas lógico seria copiar la DLL de la carpeta de 64 y no la de 32. Ahora, copiando la dll de la capeta de 32 bits, ahora me dice que "InfoFis.exe dejo de funcionar" y se cierra.
Ya le incorporé el seteo de velocidad y puerto (Tambien la version), ahora me da error:

003580 MOVE "GetAPIVersion" TO FUNC-EPSON-LIB.
003590 CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.

la linea 3590.
Al momento de compilar, no hay que especificarle nada al compilador?.
Fastpho, discúlpame las molestias, día domingo y ya tarde. Mañana la seguimos.
Gracias por tu ayuda.
Fastpho sos de Mendoza, mira vos!!! Yo soy de San Juan, vecinos y conectados a través de un foro español!!!

fastpho
13 de julio de 2020, 17:06
@jhjacomo, El runtime es el que no encontraba la dll , lo que tenes que ver ahora es si la variable version de vuelve el valor de la version de la libreria ,
MOVE "GetAPIVersion" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display version.

version deberia ser igual a 3.0.2 si no me equivoco

jhjacomo
16 de julio de 2020, 02:40
Hola Foro, buenas noches.
Agradezco al foro y especialmente a FASPHO, por sus consejos y recomendaciones. Ya pude enviar mis primeros comando al controlador fiscal.
Todavía me falta un montón, pero ya pude ver la version de la DLL, setear los baudios y el programa se pincha cuando envio "SendCommand", pero ya va ha salir. Sigo de cabeza en el tema.
Yo el error que estaba cometiendo es copiar EpsonFiscalDriver.dll de la carpeta 64 donde se instala el driver, pensé que como estaba en una maquina de 64 bits, correspondía esa DLL, pero la que anduvo fue la DLL de la carpeta 32.
Saludos.

Kuk
16 de julio de 2020, 08:33
@jhjacomo, PowerCOBOL es de 32 bits, así que sólo puedes usar las DLL de 32 bits.

fastpho
17 de julio de 2020, 05:14
@jhjacomo,De nada ,cualquier duda que tengas aca estamos...:cool:

jhjacomo
30 de julio de 2020, 16:25
Hola Foro. buen día y feliz jornada para todos.
Y estamos como la pandemia, volviendo a fase 1.
Después de hacer funcionar el CF, al menos con cierre X(emití dos).
Me puse a limpiar el código para incluirlo en mi sistema y resulta que después de eso el controlador no respondió mas a ningún comando.
Entonces volví al formulario con el cual inicie la pruebas y no encuentro la forma de hacerlo andar.
El formulario tiene un ListBox y un botón para pedir el Cierre X.
Por cada comando a enviar voy cargando en el ListBox lo que vos haciendo y hago un display del PROGRAM-STATUS y esta es la salida despues de presionar el boton (Accion y PROGRAM-STATUS):

Ver la Version de la DLL +004219064 Devuelve "3.2.0"
Setear el puerto +002483396
Setear los baudios +002483396
setProtocolType +002483396
OpenPort +002483396
AddDataField LINEA-INFORME-X +002483396
AddDataField LINEA-EXTRA-X +002483396
SendCommand +002483396
ClosePort +002483396

Por cada envió, aparentemente no tengo error, pero después de enviar el "SendComand" el controlador no hace nada y después de enviar el "CosePort" el programa se cuelga con un "ComFis,.exe" dejo de funcionar"
Les muestro el codigo usado en el "Click" del boton:

ENVIRONMENT DIVISION.
DATA DIVISION.
working-Storage section.
01 LINEA-INFORME-X.
03 Comando PIC X VALUE X"08".
03 Comandobis PIC X VALUE X"02".
01 LINEA-EXTRA-x.
03 DataField1 PIC X VALUE X"0C".
03 DataField2 PIC X VALUE X"21".
01 sPort PIC S9(9) COMP-5.
01 sBaudio PIC S9(9) COMP-5.
01 SProtocol PIC S9(9) COMP-5.
01 gState PIC S9(9) COMP-5.
01 FUNC-EPSON-LIB Pic x(40).
01 BufferLen pic S9(9) COMP-5 VALUE 0.
01 version pic x(250).
PROCEDURE DIVISION.
call CLEARLIST OF p-comandos.
***** GetAPIVersion
call ADDSTRING of p-comandos using "Ver la Version de la DLL".
MOVE "GetAPIVersion" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display PROGRAM-STATUS.
move VERSION to POW-TEXT of l-version.
call DISPLAYMESSAGE of ComFis using "Ver Version".
***** setComPort
call ADDSTRING of p-comandos using "Setear el puerto".
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "setComPort" TO FUNC-EPSON-LIB.
move 0 to sPort.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE sPort.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "Seteo de puerto".
***** setBaudRate
call ADDSTRING of p-comandos using "Setear los baudios".
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "setBaudRate" TO FUNC-EPSON-LIB.
move 9600 TO sBaudio *> set baudios
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE sBaudio.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "Seteo de baudios".
***** setProtocolType
call ADDSTRING of p-comandos using "setProtocolType".
move spaces TO FUNC-EPSON-LIB.
MOVE "setProtocolType" TO FUNC-EPSON-LIB.
MOVE 1 TO SProtocol.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE SProtocol.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "setProtocolType".
***** OpenPort
call ADDSTRING of p-comandos using "OpenPort".
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "OpenPort" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "Open Port".
***** Ver que comando
*AddDataField
call ADDSTRING of p-comandos using "AddDataField LINEA-INFORME-X".
move spaces TO FUNC-EPSON-LIB.
MOVE 2 TO BufferLen.
MOVE "AddDataField" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-INFORME-X
BY VALUE BufferLen.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "AddDataField LINEA-INFORME-X".
move spaces TO FUNC-EPSON-LIB.
*AddDataField
call ADDSTRING of p-comandos using "AddDataField LINEA-EXTRA-X".
MOVE 2 TO BufferLen.
MOVE "AddDataField" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-EXTRA-x
BY VALUE BufferLen.
display PROGRAM-STATUS.
move spaces TO FUNC-EPSON-LIB.
call DISPLAYMESSAGE of ComFis using "AddDataField LINEA-EXTRA".
*SendCommand
call ADDSTRING of p-comandos using "SendCommand".
MOVE "SendCommand" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "SendComand".
***** ClosePort
call ADDSTRING of p-comandos using "ClosePort".
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "ClosePort" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "Close Port".

El ambiente de trabaja es unWindows 7 de 64 bit, compilador PowerCobol 3.0, la DLL (EpsonFiscalDriver.dll" 32 bits) está en la carpeta donde esta el ejecutable junto al COBOL85.CBR con la mension de cada función de la dll en el apartado [COMFIS.ENTRY]. El controlador esta conectado via USB y en el administrador de dispositivo
esta instalado dentro del "Controlador de bus serie universal" el driver "EPSON USB Controller for TM/BA/EU Printers".

Disculpen lo extenso de mi exposición, pero tengo cierta urgencia por terminar este tema y quería hacerme entender bien.
Espero puedan darme una mano. Gracias.

fastpho
30 de julio de 2020, 17:29
@jhjacomo, Etiqueta las lineas de programa para que sea mas facil leer , con respecto a la comunicacion con el impresor fiscal , tenes que chequear Siempre cada vez que envias algo al impresor las propiedades de comunicacion para saber que pasa del otro lado: puede que te apagaron el impresor , no tenga papel , pasaron mas de 24 hs y corresponde hacer una Z si o si
Prototype: getState( void );
Prototype: int getLastError( void );

Por que siempre el impresor por medio de la libreria te devolvera algo ....
Por ejemplo:

*> OPEN PORT.
move spaces TO FUNC-EPSON-LIB.
MOVE "OpenPort" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.

move spaces TO FUNC-EPSON-LIB.
MOVE "getLastError" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL RETURNING iError.
display iError.
IF iError = 4 then MOVE "Error de escritura verifique el impresor" to "Text" OF CmCOMUNICACION.
IF iError = 0 then MOVE "ok" to "Text" OF CmCOMUNICACION.
IF iError = 1 then MOVE "Puerto ocupado" to "Text" OF CmCOMUNICACION.
IF iError = 2 then MOVE "Puerto invalido" to "Text" OF CmCOMUNICACION.
IF iError = 10 then MOVE "Error de escritura verifique el impresor" to "Text" OF CmCOMUNICACION.



ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Respuesta PIC S9(9) COMP-5 VALUE 0.

PROCEDURE DIVISION.
move "getState" to FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL RETURNING Respuesta.
* display "state 1" , Respuesta
perform until Respuesta not = 2 *> esta ocupada la impresora
CALL FUNC-EPSON-LIB WITH STDCALL RETURNING Respuesta
* display "state 2" , Respuesta
end-perform.

Esta informacion esta en el manual del protocolo de la libreria....
Si estas trabajando por medio de usb podes mirar en Dispositivos e Impresoras de windows ,debe estar el impresor sin error
Saludos

jhjacomo
30 de julio de 2020, 19:34
Gracias fastpho por tu respuesta, entiendo lo que dices respecto de los estados, previamente ya lo verifique y su estado es 0, como al programa lo tengo en desarrollo y el controlador esta enfrente mio, estos controles los paso por alto porque yo sé que el controlador tiene papel y nadie me lo apaga, lógicamente al momento de pasarlo a producción entiendo que estos comandos y controles son necesarios.
Respecto a lo que me comentas :"Si estas trabajando por medio de usb podes mirar en Dispositivos e Impresoras de windows ,debe estar el impresor sin error", si mal no recuerdo en la primeras pruebas que realice para sacar mis dos primeras "X", esto no lo tuve en cuenta. De donde tendría que obtener el driver para instalar y que se vea como impresora?
Saludos.

---------- Post añadido : 18:34 ---------- Post anterior : 18:24 ----------


ENVIRONMENT DIVISION.
DATA DIVISION.
working-Storage section.
01 LINEA-INFORME-X.
03 Comando PIC X VALUE X"08".
03 Comandobis PIC X VALUE X"02".
01 LINEA-EXTRA-x.
03 DataField1 PIC X VALUE X"0C".
03 DataField2 PIC X VALUE X"21".
01 sPort PIC S9(9) COMP-5.
01 sBaudio PIC S9(9) COMP-5.
01 SProtocol PIC S9(9) COMP-5.
01 gState PIC S9(9) COMP-5.
01 FUNC-EPSON-LIB Pic x(40).
01 BufferLen pic S9(9) COMP-5 VALUE 0.
01 version pic x(250).
PROCEDURE DIVISION.
call CLEARLIST OF p-comandos.
***** Purge
* call ADDSTRING of p-comandos using "Purge".
* MOVE "Purge" TO FUNC-EPSON-LIB.
* CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
* display PROGRAM-STATUS.
* move VERSION to POW-TEXT of l-version.
* call DISPLAYMESSAGE of ComFis using "Ver Version".
***** GetAPIVersion
call ADDSTRING of p-comandos using "Ver la Version de la DLL".
MOVE "GetAPIVersion" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display PROGRAM-STATUS.
move VERSION to POW-TEXT of l-version.
call DISPLAYMESSAGE of ComFis using "Ver Version".
***** setComPort
call ADDSTRING of p-comandos using "Setear el puerto".
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "setComPort" TO FUNC-EPSON-LIB.
move 0 to sPort.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE sPort.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "Seteo de puerto".
***** getLastError
call ADDSTRING of p-comandos using "getLastError".
MOVE "getLastError" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE gState.
display gState.
move VERSION to POW-TEXT of l-version.
call DISPLAYMESSAGE of ComFis using "Ver Version".
***** getState
* call ADDSTRING of p-comandos using "getState".
* MOVE "getState" TO FUNC-EPSON-LIB.
* CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE gState.
* display gState.
* display PROGRAM-STATUS.
* move VERSION to POW-TEXT of l-version.
* call DISPLAYMESSAGE of ComFis using "Ver Version".
***** setBaudRate
call ADDSTRING of p-comandos using "Setear los baudios".
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "setBaudRate" TO FUNC-EPSON-LIB.
move 9600 TO sBaudio *> set baudios
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE sBaudio.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "Seteo de baudios".
***** setProtocolType
call ADDSTRING of p-comandos using "setProtocolType".
move spaces TO FUNC-EPSON-LIB.
MOVE "setProtocolType" TO FUNC-EPSON-LIB.
MOVE 1 TO SProtocol.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY VALUE SProtocol.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "setProtocolType".
***** OpenPort
call ADDSTRING of p-comandos using "OpenPort".
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "OpenPort" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "Open Port".
***** Ver que comando
*AddDataField
call ADDSTRING of p-comandos using "AddDataField LINEA-INFORME-X".
move spaces TO FUNC-EPSON-LIB.
MOVE 2 TO BufferLen.
MOVE "AddDataField" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-INFORME-X
BY VALUE BufferLen.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "AddDataField LINEA-INFORME-X".
move spaces TO FUNC-EPSON-LIB.
*AddDataField
call ADDSTRING of p-comandos using "AddDataField LINEA-EXTRA-X".
MOVE 2 TO BufferLen.
MOVE "AddDataField" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE LINEA-EXTRA-x
BY VALUE BufferLen.
display PROGRAM-STATUS.
move spaces TO FUNC-EPSON-LIB.
call DISPLAYMESSAGE of ComFis using "AddDataField LINEA-EXTRA".
*SendCommand
call ADDSTRING of p-comandos using "SendCommand".
MOVE "SendCommand" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "SendComand".
***** ClosePort
call ADDSTRING of p-comandos using "ClosePort".
MOVE spaces TO FUNC-EPSON-LIB.
MOVE "ClosePort" TO FUNC-EPSON-LIB.
CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE VERSION.
display PROGRAM-STATUS.
call DISPLAYMESSAGE of ComFis using "Close Port".

fastpho
31 de julio de 2020, 14:49
@jhjacomo, Por ahi no me explique bien , la impresora fiscal si esta conectada via USB te tiene que aparecer como un dispositivo mas , en dispositivos e impresoras es un chequeo rapido , creo que no te deja sacar el informe X es por que se cumplieron 24 hs , es decir una vez que se inicia la jornada fiscal con cualquier tipo de documento impreso , el impresor comienza a contar 24 hs una vez transcurrido este tiempo no te deja imprimir documentos fiscales o no fiscales , por lo tanto te obliga a realizar un cierre diario Z , como te das cuenta de esto o de cualquier otro error en estas propiedades:


* ** ESTADO COMPROBACION RAPIDA 0 NO HAY PROBLEMA
move "getReturnCode" TO FUNC-EPSON-LIB.
* CALL FUNC-EPSON-LIB WITH STDCALL USING BY REFERENCE CODIGO-DE-RETORNO returning CODIGO-DE-RETORNO.
CALL FUNC-EPSON-LIB WITH STDCALL RETURNING CODIGO-DE-RETORNO.
MOVE CODIGO-DE-RETORNO TO "Text" OF CmRetorno.



Tambien debes mirar otras propiedades que es :
Estado Fiscal :
int getFiscalStatus( void );
Estado del Impresor :
int getPrinterStatus( void );

---------- Post añadido : 13:49 ---------- Post anterior : 20:33 ----------

@jhjacomo, como te fue , pudiste sacar Z
Saludos

jhjacomo
1 de agosto de 2020, 02:37
Hola @fastpho, apareció el problema. Mi computadora tiene un enchufe USB de los parlantes que estaba dañado y parece que eso hizo que me dejaran de funcionar algunos USB. Armé todo en una computadora distinta y quedo todo funcionando. Seguí sacando X y Z sin ningún problema, el tema de las 24 horas se refiere a la emisión de comprobantes de venta, no puedo emitir un comprobante si en las ultimas 24 horas no emití una Z, pero X y Z se pueden emitir las que quieras, ahora si el controlador está inicializado, es conveniente sacar UNA Z por día, porque existe una limitación de cantidades de Z´s por controlador, no así las X.
Ahora esto es un OFF TOPIC, se solucionará el problema de los USB reinstalando el windows o ya hay un problema físico en la placa? A alguien le paso algo parecido?
Gracias,

jhjacomo
29 de agosto de 2020, 03:25
Hola, buenas tardes al foro.
Retomando la programación del Epson TM T900AF.
Les comento la situación:
Sistema Operativo; Windows 7 64 bit
Version de Cobol: PowerCobol 3
Dll Usada: EpsonFiscalDriver.dll

Ya logré emitir Z y X sin problemas, ahora quiero ver el estado del controlador y evidentemente algo estoy haciendo mal, les copio el código:

***** getPrinterState
call ADDSTRING of p-comandos using "getPrinterStatus".
MOVE "getPrinterStatus" TO FUNC-EPSON-LIB.
move spaces to mensa.
CALL FUNC-EPSON-LIB.
move PROGRAM-STATUS to wstatus.


En todos las pruebas el PROGRM-STATUS me da cero, controlador apagado, sin papel o en uso.
En PowerCobol 3 no puedo usar "CALL FUNC-EPSON-LIB WITH STDCALL RETURNING CODIGO-CmImpresor." puesto que en esta versión da error al compilar, hay que tomar la respuesta del comando en PROGRAM-STATUS.
Saludos amigos, espero me puedan dar una mano con este tema.

jhjacomo
29 de agosto de 2020, 03:26
Hola, buenas tardes al foro.
Retomando la programación del Epson TM T900AF.
Les comento la situación:
Sistema Operativo; Windows 7 64 bit
Version de Cobol: PowerCobol 3
Dll Usada: EpsonFiscalDriver.dll

Ya logré emitir Z y X sin problemas, ahora quiero ver el estado del controlador y evidentemente algo estoy haciendo mal, les copio el código:

***** getPrinterState
call ADDSTRING of p-comandos using "getPrinterStatus".
MOVE "getPrinterStatus" TO FUNC-EPSON-LIB.
move spaces to mensa.
CALL FUNC-EPSON-LIB.
move PROGRAM-STATUS to wstatus.


En todos las pruebas el PROGRM-STATUS me da cero, controlador apagado, sin papel o en uso.
En PowerCobol 3 no puedo usar "CALL FUNC-EPSON-LIB WITH STDCALL RETURNING CODIGO-CmImpresor." puesto que en esta versión da error al compilar, hay que tomar la respuesta del comando en PROGRAM-STATUS.
Saludos amigos, espero me puedan dar una mano con este tema.