最近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-.
parameters:
p_port type char30 default '',
p_sett type char30 default '9600,n,8,1',
p_inpt type char30 default '',
p_open type char30 default '',
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 =
activity_unknown =
others = .
if sy-subrc <> .
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 <> .
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' = .
set property of lo_dz 'InputLen' = p_inpt.
set property of lo_dz 'InBufferSize' = .
set property of lo_dz 'OutBufferSize' = . "打开串口
set property of lo_dz 'PortOpen' = p_open. "发送数据-多条记录-16进制
"此处不知如何处理:需将16进制转换为字符数组Byte[]方式发送至下位机
"若将16进制转换为10进制内表传值则直接Dump,若直接传输16进制字符串则无返回值
set property of lo_dz 'Output' = p_intxt. "接收数据
do times.
get property of lo_dz 'InBufferCount' = lv_buffer.
if lv_buffer > .
get property of lo_dz 'Input' = lv_rst.
exit.
endif.
enddo. "关闭串口
set property of lo_dz 'PortOpen' = . "释放
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-.
parameters:
p_port type char10 default '',
p_sett type char30 default '9600,n,8,1',
p_mode type char10 default '',
p_time type char10 default '',
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 =
activity_unknown =
others = .
if sy-subrc <> .
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 <> .
raise no_create_object.
endif. "初始化参数
call method of go_mscomm 'frm_initial_parameters' = gv_rst
exporting
# = p_port
# = p_sett
# = p_mode .
write:/ gv_rst. "打开串口
call method of go_mscomm 'frm_open_serialport' = gv_rst.
write:/ gv_rst. "发送数据
call method of go_mscomm 'frm_send_data' = gv_rst
exporting
# = p_mode
# = p_time
# = p_data .
write:/ gv_rst. "接收数据
call method of go_mscomm 'frm_receive_data' = gv_rst
exporting
# = p_mode.
write:/ gv_rst. "关闭串口
call method of go_mscomm 'frm_close_serialport' = gv_rst.
write:/ gv_rst. free object go_mscomm.

5.SAP测试DLL

 

 

ABAP-串口通信-道闸设备的更多相关文章

  1. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)

    星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...

  2. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  3. Win10 IoT C#开发 4 - UART 串口通信

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...

  4. 使用Java实现简单串口通信

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...

  5. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  6. LabVIEW串口通信

    Instrument I/O 利用LabVIEW内置的驱动程序库和具有工业标准的设备驱动软件,可对 GPIB(通用接口总线).Ethernet(以太网)接口.RS-232(标准串行接口总线)/RS-4 ...

  7. C#中的串口通信

    关于串行接口 串行接口(Serial port)又称“串口”,主要用于串行式逐位数据传输.常见的有一般电脑应用的RS-232(使用 25 针或 9 针连接器)和工业电脑应用的半双工RS-485与全双工 ...

  8. boost实现串口通信(一):小试牛刀

    /************************************************************************/ /* 功能:boost实现串口通信类 */ /* ...

  9. C# 串口通信总结

    在C#串口通信开发过程中有的产家只提供通信协议,这时候开发人员要自己根据协议来封装方法,有的产家比较人性化提供了封装好的通信协议方法供开发人员调用. 1.只提供通信协议(例如,今年早些时候开发的出钞机 ...

随机推荐

  1. Heap堆分析(堆转储、堆分析)

    一.堆直方图 减少内存使用时一个重要目标,在堆分析上最简单的方法是利用堆直方图.通过堆直方图我们可以快速看到应用内的对象数目,同时不需要进行完整的堆转储(因为堆转储需要一段时间来分析,而且会消耗大量磁 ...

  2. 解决wordpress文章归档和分类目录小工具标题重复问题

    最近更新了wordpress,发现更新后小工具中的文章归档和分类目录出现了标题重复,经检查,是部分主题下,主题的代码已经输出了标题,而wordpress的代码又再次输出了一次.于是我们需要删除word ...

  3. oracle表空间不足时如何处理

    1 查看表在那个表空间select tablespace_name,table_name from all_tables where table_name='T_BM_GOODS_BASE'; 2   ...

  4. Oracle group by

    group by 简单点理解就是根据什么分组 为此 group by job   根据job进行分组 举例:在Oracle当中scott/oracle 下有emp表 进行如下操作  体会order b ...

  5. mvc5总结(1)

    1.Global.asax 全局的启动项,初始化相关配置 2.路由,按照默认规定请求就行,没必要扩展太多 3.区域路由,当我们想命名相同的controller和action时,结合命名空间使用 pub ...

  6. Delphi2010/XE2下隐藏程序系统任务栏的图标

    Delphi7代码: SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); 以上的代码在Delphi7中可以用,但是在Delp ...

  7. 机器学习简要笔记(三)-KNN算法

    #coding:utf-8 import numpy as np import operator def classify(intX,dataSet,labels,k): ''' KNN算法 ''' ...

  8. 电商系统架构总结1(EF)

    最近主导了一个电商系统的设计开发过程,包括前期分析设计,框架搭建,功能模块的具体开发(主要负责在线支付部分),成功上线后的部署维护,运维策略等等全过程. 虽然这个系统不是什么超大型的电商系统 数亿计的 ...

  9. better-scroll高度问题

    better-scroll无法滚动主要2方面原因,1)层级关系.2)高度问题

  10. 求计算两个时间的差(DateTime类和TimeSpan类)

    日期时间数据是项目设计过程中经常需要处理的信息,C#提供了DateTime类和TimeSpan类来处理日期时间数据.下面介绍说明Datetime类和TimeSpan类的使用 //初始化DateTime ...