• 大小: 80.87MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-07-11
  • 语言: 其他
  • 标签: ModBus  

资源简介

ModBus软件开发实战指南PDF , 清华大学出版社,杨更更。着重讲述了如何快速入门并精通ModBus软件开发技术, 适用于初学ModBus通信协议的读者。包含重点内容标记以及纯手打的RTU模式下的源码。

资源截图

代码片段和文件信息

#include 
#ifndef _MSC_VER
#include 
#endif
#include 
#include 
#include 

#include “modbus.h“            //引用libmodbus库

/*The goal of this program is to check all major functions of libmodbus:
-write_coil
-read_bits
-write_coils
-write_register
-read_register
-write_registers
-read_registers

All these functions are called with random values on a address range 
defined by the following defines.
*/
#define LOOP 1
#define SERVER_ID 17
#define ADDRESS_START       0
#define ADDRESS_END 99

/* At each loop the program works in the range ADDRESS_START to *ADDRESS_END
then ADDRESS_START + 1 to ADDRESS_END and so on.
*/
int main(void)
{
modbus_t *ctx;
int rc;
int nb_fail;
int nb_loop;
int addr;
int nb;
uint8_t  *tab_rq_bits;                //用于保存发送或接收的数据(下同)
uint8_t  *tab_rp_bits;
uint16_t *tab_rq_registers;
uint16_t *tab_rw_rq_registers;
uint16_t *tab_rp_registers;

/*RTU*/
ctx = modbus_new_rtu(“COM3“ 19200 ‘N‘ 8 1);   //创建一个RTU类型的容器
modbus_set_slave(ctx SERVER_ID);                 //设置从端地址

modbus_set_debug(ctx TRUE);                      //设置debug模式

if(modbus_connect(ctx) == -1)
{
fprintf(stderr “Connection failed: %s\n“
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}

/*Allocate and initialize the different memory spaces*/
nb = ADDRESS_END - ADDRESS_START;              //计算需测试的寄存器个数

//以下申请内存块用以保存和接收各数据
tab_rq_bits = (uint8_t *)malloc(nb * sizeof(uint8_t));
memset(tab_rq_bits 0 nb * sizeof(uint8_t));

tab_rp_bits = (uint8_t *)malloc(nb * sizeof(uint8_t));
memset(tab_rp_bits 0 nb * sizeof(uint8_t));

tab_rq_registers = (uint16_t *)malloc(nb * sizeof(uint16_t));
memset(tab_rq_registers 0 nb * sizeof(uint16_t));

tab_rp_registers = (uint16_t *)malloc(nb * sizeof(uint16_t));
memset(tab_rp_registers 0 nb * sizeof(uint16_t));

tab_rw_rq_registers = (uint16_t *)malloc(nb * sizeof(uint16_t));
memset(tab_rw_rq_registers 0 nb * sizeof(uint16_t));

nb_loop = nb_fail = 0;
while(nb_loop++ < LOOP)
{
//从起始地址开始顺序测试
for(addr = ADDRESS_START; addr < ADDRESS_END; addr++)
{
int i;

//生成随机数用于测试
for(i = 0; i < nb; i++)
{
tab_rq_registers[i] =
(uint16_t)(65535.0 * rand() / (RAND_MAX + 1.0));
tab_rw_rq_registers[i] = ~ tab_rq_registers[i];
tab_rq_bits[i] = tab_rq_registers[i] % 2;
}
nb = ADDRESS_END - addr;

/*测试线圈寄存器的单个读写*/
rc = modbus_write_bit(ctx addr tab_rq_bits[0]);   //写线圈寄存器
if(rc != 1 )
{
printf(“ERROR modbus_write_bit (%d)\n“ rc);
printf(“Address =%d value =%d\n“ addr tab_rq_bits[0]);
nb_fail++;
}
else
{
//写入之后再读取比较
rc = modbus_read_bits(ctx addr 1 tab_rp_bits);
if(rc != 1 || tab_rq_bits[0] != tab_rp_bits[0])
{
printf(“ERROR modbus_read_bits single (%d)\n“ rc);
printf(“adress = %d\n“ addr);
nb_fai

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件    97503924  2018-10-11 17:08  ModBus软件开发实战指南\ModBus软件开发实战指南.pdf
     目录           0  2018-10-11 17:18  ModBus软件开发实战指南\RTU模式源码(纯手打)\
     文件        7725  2018-10-11 16:35  ModBus软件开发实战指南\RTU模式源码(纯手打)\TestRtuMaster.c
     文件        1549  2018-10-11 17:00  ModBus软件开发实战指南\RTU模式源码(纯手打)\TestRtuSlave.c
     目录           0  2018-10-11 17:19  ModBus软件开发实战指南\

评论

共有 条评论