ABAP-串口通信-道閘設備


最近SAP系統需要與道閘設備集成,通過串口通訊模式控制道閘欄桿升降,在此將開發過程中的思路及問題點做個備注。

一.相關設備

 道閘設備型號:富士智能FJC-D618  

 串口模塊:康耐德 C2000-A1-PXD0020-BX1  

 轉換器:DTECH DT-9020 RS-232<=>RS485

二.設備集成方式:調用系統組件MSComm32.OCX 

 64位文件路徑:C:\Windows\SysWOW64\MSCOMM32.OCX 

 若找不到MSCOMM32.OCX組件,可以網上下載。

三.組件MSComm32.OCX 相關屬性說明

 路徑:VB-串口通信詳解

四.SAP與道閘設備集成操作步驟

 1.控件注冊

  a.將MSComm32.OCX文件放置在 C:\Windows\SysWOW64 路徑下(32位操作系統放在 C:\Windows\System32 )

  b.控件注冊:管理員權限運行CMD->Regsvr32  C:\Windows\SysWOW64\MSCOMM32.OCX 

  c.修改注冊表(這一步感覺可有可無):

    c1.運行CMD->Regedit

    c2.在HKEY_CLASSES_ROOT\Licenses下新建項:4250E830-6AC2-11cf-8ADB-00AA00C00905  修改數值數據:kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun

  d.重啟電腦,控件啟用

 2.SAP系統應用程序維護

  a.查找CLSID:運行CMD->Regedit,搜索“MSCOMMLib.MSComm.1”,獲取CLSID:{648A5600-2C6E-101B-82B6-000000000014}

  b.登錄GUI,T-CODE:SOLE  修改-新條目

OLE 應用程序: MSCOMMLIB.MSCOMM.1
版本號:
CLSID:             {648A5600-2C6E-101B-82B6-000000000014}
CLSID 庫類型:
OLE 對象名:
類型信息代碼:
包含程序:
語言:
檢查權限:
文本:

 3.SAP直接調用MSCOMM32.OCX控件(16進制多條記錄無法發送下位機

*&---------------------------------------------------------------------*
*& Report  ZRICO_MSCOMM
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
report zrico_mscomm.
data:
  lv_cur    type string,
  lv_rst    type string,
  lv_buffer type i.
data:
  lo_dz     type ole2_object.

selection-screen begin of block block1 with frame title text-001.
  parameters:
    p_port  type char30 default '1',
    p_sett  type char30 default '9600,n,8,1',
    p_inpt  type char30 default '0',
    p_open  type char30 default '1',
    p_intxt type string default '01 01 00 64 00 01 BC 15',
    p_ottxt type string.
selection-screen end of block block1.

start-of-selection.

  call function 'AUTHORITY_CHECK_OLE'
    exporting
      program          = sy-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 lo_dz 'MSCOMMLib.MSComm.1'.
  if sy-subrc <> 0.
    raise no_create_object.
  endif.
  "初始參數
  set property of lo_dz 'CommPort'      = p_port.
  set property of lo_dz 'Settings'      = p_sett.
  set property of lo_dz 'InputMode'     = 1.
  set property of lo_dz 'InputLen'      = p_inpt.
  set property of lo_dz 'InBufferSize'  = 1024.
  set property of lo_dz 'OutBufferSize' = 512.

  "打開串口
  set property of lo_dz 'PortOpen' = p_open.

  "發送數據-多條記錄-16進制
  "此處不知如何處理:需將16進制轉換為字符數組Byte[]方式發送至下位機
  "若將16進制轉換為10進制內表傳值則直接Dump,若直接傳輸16進制字符串則無返回值
  set property of lo_dz 'Output' = p_intxt.

  "接收數據
  do 40 times.
    get property of lo_dz 'InBufferCount' = lv_buffer.
    if lv_buffer > 0.
      get property of lo_dz 'Input' = lv_rst.
      exit.
    endif.
  enddo.

  "關閉串口
  set property of lo_dz 'PortOpen' = 0.

  "釋放
  free object lo_dz.

  3.1因發送16進制數據為多條記錄,控件MSCOMM發送數據類型為Byte[],ABAP無法將16進制數轉換為字節數組,若轉換為內表傳輸則直接Dump,最終無解。

  3.2ABAP無法一次發送多條記錄至下位機,則改用其他方式處理(詳見4):

   a.用VB創建DLL文件,引用MSCOMM32.OCX控件並創建多個類方法。

   b.系統注冊DLL文件

   c.SAP調用DLL文件,並訪問自定義方法類

 4.解決16進制多條記錄發送問題

  4.1用VB創建DLL文件,封裝MSCOMM32.OCX控件相關屬性及自定義方法

   VB-創建類模塊DLL文件

  4.2SAP調用自定義類文件 MSCommPrj.DLL

   a.注冊文件MSCommPrj.DLL

    運行CMD->regsvr32 文件路徑

   b.ABAP調用類文件 :16進制多條記錄用"&"符號拼接為字符串

*&---------------------------------------------------------------------*
*& Report  ZRICO_MSCOMMPRJ
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
report zrico_mscommprj.

data:
  gv_rst    type string.
data:
  go_mscomm type ole2_object.

selection-screen begin of block block1 with frame title text-001.
  parameters:
    p_port type char10 default '1',
    p_sett type char30 default '9600,n,8,1',
    p_mode type char10 default '0',
    p_time type char10 default '100',
    p_data type char200 default '01 01 00 64 00 01 BC 15 & 01 0F 00 64 00 01 01 FF 1F 1F & 01 01 00 64 00 01 BC 15 & 01 0F 00 64 00 01 01 00 5F 5F'.
selection-screen end of block block1.

start-of-selection.
  call function 'AUTHORITY_CHECK_OLE'
    exporting
      program          = sy-repid
      activity         = sabc_act_call
      application      = 'MSCommPrj.msCommCls'
    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 go_mscomm 'MSCommPrj.msCommCls'.
  if sy-subrc <> 0.
    raise no_create_object.
  endif.

  "初始化參數
  call method of go_mscomm 'frm_initial_parameters' = gv_rst
    exporting
      #1 = p_port
      #2 = p_sett
      #2 = p_mode .
  write:/10 gv_rst.

  "打開串口
  call method of go_mscomm 'frm_open_serialport' = gv_rst.
  write:/10 gv_rst.

  "發送數據
  call method of go_mscomm 'frm_send_data' = gv_rst
    exporting
      #1 = p_mode
      #2 = p_time
      #2 = p_data .
  write:/10 gv_rst.

  "接收數據
  call method of go_mscomm 'frm_receive_data' = gv_rst
    exporting
      #1 = p_mode.
  write:/10 gv_rst.

  "關閉串口
  call method of go_mscomm 'frm_close_serialport' = gv_rst.
  write:/10 gv_rst.

  free object go_mscomm.

 5.SAP測試DLL

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM