首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

WinCE下的Modbus设备方协议软件

WinCE下的Modbus设备方协议软件

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

      ·主设备向从设备发送请求;
      ·从设备分析并处理主设备的请求,然后向主设备发送结果;
      ·如果出现任何差错,从设备将返回一个异常功能码。

      英创公司提供的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中具体实现。

一、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( );

......


[查看全文]
[关于英创]
[更多文章]
[技术论坛]
本文PDF格式下载
返回列表