Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] Manejo OCX impresora Fiscal Epson nueva generación (https://www.cobolforo.es/showthread.php?t=601)

fastpho 10 de abril de 2017 23:27

Manejo OCX impresora Fiscal Epson nueva generación
 
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

Impresoras Fiscales nueva generacion
 
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:


Código:

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




Código COBOL:
  1. WORKING-STORAGE SECTION.
  2.  01 ReturnDEValue        PIC S9(9) COMP-5 VALUE 0.
  3.  01 LINEA-ESTADO.
  4.     03 Comando            PIC X VALUE  X"00".
  5.     03 Comandobis         PIC X VALUE  X"01".
  6.  01 LINEA-EXTRA.  
  7.     03 DataField1         PIC X VALUE  X"00".
  8.     03 DataField2         PIC X VALUE  X"00".
  9. *01 ReturnString       PIC X(12).
  10. *01 Variable           PIC 9(3).
  11.  PROCEDURE       DIVISION.
  12. * abre el puerto
  13.      INVOKE EpsonFPHostControl1 "OpenPort"                         RETURNING ReturnDEValue.
  14. * dato a enviar al impresor
  15.      INVOKE EpsonFPHostControl1 "AddDataField" USING LINEA-ESTADO  RETURNING ReturnDEValue.
  16. * dato a enviar al impresor
  17.      INVOKE EpsonFPHostControl1 "AddDataField" USING LINEA-EXTRA   RETURNING ReturnDEValue.
  18. * aca envia el paquete de datos
  19.      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

Impresoras Fiscales nueva generacion
 
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) :

Código VB:
  1. Case 0
  2.         '---------------------------
  3.        ' Cierre X
  4.        '---------------------------
  5.            sCmd = Chr$(&H8) + Chr$(&H2)
  6.             MsgBox sCmd
  7.             If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmd)
  8.            sCmdExt = Chr$(&HC) + Chr$(&H21)
  9.           '  sCmdExt = Chr$(&H0) + Chr$(&H1)
  10.            If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmdExt)
  11.             If bAnswer Then bAnswer = Me.EpsonFP.SendCommand
  12.             Call FPDelay
  13.             If Me.EpsonFP.ReturnCode <> 0 Then ShowMsg
  14.            
  15.  Case 1
  16.         '---------------------------
  17.        ' Cierre Z
  18.        '---------------------------
  19.            sCmd = Chr$(&H8) + Chr$(&H1)
  20.             If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmd)
  21.             sCmdExt = Chr$(&HC) + Chr$(&H0)
  22.             If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmdExt)
  23.             If bAnswer Then bAnswer = Me.EpsonFP.SendCommand
  24.             Call FPDelay
  25.             If Me.EpsonFP.ReturnCode <> 0 Then ShowMsg
  26.            
  27. Case 6
  28.         '---------------------------
  29.        ' Estado
  30.        '---------------------------
  31.            sCmd = Chr$(&H0) + Chr$(&H1)
  32.             If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmd)
  33.             sCmdExt = Chr$(&H0) + Chr$(&H0)
  34.             If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmdExt)
  35.             If bAnswer Then bAnswer = Me.EpsonFP.SendCommand
  36.             Call FPDelay
  37.             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

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

Código VB:
  1. sCmd = Chr$(&H0) + Chr$(&H1)
  2. sCmdExt = Chr$(&HC) + Chr$(&H0)

En COBOL equivale a:

Código COBOL:
  1.  01  sCmd            PIC X(2) VALUE X'0001'.
  2.  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

Código:

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:

Código COBOL:
  1.      WORKING-STORAGE SECTION.
  2.      01  sCmd            PIC X(2) VALUE X'0001'.
  3.      01  sCmdExt         PIC X(2) VALUE X'0C00'.
  4.      01  bAnswer         PIC S9(9) COMP-5.
  5.      PROCEDURE DIVISION
  6.        
  7.          *> código de antes...............
  8.        
  9.          *> Estado        
  10.          MOVE X'00' & X'01' TO sCmd
  11.          
  12.          IF  bAnswer NOT = ZEROS
  13.              INVOKE EpsonFP "AddDataField" USING sCmd RETURNING bAnswer
  14.              
  15.              MOVE X'00' & X'00' TO sCmdExt
  16.              
  17.              IF  bAnswer NOT = ZEROS            
  18.                  INVOKE EpsonFP "AddDataField" USING sCmdExt RETURNING bAnswer
  19.                  
  20.                  IF  bAnswer NOT = ZEROS
  21.                      INVOKE EpsonFP "SendCommand"
  22.                      
  23.                      CALL "FPDelay"
  24.            
  25.                      PERFORM ShowMsg
  26.                  END-IF
  27.              END-IF
  28.          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

1 Archivos Adjunto(s)
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" :

Cita:

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:
Código COBOL:
  1. 01  aa       pic x(015).
  2.  
  3. move "abcde" to aa.
  4. move x"00"    to aa(5:1).
Poderá ser isso?
Rui

Kuk 21 de abril de 2017 08:55

Cita:

Citación del post de Rapinto (Mensaje 2924)
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 :
Código COBOL:
  1.  move X'00' & X'01' & X'00' to sCmd.
Código COBOL:
  1.  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
Código COBOL:
  1.     move X"08" & X"02"  to sCmd.
  2.      INVOKE EpsonFPHostControl1 "AddDataField" USING sCmd        RETURNING ReturnDEValue.
  3.      move X"0C" & X"21"  to sCmdExt.
  4.      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
Código COBOL:
  1.    move X'00' & X'01'   to sCmd.
  2.      if bAnswer not = zeros
  3.              INVOKE EpsonFPHostControl1 "AddDataField" USING sCmd          RETURNING bAnswer
  4.              move X'00' & X'00'   to sCmdExt
  5.                   if bAnswer not = zeros
  6.                                 INVOKE EpsonFPHostControl1 "AddDataField" USING sCmdExt          RETURNING bAnswer
  7.                                
  8.                                if bAnswer not = zeros
  9.                                   INVOKE EpsonFPHostControl1 "SendCommand"                      RETURNING bAnswer
  10.                                   CALL "BUSY"
  11.                                end-if
  12.                   end-if
  13.      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:
Cita:

Citación del post de fastpho (Mensaje 2926)
No es al reves el power le manda al final de cada string el caracter X"00"

Pasa porque hemos definido los campos como:

Código COBOL:
  1.  01  sCmd            PIC X(2) VALUE X'0001'.
  2.  01  sCmdExt         PIC X(2) VALUE X'0C00'.

Intenta hacer pruebas con:

Código COBOL:
  1.  01  sCmd            PIC X(250) VALUE X'0001'.
  2.  01  sCmdExt         PIC X(250) VALUE X'0C00'.

fastpho 21 de abril de 2017 23:38

le mande esto para obtener el informe
Código COBOL:
  1.  01  sCmd            PIC X(250) VALUE X'0802'.
  2.  01  sCmdExt         PIC X(250) VALUE X'0C21'.    
y es lo mismo que esto
Código COBOL:
  1.      01  sCmd             PIC X(4) VALUE X'0802'.
  2.      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

Cita:

Citación del post de fastpho (Mensaje 2933)
siempre le pone el x'00' al final de cada campo

¿Estas seguro de ello? Porque no es normal, en COBOL aunque hagamos
Código COBOL:
  1.      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:

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  sCmd            PIC X(250).
  3.  01  sCmdExt         PIC X(250).
  4.  
  5.  PROCEDURE DIVISION.
  6.          
  7.      MOVE X'0802' TO sCmd   (1:2)
  8.      MOVE X'0C21' TO sCmdExt(1:2)
  9.      MOVE SPACES  TO sCmd   (3:)
  10.                      sCmdExt(3:)

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

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  sCmd            PIC X(250).
  3.  01  sCmdExt         PIC X(250).
  4.  
  5.  PROCEDURE DIVISION.
  6.          
  7.      MOVE X'0802' TO sCmd   (1:2)
  8.      MOVE X'0C21' TO sCmdExt(1:2)
  9.      MOVE SPACES  TO sCmd   (3:)
  10.                      sCmdExt(3:)
  11.      MOVE X'00'   TO sCmd   (250:1)
  12.                      sCmdExt(250:1)

fastpho 24 de abril de 2017 22:14

1 Archivos Adjunto(s)
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

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01 ReturnDEValue        PIC S9(9) COMP-5 VALUE 0.
  3.  01  sCmd            PIC X(250).
  4.  01  sCmdExt         PIC X(250).
  5.  PROCEDURE       DIVISION.
  6.      MOVE X'0802' TO sCmd   (1:2).
  7.      MOVE X'0C21' TO sCmdExt(1:2).
  8.      MOVE SPACES  TO sCmd   (3:)
  9.                      sCmdExt(3:).
  10.      MOVE X'00'   TO sCmd   (250:1)
  11.                      sCmdExt(250:1)                    
  12.      INVOKE EpsonFPHostControl1 "OpenPort"                    RETURNING ReturnDEValue.                    
  13.      INVOKE EpsonFPHostControl1 "AddDataField" USING sCmd     RETURNING ReturnDEValue.
  14.      INVOKE EpsonFPHostControl1 "AddDataField" USING sCmdExt  RETURNING ReturnDEValue.
  15.      INVOKE EpsonFPHostControl1 "SendCommand"                 RETURNING ReturnDEValue.    
  16.      call "BUSY".    
  17.      INVOKE EpsonFPHostControl1 "ClosePort"                   RETURNING ReturnDEValue.
  18.          
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
Código COBOL:
  1.     MOVE X'00'   TO sCmd   (250:1)
  2.                     sCmdExt(250:1)


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

Mira ese link kuk
IBM Knowledge Center

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

IBM Knowledge Center

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 ;)


Cita:

Citación del post de fastpho (Mensaje 2949)
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

Cita:

Citación del post de fastpho (Mensaje 2956)
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

Impresoras Fiscales nueva generacion
 
1 Archivos Adjunto(s)
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:

Código COBOL:
  1.         MOVE X'00'   TO sCmd   (250:1)
  2.                         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

1 Archivos Adjunto(s)
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

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:

Código CPP:
  1. void setComPort( int Port )

Código:

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:

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  sPort         PIC S9(9) COMP-5.
  3.  
  4.  PROCEDURE DIVISION.
  5.    
  6.     MOVE 0 TO sPort *> activamos USB
  7.    
  8.     CALL "setComPort" WITH STDCALL USING BY VALUE sPort

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

Código CPP:
  1. void AddDataField( char *in_buffer, int in_buffer_length )

Código:

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:
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  InBuffer      PIC X(250).
  3.  01  BufferLen     PIC S9(9) COMP-5.
  4.  
  5.  PROCEDURE DIVISION.
  6.    
  7.     *> Prueba con cada una de estas combinaciones
  8.     MOVE X"08" & X"02" TO InBuffer
  9.     MOVE 2             TO BufferLen
  10.    
  11.     MOVE X"08" & X"02" & X"00" TO InBuffer
  12.     MOVE 2                     TO BufferLen
  13.    
  14.     MOVE X"08" & X"02" & X"00" TO InBuffer
  15.     MOVE 3                     TO BufferLen
  16.    
  17.     *> La propia llamada a la Función:
  18.     CALL "AddDataField" WITH STDCALL USING BY REFERENCE InBuffer
  19.                                            BY VALUE BufferLen

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

fastpho 27 de abril de 2017 16:27

1 Archivos Adjunto(s)
gracias Kuk por tu tiempo voy a probar y lo que me sugieres y despues aviso como me fue

Código COBOL:
  1. WORKING-STORAGE SECTION.
  2.  01  sPort         PIC S9(9) COMP-5.
  3.  01  InBuffer      PIC X(250).
  4.  01  BufferLen     PIC S9(9) COMP-5.  
  5.  PROCEDURE       DIVISION.
  6.      MOVE 1 TO sPort *> activamos COM1
  7.    
  8.      CALL "setComPort" WITH STDCALL USING BY VALUE sPort
  9.  
  10.      *> Prueba con cada una de estas combinaciones
  11.      MOVE X"08" & X"02" TO InBuffer
  12.      MOVE 2             TO BufferLen
  13.    *> La propia llamada a la Función:
  14.      CALL "AddDataField" WITH STDCALL USING BY REFERENCE InBuffer
  15.                                            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

¿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. 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

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  FUNC  PIC X(10).
  5.  01  sPort         PIC S9(9) COMP-5.
  6.  01  InBuffer      PIC X(250).
  7.  01  BufferLen     PIC S9(9) COMP-5.  
  8.  PROCEDURE       DIVISION.
  9.      MOVE "setComPort" TO FUNC.
  10.      MOVE 1 TO sPort *> activamos COM1
  11.    
  12.      CALL "FUNC" WITH  STDCALL   USING BY VALUE sPort
  13.    

Kuk 28 de abril de 2017 16:16

fastpho, estás haciendo llamada estática:

Código COBOL:
  1.      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:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  FUNC  PIC X(10). *>  nombre función <===[
  5.  01  sPort         PIC S9(9) COMP-5.
  6.  01  InBuffer      PIC X(250).
  7.  01  BufferLen     PIC S9(9) COMP-5.  
  8.  PROCEDURE       DIVISION.
  9.      MOVE "setComPort" TO FUNC. *>  nombre función <===[
  10.      MOVE 1 TO sPort *> activamos COM1
  11.    
  12.      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
Código:

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

yo llamandola asi
Código COBOL:
  1.      move "getPrinterStatus" TO FUNC.
  2.      CALL FUNC WITH  STDCALL  USING BY REFERENCE CODIGO-CmImpresor.          
  3.      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


La franja horaria es GMT +2. Ahora son las 04:24.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.