Vous êtes sur la page 1sur 9

CALL FUNCTION 'ZFMABAP_CAPTURA_PSERIAL'

EXPORTING
commport
= l_puerto"g_commport "'1'
settings
= '9600,N,8,1'
close_port
= 'X'
IMPORTING
peso
= l_peso
impud
= lv_edstrin
EXCEPTIONS
no_create_object = 1
no_authority
= 2
OTHERS
= 3.
FUNCTION zfmabap_captura_pserial.
*"---------------------------------------------------------------------*"*"Interfase local
*" IMPORTING
*"
REFERENCE(COMMPORT) TYPE C DEFAULT '1'
*"
REFERENCE(SETTINGS) TYPE CHAR10 DEFAULT '9600,N,8,1'
*"
REFERENCE(CLOSE_PORT) TYPE C DEFAULT 'X'
*" EXPORTING
*"
REFERENCE(PESO) TYPE DZMENG
*"
REFERENCE(IMPUD) TYPE CHAR30
*" EXCEPTIONS
*"
NO_CREATE_OBJECT
*"
NO_AUTHORITY
*"---------------------------------------------------------------------*

Global data declarations


DATA lc_not_opened TYPE flag.
PERFORM init.
PERFORM open_port USING commport settings CHANGING lc_not_opened.
IF lc_not_opened IS INITIAL.
PERFORM read_port CHANGING peso impud.
ENDIF.
IF close_port IS NOT INITIAL.
PERFORM final.
ENDIF.

ENDFUNCTION.

*****************************************
*LZFGABAP001F01
*****************************************
*----------------------------------------------------------------------*
***INCLUDE LZBASCULAF01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&
Form get_settings
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
*
-->P_COMM
text
*
-->P_SETT
text

*----------------------------------------------------------------------*
FORM get_settings.
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file
= 'C:\FC1\SCALE.INI'
RECEIVING
result
= g_resp
EXCEPTIONS
cntl_error
= 1
error_no_gui
= 2
wrong_parameter
= 3
not_supported_by_gui = 4
OTHERS
= 5.
IF g_resp = 'X'.
REFRESH ti_settings.
CLEAR ti_settings.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename
= 'C:\FC1\SCALE.INI'
filetype
= 'ASC'
has_field_separator
= space
CHANGING
data_tab
= ti_settings[]
EXCEPTIONS
file_open_error
= 1
file_read_error
= 2
no_batch
= 3
gui_refuse_filetransfer = 4
invalid_type
= 5
no_authority
= 6
unknown_error
= 7
bad_data_format
= 8
header_not_allowed
= 9
separator_not_allowed = 10
header_too_long
= 11
unknown_dp_error
= 12
access_denied
= 13
dp_out_of_memory
= 14
disk_full
= 15
dp_timeout
= 16
not_supported_by_gui
= 17
error_no_gui
= 18
OTHERS
= 19.
IF sy-subrc = 6.
RAISE no_authority.
ENDIF.
LOOP AT ti_settings.
IF sy-tabix = 1.
gcom_1o2 = ti_settings-value(1).
ENDIF.
IF sy-tabix = 2.
gcom_set = ti_settings-value.
ENDIF.
ENDLOOP.
ENDIF.

ENDFORM.

"get_settings

*---------------------------------------------------------------------*
* FORM open_port *
*---------------------------------------------------------------------*
* Abre el puerto de comunicacin usando la configuracin predefinida.
*---------------------------------------------------------------------*
* --> COMMPORT *
* --> SETTINGS *
*---------------------------------------------------------------------*
FORM open_port USING p_comm TYPE c
p_sett TYPE char10
CHANGING pf_opened.
DATA ls_result TYPE string.
CLEAR pf_opened.
GET PROPERTY OF o_obj 'PortOpen' = ls_result.
IF ls_result NE '1'.
SET
SET
ro.bits
SET
fer
SET

PROPERTY OF o_obj 'CommPort' = p_comm.


PROPERTY OF o_obj 'Settings' = p_sett.
parada
PROPERTY OF o_obj 'InputLen' = 0.
PROPERTY OF o_obj 'PortOpen' = 1.

"nro. de puerto
"ratio baud/paridad/nro. bits/n
"lee todo el contenido del buf
"True = 1 abre el puerto

IF sy-subrc NE 0.
MOVE 'X' TO pf_opened.
ENDIF.
ENDIF.
ENDFORM. "open_port
*---------------------------------------------------------------------*
* FORM read_port *
*---------------------------------------------------------------------*
* Lee la info ingresada en el puerto de comunicacin
*---------------------------------------------------------------------*
* --> INPUT *
*---------------------------------------------------------------------*
FORM read_port CHANGING pf_peso TYPE dzmeng
p_impud type char30.
TYPES: BEGIN OF ty_data,
campo TYPE char8,
END OF ty_data.
DATA: wa_data TYPE ty_data,
it_data TYPE STANDARD TABLE OF ty_data.
DATA:

lc_i
lc_peso(20)
input(30)
li_buffer
li_lines

TYPE
TYPE
TYPE
TYPE
TYPE

i,
c,
c,
i,
syindex.

DO 10 TIMES.
DO 10 TIMES.
SET PROPERTY OF o_obj 'Output' = '%p'. "Envo parametro PRINT para obtener p
eso en el puerto
GET PROPERTY OF o_obj 'Input' = input. "Capturo el peso del puerto
lc_i = STRLEN( input ).
IF lc_i > 10.
EXIT.
ENDIF.
ENDDO.
p_impud = input.
SPLIT input AT space INTO TABLE it_data.
DELETE it_data INDEX 1.
li_lines = LINES( it_data ).
IF li_lines GT 0.
DELETE it_data INDEX li_lines.
ENDIF.
LOOP AT it_data INTO wa_data.
IF wa_data-campo CO '0123456789. '.
lc_peso = wa_data-campo.
IF lc_peso IS NOT INITIAL.
EXIT.
ENDIF.
ENDIF.
ENDLOOP.
pf_peso = lc_peso.
IF pf_peso < 0.
pf_peso = 0.
SET PROPERTY OF o_obj 'Output' = '%z'.
EXIT.
ENDIF.
IF pf_peso NE 0.
EXIT.
ENDIF.
ENDDO.
ENDFORM. " read_port
*&---------------------------------------------------------------------*
*& Form final
*&---------------------------------------------------------------------*
* Libera el objeto asociado al puerto de comunicacin
*----------------------------------------------------------------------*
FORM final.
SET PROPERTY OF o_obj 'PortOpen' = 0.
FREE OBJECT o_obj.
CLEAR o_obj.
ENDFORM. " final
*&---------------------------------------------------------------------*
*& Form Init
*&---------------------------------------------------------------------*
* - Verificacin objeto de autorizacin.

* - Creacin del objeto.


*----------------------------------------------------------------------*
FORM init.
IF o_obj IS INITIAL.

*
*
*

CREATE OBJECT o_obj 'MSCOMMLib.MSComm.1'.


IF sy-subrc <> 0.
MESSAGE ID text-t04 TYPE 'E' NUMBER 000 WITH text-e10.
MESSAGE e002(sy) WITH text-e10.
&
ENDIF.
ENDIF.

ENDFORM. " Init


*&---------------------------------------------------------------------*
*&
Form INICIO
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
*
-->P_COMMPORT text
*
-->P_SETTINGS text
*----------------------------------------------------------------------*
FORM inicio TABLES return
USING
p_comm
p_sett.
DATA: l_mess1(2).
CREATE OBJECT o_obj 'MSCOMMLib.MSComm.1'.
IF sy-subrc <> 0.
l_mess1 = p_comm.
CONDENSE l_mess1 NO-GAPS.
*

Mensaje: No se creo objeto de lectura para puerto &1 &2


PERFORM load_mesg TABLES return
USING 'E'
" TYPE
'ZBAL' " ID
'001'
" NUMBER
l_mess1 "p_comm " MESSAGE_V1 Puerto
p_sett " MESSAGE_V2 Configuracion puerto
''
''.
RAISE no_create_object.
ELSE.
CLEAR gcom_1o2.
CLEAR gcom_set.
IF

p_comm
AND p_sett
gcom_1o2 =
gcom_set =
ENDIF.

IS NOT INITIAL
IS NOT INITIAL.
p_comm.
p_sett.

ENDIF.
ENDFORM.
" INICIO
*&---------------------------------------------------------------------*
*&
Form ABRE_PORT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM abre_port TABLES p_return.
SET PROPERTY OF o_obj 'CommPort' = gcom_1o2. "nro. de puerto
SET PROPERTY OF o_obj 'Settings' = gcom_set. "ratio baud/paridad/nro. bits/n
ro.bits parada
SET PROPERTY OF o_obj 'InputLen' = 0.
"lee todo el contenido del buffe
r
SET PROPERTY OF o_obj 'PortOpen' = 1.
"True = 1 abre el puerto
IF sy-subrc <> 0.
* Mensaje: No se puede abrir el puerto &1 &2
PERFORM load_mesg TABLES p_return
USING 'E'
" TYPE
'ZBAL' " ID
'002'
" NUMBER
gcom_1o2 " MESSAGE_V1 Puerto
gcom_set " MESSAGE_V2 Configuracion puerto
''
''.
ENDIF.
ENDFORM.
" ABRE_PORT
*&---------------------------------------------------------------------*
*&
Form LEER_PORT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
*
<--P_PESO text
*
<--P_ERROR text
*----------------------------------------------------------------------*
FORM leer_port TABLES p_return
CHANGING peso
p_l_err.
TYPES: BEGIN OF ty_data,
campo TYPE char8,
END OF ty_data.
DATA: wa_data TYPE ty_data,
it_data TYPE STANDARD TABLE OF ty_data,
wa_data_aux TYPE ty_data,
it_data_aux TYPE STANDARD TABLE OF ty_data,
l_cont_err TYPE i, "Contador de lecturas error a la bascula
l_err.
DATA:

lc_i
lc_i2
lc_peso(20)
input(100)
input2(100)
l_tabix

TYPE i,
TYPE i,
TYPE c,
TYPE c,
TYPE c,
TYPE sy-tabix.

CLEAR: l_cont_err,
p_l_err,
wa_data,
it_data[],
lc_peso.
DO 30000000 TIMES.
CLEAR: input,
lc_i,
input2,
lc_i2.
GET PROPERTY OF o_obj 'Input' = input. "Captura peso en bascula
IF input IS NOT INITIAL.
lc_i = STRLEN( input ).
input2 = input.
CONDENSE input2 NO-GAPS.
lc_i2 = STRLEN( input2 ). "Si lc_i2 = 30 es lectura errada

IF lc_i > 10 AND lc_i2 < 100.


EXIT.
"Lectura correcta en pesada
ELSEIF lc_i2 = 100.
"Si hay error de bascula
l_cont_err = l_cont_err + 1. "Incremento cont de errores
IF l_cont_err > 40.
p_l_err = 'X'.
Mensaje: Bascula instable en el puerto &1 &2
PERFORM load_mesg TABLES p_return
USING 'E'
" TYPE
'ZBAL' " ID
'003'
" NUMBER
gcom_1o2 " MESSAGE_V1 Puerto
gcom_set " MESSAGE_V2 Configuracion puerto
''
''.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDDO.
IF p_l_err IS INITIAL. " Si no hay error en la lectura

Busco el valor de la pesada


SPLIT input AT space INTO TABLE it_data.
DELETE it_data WHERE campo IS INITIAL.
IF it_data[] IS NOT INITIAL.
CLEAR it_data_aux[].
it_data_aux[] = it_data[].
LOOP AT it_data INTO wa_data.
CLEAR: wa_data_aux, l_tabix.
READ TABLE it_data_aux INTO wa_data_aux WITH KEY campo = 'Net'.
IF sy-subrc = 0 AND sy-tabix >= 3.
l_tabix = sy-tabix - 2.
READ TABLE it_data INTO wa_data INDEX l_tabix.
lc_peso = wa_data-campo.
EXIT.

ENDIF.
ENDLOOP.
ENDIF.
**** Busco el valor de la pesada
***
LOOP AT it_data INTO wa_data.
***
CONDENSE wa_data-campo NO-GAPS.
***
IF wa_data-campo CO '0123456789. '
***
AND wa_data-campo <> '0.00'
***
AND wa_data-campo <> '0.000'.
***
FIND FIRST OCCURRENCE OF '.' IN wa_data-campo.
***
IF sy-subrc = 0.
***
lc_peso = wa_data-campo.
***
IF lc_peso IS NOT INITIAL.
***
EXIT.
***
ENDIF.
***
ENDIF.
***
ENDIF.
***
ENDLOOP.
peso = lc_peso.
IF peso <= 0.
peso = 0.
ENDIF.
ENDIF.
ENDFORM.
" LEER_PORT
*&---------------------------------------------------------------------*
*&
Form CERRAR_PORT
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM cerrar_port .
* SET PROPERTY OF o_obj 'InputLen' = 1.
SET PROPERTY OF o_obj 'PortOpen' = 0.
CLEAR o_obj.
FREE OBJECT o_obj.
ENDFORM.
" CERRAR_PORT
*&---------------------------------------------------------------------*
*&
Form LOAD_MESG
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
*
-->P_0407 text
*
-->P_0408 text
*
-->P_0409 text
*
-->P_P_COMM text
*
-->P_P_SETT text
*----------------------------------------------------------------------*
FORM load_mesg TABLES p_it_return " TYPE BAPIRET2 " ZTT_BAPIRET2
USING p_type
p_clase
p_number
p_mess1 " MESSAGE_V1 Puerto
p_mess2 " MESSAGE_V2 Configuracion puerto
p_mess3
p_mess4.

DATA wa_return TYPE bapiret2.


CLEAR wa_return.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid
= p_clase
msgnr
= p_number
msgv1
= p_mess1
msgv2
= p_mess2
msgv3
= p_mess3
msgv4
= p_mess4
IMPORTING
message_text_output = wa_return-message.
wa_return-type = p_type.
APPEND wa_return TO p_it_return.
ENDFORM.

" LOAD_MESG

Vous aimerez peut-être aussi