0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术WinCE下的Modbus设备方协议软件介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2019-11-14 09:45 次阅读

Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus 协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的服务器协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC编程控制器等。Modbus通讯物理接口可以选用串口(包括RS232RS485),也可以选择以太网口。其通信遵循以下的过程:

·主设备向从设备发送请求;

·从设备分析并处理主设备的请求,然后向主设备发送结果;

·如果出现任何差错,从设备将返回一个异常功能码。

英创公司提供的ARM9嵌入式主板系列产品,均带有丰富的串口、网络资源、通用GPIO接口等,同时具有强大的处理能力,除了适用于作为Modbus 主设备的开发应用,还可以作为ModBus从设备的开发应用。主控协议软件在英创的《WinCE下的ModBus主控协议软件》一文已有介绍, 在本文中主要介绍基于实现ModBus设备方协议的软件包“WinCE下的ModBus设备方协议软件”(以下简称modbusSlave软件包)。该软件的是以C函数加静态LIB库的形式提供给客户。主要特征如下:

·非常适用于实时的工业应用。

·可以支持基于串口的Modbus协议应用或者基于TCP的Modbus协议应用。

·支持RTU传输模式。

·支持大多数的Modbus功能码操作,包括对线圈、离散开关输入的位操作,以及对寄存器的字节操作。

·可以获取通讯中传输协议的错误代码的详细信息

作为ModBus服务器,无论是基于串口还是基于TCP,在英创提供的modbusSlave软件包中,实现了对于ModBus应用报文的分析与响应,这只是ModBus通讯的一部分。另一部分是还需要有对应用数据的访问,这部分的内容则需要用户自己来进行定义,为了方便客户的使用,在modbusSlave软件包中通过函数指针的形式,实现了这些用户接口函数的自动加载,将用户应用数据处理和ModBus应用报文响应关联起来。用户只需根据需求定义这些接口函数来实现相应的功能,各个函数具体的定义是通过专门的一个CPP文件:DataProvider.cpp来实现。所以在使用英创的modbusSlave软件包时,有两个部分组成,一部分是 modbus_slave.h/ modbus_slave.lib定义的API函数;另一部分是DataProvider.h /DataProvider.cpp定义的用户数据接口函数,其中接口函数需要用户在DataProvider.cpp中具体实现。

1、modbusSlave软件包API函数

为了方便应用程序的使用,对不同的通讯介质保持一致的代码形式,英创所提供的modbusSlave软件包的API函数可以同时支持基于串口和TCP的Modbus协议,应用程序只需要在调用初始化函数时,用不同参数区分即可。以下介绍英创modbusSlave软件包的相关API函数,各个函数的定义如下:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述:通过串口或者网络TCP打开ModBus协议,连接到ModBus设备。对于串口方式,通过该函数打开串口,并设置相应串口的通讯参数,以满足数据和控制命令的通讯;对于TCP方式,通过该函数和ModBus设备建立基于Socket方式的TCP连接,利用该连接进行数据和控制命令的通讯。

输入参数 lpPortName:

该参数为TCHAR类型的字符串,该字符串中包含了启动ModBus协议的需要设置的通讯参数信息。对于串口模式和TCP两种模式分别采用不同的格式的字符串。

(1) 串口模式:

字符串必须以COM作为开头,后面再带上需要设置的串口通讯参数。格式为:

COMIdx:baudRate-dataBits-opBits-parity

其中Idx为串口序号,‘:’ 后为串口通讯参数,各个通讯参数均用整型数据来表示,依次为波特率、数据位、停止位、校验位,校验位 0-无校验 1-奇校验 2-偶校验。

如COM3作为通讯的协议口,波特率:9600bps、8为数据位、1个停止位、无校验。其格式如下:

_T( ‘COM3:9600-8-1-0’ );

也可以直接就用 _T( ‘COM3’ )来表示,表明串口所用的为缺省参数:

波特率 9600bps 数据位 8 停止位 1 无奇偶校验。

(2) TCP模式:

字符串以IP地址或者”*”作为开头,‘:’后为指定TCP连接的特殊端口号,ModBus协议中缺省端口为502。如果不需要指定特殊端口,可以不带此参数。格式如:

_T( ‘192.168.201.178’ )或者_T(“*”),使用端口号为502;

slaveAddr:

ModBus Slave设备地址。

timeout:

设置ModBus协议通讯响应的超时时间,单位为毫秒ms

mbusSlave_Interface:

数据处理函数指针结构,即需要加载ModBus Slave设备响应各个功能的用户数据处理接口函数。这些用户接口函数是由用户自己提供,用户可以根据选择的功能来实现。这些函数的名称和定义是固定的。分别为:

(1) 功能:读保持寄存器/读写寄存器,实现功能码3、23

int ReadHoldingRegistersTable( int startRef, short regArr[], int refCnt );

(2) 功能:写寄存器,实现功能码6、16、22、23

int WriteHoldingRegistersTable( int startRef, const short regArr[], int refCnt );

(3) 功能:读输入寄存器,实现功能码4

int ReadInputRegistersTable( int startRef, short regArr[], int refCnt );

(4) 功能:读线圈,实现功能码1

int ReadCoilsTable( int startRef, char bitArr[], int refCnt );

(5) 功能:写线圈,实现功能码5、15

int WriteCoilsTable( int startRef, const char bitArr[], int refCnt );

(6) 功能:读离散量,实现功能码 2

int ReadInputDiscretesTable( int startRef, char bitArr[], int refCnt );

返回值 = NULL: 启动ModBus设备失败。

!= NULL: 启动ModBus设备成功,并返回相应的操作句柄。

/////////////////////////////////////////////////////////////////////////////////////////////////////////

(1) HANDLE mbusSlave_StartupServer( LPCTSTR lpPortName, int slaveAddr,int timeout, ModBusSlave_Interface mbusSlave_Interface );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: ModBus 服务器执行函数,用于对ModBus报文的分析和响应。

该函数为阻塞模式,阻塞的时间为函数mbusSlave_StartupServer (…)中设置的ModBus协议通讯响应的超时时间 timeout,也相当于等待请求响应的超时时间。实际应用中需要在线程中不断地调用该函数。

输入参数

hPort: 启动ModBus设备后获取的操作句柄

返回值 0: 相应操作成功

!=0: 错误代码,可调用函数mbusSlave_GetErrorText(…)获取错误的文本信息

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(2) int mbusSlave_ServerLoop( HANDLE hPort );

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 关闭ModBus服务器应用。

输入参数

hPort: 启动ModBus设备后获取的操作句柄

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(3) void mbusSlave_ShutdownServer( HANDLE hPort );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 获取ModBus软件包的版本信息。

返回值 : TCHAR类型的字符串,为ModBus软件包的版本信息。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(4) TCHAR * mbusSlave_GetPackageVersion( );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 根据错误代码获取错误文本信息。

返回值 : TCHAR类型的字符串,为错误文本信息。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(5) TCHAR * mbusSlave_GetErrorText( int errCode );

modbus_Slave API调用的使用范例:

1、启动modbus设备方协议

TCP方式:

hPort = mbusSlave_StartupServer( _T(‘*’), 1, 10000, mbusSlave_Interface );

串口方式:

hPort=mbusSlave_StartupServer( _T(‘COM3:9600-8-1-0’),1,10000,

mbusSlave_Interface );

2、线程中调用Serverloop 响应请求

while( 1 )

{

result = mbusSlave_ServerLoop( hPort );

if( result!=0 ) // 检查是否返回错误

{

// 出错处理:本例为获取并打印错误代码的文本信息

wcscpy( szText, mbusSlave_GetErrorText( result ) );

i1 = wcslen( szText );

if( i1》0 )

{

wcstombs( strText, szText, i1 );

printf( ‘ error code: %s!\n’, strText );

}

}

}

2、modbusSlave软件包用户接口函数

在DataProvider.h中共定义了6个用户数据接口函数定义如下:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 读保持寄存器/读写寄存器,实现功能码3、23

输入参数

startRef: 寄存器的起始地址,范围:1-0x10000

regArr: 读取寄存器的值

refCnt: 需要读取的寄存器数目,范围:1-125

返回值

=1:操作成功

=0:不支持该项操作

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(1) int ReadHoldingRegistersTable( int startRef, short regArr[], int refCnt );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 写寄存器,实现功能码6、16、22、23

输入参数

startRef: 寄存器的起始地址,范围:1-0x10000

regArr: 写寄存器的值

refCnt: 需要操作的寄存器数目,范围:1-125

返回值

=1:操作成功

=0:不支持该项操作

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(2) int WriteHoldingRegistersTable( int startRef, const short regArr[], int refCnt );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 读输入寄存器,实现功能码4

输入参数

startRef: 寄存器的起始地址,范围:1-0x10000

regArr: 读取寄存器的值

refCnt: 需要读取的寄存器数目,范围:1-125

返回值

=1:操作成功

=0:不支持该项操作

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(3) int ReadInputRegistersTable ( int startRef, short regArr[], int refCnt );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 读线圈,实现功能码1

输入参数

startRef: 寄存器的起始地址,范围:1-0x10000

bitArr: 读取线圈的值

refCnt: 需要读取的线圈数目,范围:1-2000

返回值

=1:操作成功

=0:不支持该项操作

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(4) int ReadCoilsTable( int startRef, char bitArr[], int refCnt );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 写线圈,实现功能码5、15

输入参数

startRef: 寄存器的起始地址,范围:1-0x10000

bitArr: 写线圈的值

refCnt: 需要操作的线圈数目,范围:1-2000

返回值

=1:操作成功

=0:不支持该项操作

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(5) int WriteCoilsTable( int startRef, const char bitArr[], int refCnt );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

功能描述: 读离散量,实现功能码 2

输入参数

startRef: 寄存器的起始地址,范围:1-0x10000

bitArr: 读取离散量的值

refCnt: 需要读取的离散量数目,范围:1-2000

返回值

=1:操作成功

=0:不支持该项操作

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(6) int ReadInputDiscretesTable( int startRef, char bitArr[], int refCnt );

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6085

    浏览量

    35248
收藏 人收藏

    评论

    相关推荐

    主板中预装Modbus通讯协议

    modbus_Master.h,与原来的静态库保持不变,相应各个API函数的说明请参见网站技术天地文章《Wince
    发表于 10-20 10:40

    信息技术WinCE工控主板简介

    公司的ARM9嵌入式工控主板产品系列,均预装了正版WinCE5.0操作系统。微软的 WinCE实时多任务操作系统是嵌入式领域的主流操作系统之一,它包括了以TCP/IP为特色的完整网
    的头像 发表于 11-01 09:29 1489次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>工控主板简介

    信息技术ARM9工控主板WinCE应用程序远程控制应用

    公司推出的ARM9嵌入式工控主板产品系列,均预装了正版的WinCE5.0操作系统。微软的WINCE实时多任务操作系统是嵌入式领域的主流操作系统之一,它包括了以TCP/IP为特色的完
    的头像 发表于 11-04 09:28 1720次阅读

    信息技术WinCEModbus主控通讯协议软件概述

     Modbus 协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备
    的头像 发表于 11-14 09:23 1934次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b><b class='flag-5'>下</b>的<b class='flag-5'>Modbus</b>主控通讯<b class='flag-5'>协议</b><b class='flag-5'>软件</b>概述

    信息技术如何实现WinCE系统中USB设备自动检测概述

    公司ARM9系列工控主板预装正版WinCE操作系统,提供标准USB接口,本文介绍如何在应用程序中判断USB存储设备的插入和移出操作。
    的头像 发表于 11-18 09:44 1369次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>如何实现<b class='flag-5'>WinCE</b>系统中USB<b class='flag-5'>设备</b>自动检测概述

    信息技术WinCE工控主板的数据库配置简介

    。由于公司的产品处于不断发展之中,WinCE也在不断的发展之中,导致在不同型号的产品中存在配置的数据库的情况有所不同,本文的主要目的是详细介绍
    的头像 发表于 01-14 11:35 1441次阅读

    信息技术主板支持Modbus主控协议软件

    1、简述 Modbus 协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备
    的头像 发表于 01-16 10:35 1553次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>主板支持<b class='flag-5'>Modbus</b>主控<b class='flag-5'>协议</b><b class='flag-5'>软件</b>

    信息技术WinCE远程桌面介绍

    的应用程序。但在一些应用场合,可能用户的最终设备根本就不需要显示功能,但在开发过程中,又希望能看到显示界面,以方便调试,这时候就可以利用WinCE的远程桌面功能了。 EM9280是
    的头像 发表于 01-16 10:24 2914次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>远程桌面<b class='flag-5'>介绍</b>

    信息技术LinuxModbus设备协议软件介绍

    Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。
    的头像 发表于 01-17 08:47 1366次阅读

    信息技术主板WinCE应用程序的FTP远程更新介绍

    特色的完整网络通讯协议,并提供了基于TCP/IP应用协议的服务器程序,如FTP Server、Web Server等等很实用的软件程序。
    的头像 发表于 02-03 09:00 1475次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>主板<b class='flag-5'>WinCE</b>应用程序的FTP远程更新<b class='flag-5'>介绍</b>

    信息技术主板中预装Modbus通讯协议

    目前公司提供ModBus通讯协议软件运行于WinCE及Linux环境
    的头像 发表于 02-06 10:55 1310次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>主板中预装<b class='flag-5'>Modbus</b>通讯<b class='flag-5'>协议</b>

    信息技术WinCE主板与STM32多功能模块通讯介绍

    ,STM32F103RCT6通过其USB Device接口与工控主板连接通讯,STM32在WinCE系统中被当做一个串口设备
    的头像 发表于 02-06 11:12 2048次阅读

    信息技术WinCE6系统CEDB故障分析介绍

    导致的。直到近期,公司通过大量实验,找到了触发CEDB故障的原因。本文将介绍我们的实验结果,为防止CEDB故障,希望客户注意: 使用WINCE6平台的客户,在产品发布时请使用rel
    的头像 发表于 02-07 10:30 1047次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>6系统CEDB故障分析<b class='flag-5'>介绍</b>

    信息技术WinCE文件系统测试及故障分析简介

    WINCE文件系统的偶发故障一直是WINCE系统最为棘手的问题,尽管出现故障的几率不高,但对设备的稳定运行造成严重影响。为了保证基于WinCE的嵌入式系统能稳定可靠运行,
    的头像 发表于 02-07 11:15 1427次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>文件系统测试及故障分析简介

    信息技术ModBus通讯协议软件包简介

    使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备所使用的协议称为
    的头像 发表于 02-14 09:38 2262次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>ModBus</b>通讯<b class='flag-5'>协议</b><b class='flag-5'>软件</b>包简介