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

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

3天内不再提示

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

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-16 10:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、简述

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

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

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

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

2、Modbus Master API函数简介

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

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

功能描述:通过串口或者网络TCP打开ModBus协议,连接到ModBus设备。对于串口方式,通过该函数打开串口,并设置相应串口的通讯参数,以满足数据和控制命令的通讯;对于TCP方式,通过该函数和ModBus设备建立基于Socket方式的TCP连接,利用该连接进行数据和控制命令的通讯。
输入参数 pPortName:
该参数为CHAR类型的字符串,该字符串中包含了打开ModBus协议的需要设置的通讯参数信息。对于串口模式和TCP两种模式分别采用不同的格式的字符串。
(1) 串口模式:
字符串必须以ttyS作为开头,后面再带上需要设置的串口通讯参数。格式为: ttySIdx:baudRate-dataBits-stopBits-parity
其中Idx为串口序号,':' 后为串口通讯参数,各个通讯参数均用整型数据来表示,依次为波特率、数据位、停止位、校验位,校验位 0-无校验 1-奇校验 2-偶校验。
如串口3作为通讯的协议口,波特率:9600bps、8为数据位、1个停止位、无校验。其格式如下:
'ttyS3:9600-8-1-0' ;
也可以直接就用 'ttyS3' 来表示,表明串口所用的为缺省参数:波特率 9600bps 数据位 8 停止位 1 无奇偶校验。
(2) TCP模式:
字符串以IP地址作为开头,':'后为指定TCP连接的特殊端口号,ModBus协议中缺省端口为502。如果不需要指定特殊端口,可以不带此参数。格式如:
'192.168.201.178' ,使用端口号为502;
'192.168.201.178:2000' ,使用端口号为2000;
返回值 = NULL: 连接ModBus设备失败。
!= NULL: 连接ModBus设备成功,并返回相应的操作句柄。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(1) HANDLE mbusMaster_OpenPortProtocol( char* pPortName );

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

功能描述: 关闭ModBus设备连接,同时释放使用的系统资源。
输入参数 hPort: 连接ModBus设备返回的有效操作句柄。
返回值 = FALSE: 关闭操作失败。 = TRUE: 关闭操作成功。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(2) int 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软件包的版本信息。
返回值 : CHAR类型的字符串,为ModBus软件包的版本信息。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(14) char * mbusMaster_GetPackageVersion( );

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
功能描述: 根据错误代码获取错误文本信息。
返回值 : CHAR类型的字符串,为错误文本信息。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(15) char * mbusMaster_GetErrorText( int errCode );

3、应用例程

对于应用来说,所建立的应用程序工程只需要包含modbus_Master.h、libmbusmaster.a文件即可方便实现对于modbus Master协议API函数的调用。以下代码为一个简单的调用例程:

// MbusMasterTest.cpp : Defines the entry point for the application.
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 'modbus_Master.h'
//char *hostName = '192.168.201.178';
//char *hostName = 'ttyS3:9600-8-1-0';
char hostName[80];
int main( int argc,char* argv[] )
{
int i1, result;
int portno, baudRate;
UINT16 dataArr[8];
char str[200];
HANDLE hPort;
// 解析命令行参数:串口号 波特率
if( argc > 1 )
portno = atoi( argv[1] );
else
portno = 3;
if( argc > 2 )
baudRate = atoi( argv[2]);
else
baudRate = 9600;
printf( 'port:%d baudrate:%d\n', portno, baudRate);
sprintf( hostName, 'ttyS%d:%d-8-1-0', portno, baudRate );
// 启动ModBus协议,连接到Modbus设备
hPort = mbusMaster_OpenPortProtocol( hostName );
if( hPort==INVALID_HANDLE_VALUE )
{
printf( 'Open fail!\n');
return -1;
}
//进入主循环
for( ; ; )
{
result = mbusMaster_ReadMultipleRegisters( hPort, 1, 1,dataArr,sizeof(dataArr) / 2);
//result = mbusMaster_WriteCoil( hPort, 1, 1, 1 );
if (result == 0)
{
for (i1 = 0; i1 < int(sizeof(dataArr) / 2); i1++)
{
printf('[%d]: %hd\n', i1 + 1, dataArr[i1]);
}
}
else
{
strcpy( str,mbusMaster_GetErrorText( result ) );
i1 = strlen( str );
if( i1>0 )
{
printf( '%s!\n', str );
}
}
sleep(1);
}
mbusMaster_ClosePortProtocol( hPort );
return 0;
}

该工程文件中用到专用静态库libmbusmaster.a,在eclipse环境对此程序编译时,需要设置相应的编译属性。在Project Explorer视窗下,选择需要设置的工程文件,然后点击鼠标右键,选择 Properties项,在窗口中选择C/C++ Build -> Settings -> Tool Settings -> Sourcery G++ C++ Linker -> Libraries,如下图所示。其中的一个窗口用于指定库文件的名称,一个用于指定库文件的路径。

相关阅读:Linux下的Modbus设备方协议软件介绍

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

    关注

    88

    文章

    11627

    浏览量

    217888
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

    36933
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    龙芯中科助力2025教育信息技术应用创新大赛成功举办

    2025年11月13日-15日,由中国教育技术协会主办、浙江大学与中国教育技术协会网络安全专业委员会联合承办,中国电子工业标准化技术协会信息技术应用创新工作委员会、浙江高校信
    的头像 发表于 11-21 16:23 588次阅读

    Modbus协议转HTTP协议,实现JSON格式对接MES等系统平台

    配置运行。 智能网关IGT-DSER集成了多种PLC的原厂协议,比如西门子S7、三菱MC、欧姆龙FINS,罗克韦尔CIP等,也支持通用的Modbus协议、OPCUA协议。本文是
    发表于 10-27 10:33

    智慧新核心,龙芯主板助力信体系再升级

    信息技术飞速发展的当下,信体系的自主可控与创新升级已成为国家战略层面的关键任务。作为信产业发展的重要基础硬件支撑,国产工控主板正发挥着日益重要的作用。
    的头像 发表于 08-11 09:14 563次阅读

    佛瑞亚如何通过信息技术推动业务增长

    在数字化、信息化的浪潮下,信息技术已经不仅是后台工具,更成为驱动企业发展的关键力量。本期Women Inspiring Mobility,我们采访了佛瑞亚中国区信息技术总监马瑛,了解她和团队如何将
    的头像 发表于 07-29 14:00 713次阅读

    飞腾主板为信产业发展提高硬实力

    信息技术飞速发展的当下,信产业已成为我国实现科技自立自强、保障国家信息安全的关键领域。信,即信息技术应用创新,其核心目标是实现
    的头像 发表于 07-22 18:20 551次阅读

    浪潮澎湃,国产主板迎来黄金时代!

    2025年7月,表示必须在2027年底前完成信100%替代,覆盖基础硬件、基础软件等核心领域。在信息技术应用创新浪潮席卷下,国产主板作为计算机系统的骨架,正从幕后走向台前。政策加持、
    的头像 发表于 07-21 14:00 357次阅读

    大彩讲堂:VisualTFT软件modbus协议下的告警应用

    VisualTFT软件modbus协议下的告警应用
    的头像 发表于 07-01 17:40 961次阅读
    大彩讲堂:VisualTFT<b class='flag-5'>软件</b><b class='flag-5'>modbus协议</b>下的告警应用

    科普|信是什么?一文读懂“信息技术应用创新”战略

    什么是信?信,即“信息技术应用创新”,是国家推动IT系统自主可控、安全可控的重要战略工程。它不仅是技术层面的创新,更承载着保障国家网络安全、推动产业升级和实现数字主权的重任。简单来
    的头像 发表于 06-13 10:06 6266次阅读
    科普|信<b class='flag-5'>创</b>是什么?一文读懂“<b class='flag-5'>信息技术</b>应用创新”战略

    浪潮下,国产主板有什么新的发展机遇?

    信息技术应用创新浪潮的推动下,国产主板迎来了诸多新的发展机遇。信产业旨在实现信息技术领域的自主可控,这一战略目标为国产主板的发展提供了广
    的头像 发表于 05-09 09:24 564次阅读
    信<b class='flag-5'>创</b>浪潮下,国产<b class='flag-5'>主板</b>有什么新的发展机遇?

    韧科技推出新主控,4K随机读写超120万IOPS行业标杆

    了一款新的主控芯片,这颗芯片在技术上有了哪些突破?针对当前汹涌而来的AI技术,又有哪些布局?为此,电子发烧友网采访到了韧科技的CEO刘刚和数据存储
    的头像 发表于 03-26 00:10 3062次阅读
    <b class='flag-5'>英</b>韧科技推出新<b class='flag-5'>主控</b>,4K随机读写超120万IOPS<b class='flag-5'>创</b>行业标杆

    安科瑞AWT100-DP 无线通讯终端,支持串口MODBUS RTU协议

    产品简介 功能:■支持串口MODBUS RTU协议的数据采集,并通过安科瑞平台协议与安科瑞服务器通讯。 ■支持多30个
    的头像 发表于 01-02 10:40 688次阅读
    安科瑞AWT100-DP 无线通讯终端,<b class='flag-5'>支持</b>串口<b class='flag-5'>MODBUS</b> RTU<b class='flag-5'>协议</b>

    飞腾助力首届教育信息技术应用创新大赛圆满落幕

    近日,由中国教育技术协会主办,教育部教育管理信息中心教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信工委会
    的头像 发表于 12-24 09:57 766次阅读

    有方科技参编的信息技术团体标准发布

    能力评价》团体标准由中国计算机行业协会正式发布实施,明确了信息技术产品供应链成熟度共性指标中企业背景、技术掌控、供给能力评价一级指标框架以及评价指标项描述,为制定元器件、软件等基础评估标准,部件、整机等产品的供应链成熟度评价指标
    的头像 发表于 12-23 10:44 896次阅读

    龙芯中科助力2024首届教育信息技术应用创新大赛成功举办

    近日,2024首届教育信息技术应用创新大赛在北京航空航天大学成功举办。本次大赛由中国教育技术协会主办,教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信
    的头像 发表于 12-19 17:02 817次阅读

    积鼎科技荣登“2024上海软件信息技术服务业高成长百家”,引领国产CFD发展

    近日,上海市经济和信息化委员会发布“2024上海软件信息技术服务业高成长百家”企业名单。积鼎科技凭借其在软件信息技术服务业,流体仿真CF
    的头像 发表于 12-05 11:54 842次阅读
    积鼎科技荣登“2024上海<b class='flag-5'>软件</b>和<b class='flag-5'>信息技术</b>服务业高成长百家”,引领国产CFD发展