SAP连接电脑串口读数(电子称,磅等数据读取)详解编程语言

这是几年前做的了,一直都不想分享出来,后来想想为了能够给大家点想法,献出来了。。。

这是一个电脑读称的方法,一般用COMM口连接的电子设备都可参考。

如果是对串口参数不确定的,可以网上找个串口测试工具,轻松测出串口参数

网上搜索MSCOMM32.OCX

1.将上面的MSCOMM32.OCX保存到系统目录下C:/Windows/SysWOW64/MSCOMM32.OCX

然后注册:REGSVR32 C:/Windows/SysWOW64/MSCOMM32.OCX

2.修改注册表:

REGEDIT

在HKEY_CLASSES_ROOT/Licenses下建一项:

4250E830-6AC2-11cf-8ADB-00AA00C00905

修改数值数据:kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun

重新启动电脑,这样COMM组件就能使用了

以上是在PC上配置的数据。

登陆GUI

T-code: SOLE

新建条目:

OLE 应用程序         MSCOMMLIB.MSCOMM.1

版本号

类标识               {648A5600-2C6E-101B-82B6-000000000014}

CLSID 库类型

OLE 对象名

类型信息键值

包含程序

语言

检查权限

文本

FUNCTION z_bc_get_balance. 
*"---------------------------------------------------------------------- 
*"*"本地接口: 
*"  IMPORTING 
*"     REFERENCE(MODE) TYPE  I DEFAULT 0 
*"     REFERENCE(COMMPORT) TYPE  I DEFAULT 1 
*"     VALUE(SETTINGS) TYPE  C DEFAULT '1200,N,8,1' 
*"     REFERENCE(I_INPUT) TYPE  C OPTIONAL 
*"  EXPORTING 
*"     REFERENCE(E_OUTPUT) TYPE  C 
*"  EXCEPTIONS 
*"      NO_CREATE_OBJECT 
*"---------------------------------------------------------------------- 
 
  TYPE-POOLS:sabc. 
  INCLUDE ole2incl. 
  DATA pos TYPE i. 
  CLEAR: pos,balance,value,e_output. 
  PERFORM prm_get_settings CHANGING settings. 
*  WAIT UP TO 3 SECONDS. 
  PERFORM prm_init. 
  PERFORM prm_open_port USING commport settings. 
  IF mode = 0."读取串口数据 
    PERFORM prm_read_port CHANGING e_output. 
  ELSEIF mode = 1."写串口数据 
    PERFORM prm_write_port USING i_input CHANGING e_output. 
  ENDIF. 
  PERFORM prm_final. 
  SEARCH balance FOR '+'. 
  IF sy-subrc = 0. 
    pos = sy-fdpos. 
    SHIFT balance BY ( pos + 1 ) PLACES. 
  ENDIF. 
  SEARCH balance FOR 'g'. 
  IF sy-subrc = 0. 
    pos = sy-fdpos. 
    balance = balance+0(pos). 
    CONDENSE balance NO-GAPS. 
    e_output = balance. 
  ENDIF. 
  COMMIT WORK 
ENDFUNCTION. 
 
 
 
此块为配置接口类型模块(自建表用IP地址来配置相应的comm口参数) 
***************************************************************************** 
FORM prm_get_settings  CHANGING p_settings. 
  DATA addr TYPE ni_nodeaddr. 
  CLEAR addr. 
  CALL FUNCTION 'TH_USER_INFO' 
    IMPORTING 
      addrstr = addr. 
  SELECT SINGLE setting INTO p_settings FROM zbctaddr WHERE addr = addr. 
  IF sy-subrc = 0. 
    CLEAR addr. 
  ENDIF. 
ENDFORM.                    " PRM_GET_SETTINGS 
 
 
 
初始化接口对象 
****************************************************************************** 
FORM prm_init . 
  DATA: 
    wa_repid LIKE sy-repid. 
  CLEAR wa_repid. 
  wa_repid = sy-repid. 
  CALL FUNCTION 'AUTHORITY_CHECK_OLE' 
    EXPORTING 
      program          = wa_repid 
      activity         = sabc_act_call 
      application      = 'MSCOMMLIB.MSCOMM.1' 
    EXCEPTIONS 
      no_authority     = 1 
      activity_unknown = 2 
      OTHERS           = 3. 
  IF sy-subrc <> 0. 
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. 
  ENDIF. 
  CREATE OBJECT o_obj 'MSCOMMLib.MSComm.1'. 
  IF sy-subrc <> 0. 
    RAISE no_create_object. 
  ENDIF. 
ENDFORM.                    " PRM_INIT 
 
 
接口打开 
*************************************************************************** 
FORM prm_open_port  USING commport 
                           settings. 
 
  SET PROPERTY OF o_obj 'CommPort' = commport. 
  SET PROPERTY OF o_obj 'Settings' = settings. 
  SET PROPERTY OF o_obj 'InputLen' = 0. 
  SET PROPERTY OF o_obj 'PortOpen' = 1. 
ENDFORM.                    " PRM_OPEN_PORT 
 
 
 
读取接口数据:因为接口有缓存所以每次读取时都是去掉前面20次的数据 
而且每次读取的数据都是不完整的,所以需要将多次读取的数据连接起来,然后截取 
**************************************************************************** 
FORM prm_read_port  CHANGING e_output. 
  DATA: 
    wa_buffer TYPE i, 
    inde      TYPE i. 
  DO 70 TIMES. 
     inde = inde + 1. 
    GET PROPERTY OF o_obj 'InBufferCount' = wa_buffer. 
    IF wa_buffer > 0. 
      GET PROPERTY OF o_obj 'Input' = e_output. 
      IF inde < 20. 
        ELSE. 
          CONCATENATE balance e_output INTO balance. 
      ENDIF. 
    ENDIF. 
  ENDDO. 
  CLEAR:wa_buffer,inde. 
ENDFORM.                    " PRM_READ_PORT 
 
 
 
往串口写数据,因为没有需求所以没做测试 
********************************************************************* 
FORM prm_write_port  USING    i_input 
                     CHANGING e_output. 
  DATA: 
    wa_buffer TYPE i. 
  SET PROPERTY OF o_obj 'Output' = i_input. 
  DO 40 TIMES. 
    GET PROPERTY OF o_obj 'InBufferCount' = wa_buffer. 
    IF wa_buffer > 0. 
      GET PROPERTY OF o_obj 'Input' = e_output. 
      EXIT. 
    ENDIF. 
  ENDDO. 
ENDFORM.                    " PRM_WRITE_PORT 
 
 
读数结束,关闭串口,释放对象,清空变量 
************************************************************************ 
FORM prm_final . 
  SET PROPERTY OF o_obj 'PortOpen' = 0. 
  FREE OBJECT o_obj. 
  CLEAR o_obj. 
  COMMIT WORK. 
ENDFORM.                    " PRM_FINAL

对读数做了个简单的处理

FORM PRM_READ_PORT02  CHANGING E_OUTPUT. 
  DATA: 
    WA_BUFFER TYPE I, 
    INDE      TYPE I,LV_CHAR TYPE C. 
  DATA:LV_STR TYPE STRING VALUE '0123456789.'. 
  DATA:LV_STR2 TYPE STRING. 
  DATA:LV_STR3 TYPE STRING. 
  DATA POS TYPE I. 
  CLEAR:LV_CHAR,LV_STR2,INDE,LV_STR3,POS. 
  WHILE LV_CHAR IS INITIAL. 
    GET PROPERTY OF O_OBJ 'InBufferCount' = WA_BUFFER. 
    IF WA_BUFFER > 0. 
 
      GET PROPERTY OF O_OBJ 'Input' = E_OUTPUT. 
      SEARCH E_OUTPUT FOR '+'. 
      IF SY-SUBRC = 0. 
        POS = SY-FDPOS. 
        SHIFT E_OUTPUT BY ( POS + 1 ) PLACES. 
      ELSE. 
        CONTINUE. 
      ENDIF. 
 
      SEARCH E_OUTPUT FOR 'g'. 
      IF SY-SUBRC = 0. 
        POS = SY-FDPOS. 
        E_OUTPUT = E_OUTPUT+0(POS). 
        CONDENSE E_OUTPUT NO-GAPS. 
        E_OUTPUT = E_OUTPUT. 
      ELSE. 
        CONTINUE. 
      ENDIF. 
 
*      SEARCH E_OUTPUT FOR '.'. 
*      IF SY-SUBRC = 0. 
*      ELSE. 
*        CONTINUE. 
*      ENDIF 
*. 
      CLEAR:LV_STR2. 
      MOVE E_OUTPUT TO LV_STR2. 
      IF LV_STR2 CO LV_STR. 
*        INDE = INDE + 1. 
*        IF INDE = 1. 
*          MOVE E_OUTPUT TO LV_STR3. 
*        ELSEIF INDE = 2. 
*          CLEAR:INDE. 
*          IF LV_STR2 = LV_STR3. 
        LV_CHAR = 'X'. 
*          ENDIF. 
*        ENDIF. 
      ENDIF. 
    ENDIF. 
  ENDWHILE. 
  CLEAR:WA_BUFFER,INDE. 
ENDFORM.                    " PRM_READ_PORT02

以字符流传过来的,在处理的时候,自己看着办了。。。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18637.html

(0)
上一篇 2021年7月19日 21:20
下一篇 2021年7月19日 21:20

相关推荐

发表回复

登录后才能评论