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

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

3天内不再提示

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

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-17 08:47 次阅读

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

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

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

• 非常适用于实时的工业应用。
• 可以支持基于串口的Modbus协议应用或者基于TCP的Modbus协议应用。
• 支持RTU传输模式。
• 支持大多数的Modbus功能码操作,包括对线圈、离散开关输入的位操作,以及对寄存器的字节操作。
• 可以获取通讯中传输协议的错误代码的详细信息

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

一、mbusslave软件包API函数

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

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

功能描述:

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

输入参数 pPortName:

该参数为char类型的字符串,该字符串中包含了启动ModBus协议的需要设置的通讯参数信息。对于串口模式和TCP两种模式分别采用不同的格式的字符串。
(1) 串口模式:
字符串必须以ttyS作为开头,后面再带上需要设置的串口通讯参数。格式为: ttySIdx:baudRate-dataBits-stopBits-parity
其中Idx为串口序号,':' 后为串口通讯参数,各个通讯参数均用整型数据来表示,依次为波特率、数据位、停止位、校验位,校验位 0-无校验 1-奇校验 2-偶校验。
如ttyS2作为通讯的协议口,波特率:9600bps、8为数据位、1个停止位、无校验。其格式如下:'ttyS2:9600-8-1-0' ;

也可以直接就用 'ttyS2' 来表示,表明串口所用的为缺省参数:波特率 9600bps 数据位 8 停止位 1 无奇偶校验。
(2) TCP模式:
字符串以IP地址或者”*”作为开头,':'后为指定TCP连接的特殊端口号,ModBus协议中缺省端口为502。如果不需要指定特殊端口,可以不带此参数。格式如:'192.168.201.178' 或者“*”,使用端口号为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( char* pPortName, 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软件包的版本信息。
返回值 : ModBus软件包的版本信息。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(4) char * mbusSlave_GetPackageVersion( );


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
功能描述: 根据错误代码获取错误文本信息。
返回值 :错误文本信息。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(5) char * mbusSlave_GetErrorText( int errCode );
modbus_Slave API调用的使用范例:

1、启动modbus设备方协议

TCP方式:

hPort = mbusSlave_StartupServer( '*', 1, 10000, mbusSlave_Interface );
串口方式:
hPort=mbusSlave_StartupServer( 'ttyS2:9600-8-1-0',1,10000, mbusSlave_Interface );
2、线程中调用Serverloop 响应请求
while( 1 )
{
result = mbusSlave_ServerLoop( hPort );
if( result!=0 ) // 检查是否返回错误
{
// 出错处理:本例为获取并打印错误代码的文本信息
strcpy( strText, mbusSlave_GetErrorText( result ) );
i1 = strlen( strText );
if( i1>0 )
{
printf( ' error code: %s!\n', strText );
}
}
}

二、mbusslave软件包用户接口函数

在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 );

英创现有的Linux工控主板均可支持该协议软件,感兴趣的客户向公司索取相关的测试代码。

相关阅读:英创嵌入式Linux工控主板支持Modbus主控协议软件

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

    关注

    87

    文章

    11310

    浏览量

    209658
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6085

    浏览量

    35387
收藏 人收藏

    评论

    相关推荐

    科技获评2024年度软件信息技术服务竞争力百强企业

    近期,中国电子信息行业联合会发布《2024年度软件信息技术服务竞争力百强企业》(即“中国软件百强企业”),千科技凭借在
    的头像 发表于 12-11 16:09 187次阅读

    中科达荣获2024年软件信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件信息技术服务竞争力百强企业”以及“2024年软件
    的头像 发表于 10-30 11:44 496次阅读

    智能工厂升级:Modbus设备与OPC UA协议的无缝对接

    本文将带你了解OPCUA协议,并探讨其在未来智能制造中的趋势。同时,我们还介绍如何快速方便地将Modbus设备接入到OPCUA协议通讯,实现
    的头像 发表于 10-17 08:04 446次阅读
    智能工厂升级:<b class='flag-5'>Modbus</b><b class='flag-5'>设备</b>与OPC UA<b class='flag-5'>协议</b>的无缝对接

    Modbus协议网关简介

    ,在工业控制系统中占据了重要地位。然而,随着工业自动化技术的不断发展,不同设备间通信协议的多样性成为了一个亟待解决的问题。Modbus协议网关作为这一背景
    的头像 发表于 09-23 14:51 262次阅读
    <b class='flag-5'>Modbus协议</b>网关简介

    Modbus、楼宇自控、电力协议Modbus协议网关BL120ML实现不同协议设备之间的数据互通

    Modbus、楼宇自控、电力协议Modbus协议网关BL120ML是钡铼技术专为满足工业级苛刻环境条件多种
    的头像 发表于 08-10 10:37 327次阅读
    <b class='flag-5'>Modbus</b>、楼宇自控、电力<b class='flag-5'>协议</b>转<b class='flag-5'>Modbus协议</b>网关BL120ML实现不同<b class='flag-5'>协议</b><b class='flag-5'>设备</b>之间的数据互通

    实现工业设备与ThingWorx无缝对接:Modbus转OPC UA协议网关的应用

    随着智能制造的不断演进,将这些传统设备与现代自动化软件如ThingWorx高效集成,已成为技术发展的重要课题。本文将探讨如何利用Modbus转OPC UA
    的头像 发表于 08-09 17:14 366次阅读
    实现工业<b class='flag-5'>设备</b>与ThingWorx无缝对接:<b class='flag-5'>Modbus</b>转OPC UA<b class='flag-5'>协议</b>网关的应用

    使用MODBUS协议、楼宇自控系统、电力协议Modbus协议网关来集成楼宇内的温湿度传感器设备

    在现代建筑管理中,实现楼宇环境的自动化控制是降低能耗、增强管理效率的关键。本文将详细介绍如何使用MODBUS协议、楼宇自控系统、电力协议Modbus协议网关来集成楼宇内的温湿度传感器
    的头像 发表于 08-08 17:31 348次阅读
    使用<b class='flag-5'>MODBUS协议</b>、楼宇自控系统、电力<b class='flag-5'>协议</b>转<b class='flag-5'>Modbus协议</b>网关来集成楼宇内的温湿度传感器<b class='flag-5'>设备</b>

    使用Modbus、楼宇自控、电力协议Modbus协议网关实现生产设备的远程监控和管理

    对不同协议设备的可靠数据采集;上行转发协议方面支持Modbus RTU和Modbus TCP,为用户提供灵活的上行通信选择,实现不同
    的头像 发表于 08-08 17:29 391次阅读
    使用<b class='flag-5'>Modbus</b>、楼宇自控、电力<b class='flag-5'>协议</b>转<b class='flag-5'>Modbus协议</b>网关实现生产<b class='flag-5'>设备</b>的远程监控和管理

    ModBus Scan32模拟软件的使用方法

    的一款软件,下面介绍其使用方法。 ModScan32用来模拟主设备。它可以发送指令到从机设备(使用
    发表于 07-24 08:04

    Modbus转Profinet协议转化网关

    怎么样把Modbus与Profinet连接起来呢?最近有很多客户朋友咨询这个问题,在这里为大家详细说明一。其实有一个设备可以很轻松地解决这个问题,名为YC-MDPN-001,下面是详细信息
    的头像 发表于 07-22 14:25 283次阅读
    <b class='flag-5'>Modbus</b>转Profinet<b class='flag-5'>协议</b>转化网关

    钡铼网关设备Modbus 转 Profinet协议

    Modbus 转换为 Profinet 是一种常用的工业通信协议转换技术,旨在实现不同工业设备之间的互联互通,允许不同类型的工业设备通过网络
    的头像 发表于 07-12 11:44 476次阅读
    钡铼网关<b class='flag-5'>设备</b>:<b class='flag-5'>Modbus</b> 转 Profinet<b class='flag-5'>协议</b>

    Modbus协议的工作原理、优缺点及应用

    在当今工业物联网(IIoT)的浪潮中,Modbus协议无疑是连接传统工业设备与现代信息技术的桥梁。作为一位工业物联网的资深工程师,我深感有责任向传统行业解释这一重要协议的工作原理、优缺
    的头像 发表于 05-21 17:06 1414次阅读
    <b class='flag-5'>Modbus协议</b>的工作原理、优缺点及应用

    简单介绍Modbus RTU协议

    介绍modbus rtu之前,我们可以了解到,Modbus是施耐德电气公司,于1979年发明的,是全球第一个真正用于工业现场的总线协议
    的头像 发表于 05-09 09:13 2545次阅读
    简单<b class='flag-5'>介绍</b><b class='flag-5'>Modbus</b> RTU<b class='flag-5'>协议</b>

    Modbus协议网关是什么?Modbus协议网关的功能

    Modbus协议网关是一种专门用于工业自动化环境中的网络设备,其主要功能是实现不同通信协议之间的转换,尤其是将基于Modbus协议设备或系
    的头像 发表于 04-11 15:51 756次阅读

    软通动力与捷技术签订战略合作协议

    近日,软通动力信息技术(集团)股份有限公司(以下简称“软通动力”)与宁波捷技术股份有限公司(以下简称“捷技术”)正式签订战略合作
    的头像 发表于 02-03 16:35 1122次阅读