0% found this document useful (0 votes)
197 views

Abap Bascula

This document contains code to summarize a function that interfaces with a serial port to capture weight data. The function initializes an object to communicate with the serial port, opens the port using predefined settings, reads data from the port, and closes the port. It splits the incoming data, finds the weight value, and returns it along with any errors.

Uploaded by

Arturo Senosain
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
197 views

Abap Bascula

This document contains code to summarize a function that interfaces with a serial port to capture weight data. The function initializes an object to communicate with the serial port, opens the port using predefined settings, reads data from the port, and closes the port. It splits the incoming data, finds the weight value, and returns it along with any errors.

Uploaded by

Arturo Senosain
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 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

You might also like