最近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控件相關屬性及自定義方法
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


