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

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

3天内不再提示

英创信息技术WinCE下的Modbus主控通讯协议软件概述

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

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

1、主设备向从设备发送请求;

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

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

英创公司提供的ARM9嵌入式主板系列产品,均带有丰富的串口、网络资源,同时具有强大的处理能力,非常适用于作为Modbus 主设备的开发应用,为了加快做这类应用的开发速度,英创公司特推出WinCE下的Modbus主控软件,该软件的是以C函数加静态LIB库的形式提供给客户。主要特征如下:

·非常适用于实时的工业应用,特别可以广泛应用于对于PLC的控制。

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

·支持RTU传输模式。

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

·支持广播地址。

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

为了方便应用程序的使用,对不同的通讯介质保持一致的代码形式,英创所提供的ModBus主控软件包的API函数可以同时支持基于串口和TCP的Modbus Master协议,应用程序只需要在调用初始化函数时,用不同参数区分即可。有关Modbus通讯的具体使用方法,请参考Modbus标准文献以及被控设备的通讯接口数据手册。以下介绍英创Modbus主控软件的相关API函数,各个函数的定义如下:

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

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

输入参数 lpPortName:

该参数为TCHAR类型的字符串,该字符串中包含了打开ModBus协议的需

要设置的通讯参数信息。对于串口模式和TCP两种模式分别采用不同的格式

的字符串。

(1)串口模式:

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

COMIdx:baudRate-dataBits-stopBits-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’ ),使用端口号为502;

返回值 = NULL: 连接ModBus设备失败。

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

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

(1) HANDLE mbusMaster_OpenPortProtocol( LPCTSTR lpPortName );

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

功能描述: 关闭ModBus设备连接,同时释放使用的系统资源。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

返回值 = FALSE: 关闭操作失败。

= TRUE: 关闭操作成功。

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

(2) BOOL mbusMaster_ClosePortProtocol( HANDLE hPort );

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

功能描述: 设置ModBus通讯的超时时间,单位为毫秒。并返回实际设置的超时时间。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

milliseconds: ModBus通讯超时时间,单位为毫秒。

返回值 《 0: 操作失败。

》 0: 实际设置的超时时间。

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

(3) int mbusMaster_SetTimeout( HANDLE hPort, int milliseconds );

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

功能描述: 读取ModBus从机设备的线圈值,实现ModBus功能码1。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

startRef: 需要读取线圈的起始值,其范围为: 1~0x10000

bitArr: 存放读取线圈数据的数组

refCnt: 需要读取的线圈数量,其范围为: 1~2000

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(4) int mbusMaster_ReadCoils( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, int bitArr[], UINT16 refCnt);

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

功能描述: 读取ModBus从机设备离散量的输入值,实现ModBus功能码2。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

startRef: 需要读取离散量的起始值,其范围为: 1~0x10000

bitArr: 存放读取离散量输入数据的数组

refCnt: 需要读取的离散量数量,其范围为: 1~2000

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(5) int mbusMaster_ReadInputDiscretes( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, int bitArr[], UINT16 refCnt);

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

功能描述: ModBus从机设备的单个线圈的写入操作,实现ModBus功能码5。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

bitAddr: 需要操作的线圈地址,其范围为: 1~0x10000

bitVal: 写入线圈的值, 1-置位(ON) 0-清(OFF)

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(6) int mbusMaster_WriteCoil( HANDLE hPort, UCHAR slaveAddr, UINT16 bitAddr, int bitVal );

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

功能描述: ModBus从机设备的多个线圈的写入操作,实现ModBus功能码15。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

startRef: 需要设置的线圈起始值,其范围为: 1~0x10000

bitArr: 需要设置线圈数据的数组

refCnt: 需要设置的线圈数量,其范围为: 1~800

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(7) int mbusMaster_ForceMultipleCoils( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, int bitArr[], UINT16 refCnt);

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

功能描述: 读取ModBus从机设备多个寄存器值,实现ModBus功能码3。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

startRef: 需要读取寄存器的起始值,其范围为: 1~0x10000

regArr: 存放读取寄存器值的数组

refCnt: 需要读取的寄存器数量,其范围为: 1~125

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(8) int mbusMaster_ReadMultipleRegisters( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, UINT16 regArr[], UINT16 refCnt );

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

功能描述: 读取ModBus从机设备输入寄存器值,实现ModBus功能码4。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

startRef: 需要读取输入寄存器的起始值,其范围为: 1~0x10000

regArr: 存放读取输入寄存器值的数组

refCnt: 需要读取的输入寄存器数量,其范围为: 1~125

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(9) int mbusMaster_ReadInputRegisters( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, UINT16 regArr[], UINT16 refCnt);

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

功能描述: ModBus从机设备多个寄存器的写操作,实现ModBus功能码16。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

startRef: 需要读取寄存器的起始值,其范围为: 1~0x10000

regArr: 需写入寄存器值的数组

refCnt: 需要操作的寄存器数量,其范围为: 1~100

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(10) int mbusMaster_WriteMultipleRegisters( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, UINT16 regArr[], UINT16 refCnt);

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

功能描述: 对ModBus从机设备单个寄存器的写操作,实现ModBus功能码6。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

regAddr: 需要操作寄存器的地址,其范围为: 1~0x10000

regVal: 需写入寄存器的值

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(11) int mbusMaster_WriteSingleRegister( HANDLE hPort, UCHAR slaveAddr, UINT16 regAddr, UINT16 regVal );

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

功能描述: 对ModBus从机设备屏蔽写寄存器,实现ModBus功能码22。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

regAddr: 需要操作寄存器的地址,其范围为: 1~0x10000

andMask: 屏蔽写与数据

orMask: 屏蔽写或数据

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(12) int mbusMaster_MaskWriteRegister( HANDLE hPort, UCHAR slaveAddr, UINT16 regAddr, UINT16 andMask, UINT16 orMask);

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

功能描述: 对ModBus从机设备读写多个寄存器操作,实现ModBus功能码23。

输入参数 hPort: 连接ModBus设备返回的有效操作句柄。

slaveAddr: ModBus从机设备的地址,地址范围为: 1~255

readRef: 需要读取多个寄存器的起始值,其范围为: 1~0x10000

readArr: 存放读取寄存器值的数组

readCnt: 需要读取的寄存器数量,其范围为: 1~125

writeRef: 需要写入多个寄存器的起始值,其范围为: 1~0x10000

writeArr: 写入寄存器值的数组

writeCnt: 需要写入的寄存器数量,其范围为: 1~125

返回值 != 0: 该功能操作失败,返回值为相应的出错代码。

= 0: 该功能操作成功。

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

(13) int mbusMaster_ReadWriteRegisters( HANDLE hPort, UCHAR slaveAddr, UINT16 readRef, UINT16 readArr[],UINT16 readCnt,UINT16 writeRef,

UINT16 writeArr[], UINT16 writeCnt);

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

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

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

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

(14) TCHAR * mbusMaster_GetPackageVersion( );

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

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

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

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

(15) TCHAR * mbusMaster_GetErrorText( int errCode );

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

    关注

    7

    文章

    6063

    浏览量

    34596
收藏 人收藏

    评论

    相关推荐

    什么是Modbus通讯协议?Modbus通讯协议有什么特点?

    寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。Modbus通讯协议特点: 
    发表于 11-11 10:35

    WinCE主板彩色打印方案

    公司WinCE系列工控主板(WinCE6、WinCE7)现可支持惠普USB喷墨打印机,提供彩色(黑白)打印功能。  除了最早支持的pcl
    发表于 07-06 10:08

    支持Linux高级客户自行移植内核

    上市)  该项服务具体说明和实施流程参见:支持客户进行Linux移植  需要该服务的客户需与签订技术保密协议,并承诺严格履行协议
    发表于 01-18 13:52

    嵌入式主板的无线通讯解决方案

    ETA6210-WiFi√√ IntelWireless 3160WiFi√ - RalinkRT3070LWiFi√ -成都信息技术有限公司http://www.emtronix.com
    发表于 03-24 14:00

    WinCE工控主板通过PPI协议连接西门子PLC

    ,但西门子并未公开PPI协议内容。Modbus是工业控制现场广泛应用的通讯协议,在嵌入式领域,嵌入式主板通常采用Modbus与PLC相连,
    发表于 04-26 10:49

    工控主板通过PPI协议连接西门子PLC

    ,但西门子并未公开PPI协议内容。Modbus是工业控制现场广泛应用的通讯协议,在嵌入式领域,嵌入式主板通常采用Modbus与PLC相连,
    发表于 10-19 16:14

    主板中预装Modbus通讯协议

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

    Modbus通讯协议的几种实现方式

    RTU和TCP两种协议中转换,根据需要选择不同协议。这是LabVIEW多态的一个非常好的示例。程序见下图。   5.LabVIEW 采用TCP模块实现Modbus通讯   在没有DSC
    发表于 05-05 16:19

    MODBUS通讯协议及编程

    ModBus通讯协议分为RTU协议和ASCII协议,下面就ModBus RTU
    发表于 07-17 11:58 1.5w次阅读

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

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

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

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

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

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

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

    目前英创公司提供ModBus通讯协议软件运行于WinCE及Linux环境下,均是以C函数加静态库(mod
    的头像 发表于 02-06 10:55 1144次阅读
    英创<b class='flag-5'>信息技术</b>主板中预装<b class='flag-5'>Modbus</b><b class='flag-5'>通讯</b><b class='flag-5'>协议</b>

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

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

    Modbus TCP通讯协议概述

    Modbus TCP通讯概述 MODBUS/TCP是简单的、中立厂商的用于管理和控制自动化设备的MODBUS系列讯
    的头像 发表于 01-04 17:51 2.8w次阅读
    <b class='flag-5'>Modbus</b> TCP<b class='flag-5'>通讯</b><b class='flag-5'>协议</b><b class='flag-5'>概述</b>