根据RK3576开发板的modbus通讯
1. MODBUS简介。
MODBUS是一项应用层报文传输协议,用于在经过不同类型的总线或网络衔接的设备之间的客户机/服务器。通讯。。Modbus比其他通讯协议运用的更广泛的主要原因是因为它揭露宣布并且无版权要求;并且易于布置和保护;对供货商来说,修正移动本地的比特或字节没有许多约束。
1.1 协议版别与内容。
Modbus协议现在存在用于串口、。以太网。以及其他支撑互联网协议的网络的版别。
大多数Modbus设备通讯经过串口EIA-485物理层进行。关于串行衔接,存在两个变种,它们在数值数据表明不同和协议细节上略有不同。MODBUS形式分为三类,一种形式是RTU(长途终端设备),另一种形式是ASCII(美国信息交流码),第三种形式为TCP(运转在以太网上的协议)。【Modbus RTU】是一种紧凑的,选用二进制表明数据的方法(Modbus协议上规则,且默许形式有必要是RTU,ASCII作为选项),【Modbus ASCII】是一种人类可读的,冗长的表明方法。这两个变种都运用串行通讯(serial communication)方法。关于经过TCP/IP(例如以太网)的衔接,存在多个【Modbus/TCP】变种,这种方法不需求校验和核算。关于一切的这三种通讯协议在数据模型和功用调用上都是相同的,只要封装方法是不同的。
1.2 通讯和设备。
Modbus协议是一个master/slave架构的协议。有一个节点是master节点,其他运用Modbus协议参加通讯的节点是slave节点。每一个slave设备都有一个仅有的地址。在串行和MB+网络中,只要被指定为主节点的节点能够发动一个指令(在以太网上,任何一个设备都能发送一个Modbus指令,可是一般也只要一个主节点设备发动指令)。
一个ModBus指令包含了计划履行的设备的Modbus地址。一切设备都会收到指令,但只要指定方位的设备会履行及回应指令(地址0破例,指定地址0的指令是播送指令,一切收到指令的设备都会运转,不过不回应指令)。一切的Modbus指令包含了查看码,以确认抵达的指令没有被损坏。根本的ModBus指令能指令一个RTU改动它的。寄存器。的某个值,操控或许读取一个I/O。端口。,以及指挥设备回送一个或许多个其寄存器中的数据。
1.3 MODBUS运用关键。
经过以上叙说可知,运用Modubs需求时间环绕以下几点:
Modbus是主从方法通讯,不能同步进行通讯;
主机不发送,总线上就没有数据通讯;
设备有必要要有RTU协议,这是Modbus协议上规则的;
根本流程如下。
发送:从机的地址+功用码+寄存器的地址+寄存器地址的个数+校验码。
回复:从机的地址+功用码+要发送给主机数据的字节数+数据+校验码。
我司的easye。ai。-a。pi。软件开源库将杂乱的报文格式、收发操作做了一致的封装,为客户供给简略快捷的调用方法完成Modubs通讯功用。
2. 快速上手。
假如您。初度阅览此文档。,请阅览:《入门攻略/源码办理及。编程。介绍/源码工程办理》,按需办理自己工程源码(注:此文档必看,并主张选用。【长途挂载办理】。方法,不然有代码丢掉危险!!!)。
2.1 源码工程下载。
先在PC虚拟机定位到nfs服务目录,再在目录中创立寄存源码库房的办理目录:
cd ~/nfsrootmkdir GitHubcd GitHub。
再经过git东西,在办理目录内克隆长途库房(需求设备能对外网进行拜访)。
git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-3576.git。
注:
* 此处可能会因网络原因形成卡顿,请耐性等候。
* 假如真实要在gitHub网页上下载,也要把整个库房下载下来,不能独自下载本实例对应的目录。
2.2 开发环境树立。
经过。ad。b shell进入板卡开发环境,如下图所示。
经过以下指令,把nfs目录挂载上nfs服务器。
mount -t nfs -o nolock。 < nfs server ip >:。< nfs path in server >/home/orin-nano/Desktop/nfs/。
2.3 例程编译。
然后定位到nfs的挂载目录,再在目录中创立寄存源码库房的办理目录:
cd /home/orin-nano/Desktop/nfs/GitHub。
进入到对应的例程目录履行编译操作,详细指令如下所示:
cd EASY-EAI-Toolkit-3576/Demos/common-modbus/./build.sh。
2.4 例程运转及作用。
进入Release目录,履行下方指令,运转示例程序:
cd Release./。te。st-modbus_tcp_master &./test-modbus_tcp_slave。
TCP形式履行作用如下所示:
假如需求替换RTU形式可自行修正代码。
代码途径:EASY-EAI-Toolkit-3576/Demos/common-modbus/ test-modbus_tcp_slave.c。
API的详细阐明,以及API的调用(本例程源码),详细信息见下方阐明。
3. MODBUS库函数阐明。
本章节介绍EASY EAI的MODBUS库函数的运用方法。
3.1 引证方法。
EASY EAI api库坐落本库房的easyeai-api目录中。为便利客户在本地工程中直接调用咱们的EASY EAI api库,此处列出工程中需求链接的库以及头文件等,便利用户直接增加。
描绘。 | CMake写法。 | Makefile写法。 |
api.cmake。 | ${common_root}/modbus/api.cmake。 | 无。 |
头文件目录。 | ${MODBUS_INCLUDE_DI。RS。}。 | -I ../../easyeai-api/common/modbus。 |
源文件目录。 | ${MODBUS_SOURCE_DIRS}。 | ../../easyeai-api/common/modbus。 |
库文件目录。 | 无。 | 无。 |
库链接参数。 | ${MODBUS_LIBS}。 | 无。 |
API源代码途径为EASY-EAI-Toolkit-3576/easyeai-api/common/modbus/。用户可经过源代码了解接口完成,乃至可对源码进行修正。
3.2 创立实例。
以TCP方法创立Modbus实例,并初始化:
modbus_t* modbus_new_tcp(const char *ip, int port);
详细介绍如下所示。
函数名:modbus_new_tcp()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ip:ip地址。 port:端口号。 |
回来值。 | 成功:Modbus实例。 失利:NULL。 |
注意事项。 | 无。 |
3.3 设置从机ID。
设置从机ID的函数原型为:
void modbus_set_slave(modbus_t *ctx, int slave);
详细介绍如下所示。
函数名:modbus_set_slave()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx:Modbus实例。 slave:从机ID。 |
回来值。 | 成功:0。 失利:-1。 |
注意事项。 | 无。 |
3.4 和从机进行衔接。
和从机树立衔接的函数原型为:
void modbus_connect(modbus_t *ctx);
详细介绍如下所示。
函数名: modbus_connect()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx:Modbus实例。 |
回来值。 | 成功:0。 失利:-1。 |
注意事项。 | 无。 |
3.5 寄存器进行操作,功用码对应函数。
3.5.1 读取线圈状况,可读取多个接连线圈的状况(对应功用码为0x01)。
int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
详细介绍如下所示。
函数名: modbus_read_bits()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx :Modbus实例。 |
addr :寄存器开始地址。 | |
nb :寄存器个数。 | |
dest :得到的状况值。 | |
回来值。 | 无。 |
注意事项。 | 无。 |
3.5.2 读取输入状况,可读取多个接连输入的状况(对应功用码为0x02)。
int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
详细介绍如下所示。
函数名: modbus_read_input_bits()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx :Modbus实例。 |
addr :寄存器开始地址。 | |
nb :寄存器个数。 | |
dest :得到的状况值。 | |
回来值。 | 成功:回来nb的值。 |
注意事项。 | 无。 |
3.5.3 读取坚持寄存器的值,可读取多个接连坚持寄存器的值(对应功用码为0x03)。
int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
函数名: modbus_read_registers()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx :Modbus实例。 |
addr :寄存器开始地址。 | |
nb :寄存器个数。 | |
dest :得到的寄存器的值。 | |
回来值。 | 成功:读到寄存器的个数。 失利:-1。 |
注意事项。 | 无。 |
3.5.4 读输入寄存器的值,可读取多个接连输入寄存器的值(对应功用码为0x04)。
int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
详细介绍如下所示。
函数名: modbus_read_input_registers()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx :Modbus实例。 |
addr :寄存器开始地址。 | |
nb :寄存器个数。 | |
dest :得到的寄存器的值。 | |
回来值。 | 成功:读到寄存器的个数。 失利:-1。 |
注意事项。 | 无。 |
3.5.5 写入单个线圈的状况(对应功用码为0x05)。
int modbus_write_bit(modbus_t *ctx, int addr, int status);
详细介绍如下所示。
函数名:modbus_write_bit()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx :Modbus实例。 |
addr :线圈地址。 | |
status:线圈状况。 | |
回来值。 | 成功:0。 失利:-1。 |
注意事项。 | 无。 |
3.5.6 写入多个接连线圈的状况(对应功用码为15)。
int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *src);
详细介绍如下所示。
函数名: modbus_write_bits()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx :Modbus实例。 |
addr :线圈地址。 | |
nb :线圈个数。 | |
src:多个线圈状况。 | |
回来值。 | 成功:0。 失利:-1。 |
注意事项。 | 无。 |
3.5.7 写入单个寄存器(对应功用码为0x06)。
int modbus_write_register(modbus_t *ctx, int addr, int value);
详细介绍如下所示。
函数名:modbus_write_register()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx :Modbus实例。 |
addr :寄存器地址。 | |
value :寄存器的值。 | |
回来值。 | 成功:0。 失利:-1。 |
注意事项。 | 无。 |
3.5.8 写入多个接连寄存器(对应功用码为16)。
int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src);
详细介绍如下所示。
函数名: modbus_write_registers()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx :Modbus实例。 |
addr :寄存器地址。 | |
nb :寄存器的个数。 | |
src:多个寄存器的值。 | |
回来值。 | 成功:0。 失利:-1。 |
注意事项。 | 无。 |
3.6 封闭套接字。
封闭套接字函数原型为:
void modbus_close(modbus_t *ctx);
详细介绍如下所示。
函数名: modbus_close()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx:Modbus实例。 |
回来值。 | 无。 |
注意事项。 | 无。 |
3.7 开释实例。
和从机树立衔接的函数原型为:
void modbus_free(modbus_t *ctx);
详细介绍如下所示。
函数名: modbus_free()。 | |
头文件。 | easyeai-api/common/modbus/modbus.h。 |
输入参数。 | ctx:Modbus实例。 |
回来值。 | 无。 |
注意事项。 | 无。 |
4. 运用实例。
示例主机代码途径EASY-EAI-Toolkit-3576/Demos/common-modbus/ test-modbus_tcp_master.c。
示例从机代码途径EASY-EAI-Toolkit-3576/Demos/common-modbus/ test-modbus_tcp_slave.c。
内容来源:https://tongdaidmxanh.com/app-1/ket quả net 30,http://chatbotjud-teste.saude.mg.gov.br/app-1/novinha-bucetuda
(责任编辑:最新热点)