CALL FUNCTION 'ZFMABAP_CAPTURA_PSERIAL '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 open_port USING commport settings settings CHANGING CHANGING lc_not_opened. 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 comunicación usando la configuración 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 comunicación *---------------------------------------------------------------------* * --> 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'. "Envío 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 comunicación *----------------------------------------------------------------------* FORM final. SET PROPERTY OF o_obj 'PortOpen' = 0. FREE OBJECT o_obj. CLEAR o_obj. ENDFORM. " final *&---------------------------------------------------------------------* *& Form Init *&---------------------------------------------------------------------* * - Verificación objeto de autorización.
* - Creación 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