【libmodbus-vs2019】测试使用

一、编译libmodbus库,vs2015

二、将头文件,lib,dll拷贝到 项目下

引入lib库到工程中 - - C++博客 (cppblog.com)

引入lib库到工程中 - - C++博客

添加到项目并引用头文件。代码添加库。

MFC 在VS中添加lib的三种方法_lgqlovexl的博客-CSDN博客_mfc 添加lib

MFC添加lib文件、静态库三种方法_走好每一步的博客-CSDN博客_mfc 使用lib

源码:

// libmodbus_use.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <iostream>
#include "modbus.h"
#ifdef _DEBUG
#pragma comment(lib,"modbusD.lib")
#else
#pragma comment(lib,"modbusD.lib")
#endif

#define LOOP             1
#define SERVER_ID       1
#define ADDRESS_START    0
#define ADDRESS_END     99
int main()
{//random-test-client.c  https://github.com/stephane/libmodbus/tree/master/tests
	modbus_t* ctx;//modbus实例
	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("/dev/ttyUSB0", 19200, 'N', 8, 1);
	modbus_set_slave(ctx, SERVER_ID);
*/

/* TCP */
	ctx = modbus_new_tcp("127.0.0.1", 502);
	modbus_set_debug(ctx, TRUE);

	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));// 99个字节
	memset(tab_rq_bits, 0, nb * sizeof(uint8_t));//分配位写入请求内存

	tab_rp_bits = (uint8_t*)malloc(nb * sizeof(uint8_t));//99个字节
	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));//99个ushort缓存

	tab_rp_registers = (uint16_t*)malloc(nb * sizeof(uint16_t));//99个ushortr
	memset(tab_rp_registers, 0, nb * sizeof(uint16_t));//分配寄存器读取响应内存

	tab_rw_rq_registers = (uint16_t*)malloc(nb * sizeof(uint16_t));//99个ushortr
	memset(tab_rw_rq_registers, 0, nb * sizeof(uint16_t));

	nb_loop = nb_fail = 0;
	while (nb_loop++ < LOOP) {//执行1次循环
		for (addr = ADDRESS_START; addr < ADDRESS_END; addr++) {//遍历地址0~99
			int i;

			/* Random numbers (short) 随机短整型数字 */
			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;//0、1
			}
			nb = ADDRESS_END - addr;//未写入的地址数量

			/* WRITE BIT  写入一位 */
			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 {//写入OK,进行读取
				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("address = %d\n", addr);
					nb_fail++;
				}
			}

			/* MULTIPLE BITS  多个位 写入、读取*/
			rc = modbus_write_bits(ctx, addr, nb, tab_rq_bits);//
			if (rc != nb) {//写入错误
				printf("ERROR modbus_write_bits (%d)\n", rc);
				printf("Address = %d, nb = %d\n", addr, nb);
				nb_fail++;
			}
			else {//读取多位
				rc = modbus_read_bits(ctx, addr, nb, tab_rp_bits);
				if (rc != nb) {//读取数量错误
					printf("ERROR modbus_read_bits\n");
					printf("Address = %d, nb = %d\n", addr, nb);
					nb_fail++;
				}
				else {//读取正确
					for (i = 0; i < nb; i++) {
						if (tab_rp_bits[i] != tab_rq_bits[i]) {
							printf("ERROR modbus_read_bits\n");
							printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
								addr, tab_rq_bits[i], tab_rq_bits[i],
								tab_rp_bits[i], tab_rp_bits[i]);
							nb_fail++;
						}
					}
				}
			}

			/* SINGLE REGISTER  单寄存器 写入 读取*/
			rc = modbus_write_register(ctx, addr, tab_rq_registers[0]);//写入uint_16
			if (rc != 1) {
				printf("ERROR modbus_write_register (%d)\n", rc);
				printf("Address = %d, value = %d (0x%X)\n",
					addr, tab_rq_registers[0], tab_rq_registers[0]);
				nb_fail++;
			}
			else {
				rc = modbus_read_registers(ctx, addr, 1, tab_rp_registers);//读取uint_16
				if (rc != 1) {
					printf("ERROR modbus_read_registers single (%d)\n", rc);
					printf("Address = %d\n", addr);
					nb_fail++;
				}
				else {
					if (tab_rq_registers[0] != tab_rp_registers[0]) {//写入请求与读取响应不一致
						printf("ERROR modbus_read_registers single\n");
						printf("Address = %d, value = %d (0x%X) != %d (0x%X)\n",
							addr, tab_rq_registers[0], tab_rq_registers[0],
							tab_rp_registers[0], tab_rp_registers[0]);
						nb_fail++;//失败次数
					}
				}
			}

			/* MULTIPLE REGISTERS 多寄存器 写入、读取 */
			rc = modbus_write_registers(ctx, addr, nb, tab_rq_registers);//写入多个uint_16
			if (rc != nb) {
				printf("ERROR modbus_write_registers (%d)\n", rc);
				printf("Address = %d, nb = %d\n", addr, nb);
				nb_fail++;
			}
			else {
				rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);//读取多个短整型
				if (rc != nb) {
					printf("ERROR modbus_read_registers (%d)\n", rc);
					printf("Address = %d, nb = %d\n", addr, nb);
					nb_fail++;
				}
				else {
					for (i = 0; i < nb; i++) {//遍历每个数,比较 请求与响应是否一致
						if (tab_rq_registers[i] != tab_rp_registers[i]) {
							printf("ERROR modbus_read_registers\n");
							printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
								addr, tab_rq_registers[i], tab_rq_registers[i],
								tab_rp_registers[i], tab_rp_registers[i]);
							nb_fail++;
						}
					}
				}
			}
			/* R/W MULTIPLE REGISTERS   同时写读多个寄存器*/
			rc = modbus_write_and_read_registers(ctx,
				addr, nb, tab_rw_rq_registers,
				addr, nb, tab_rp_registers);//tab_rw_rq_registers 要写入的请求数据    tab_rp_registers读取的响应数据
			if (rc != nb) {
				printf("ERROR modbus_read_and_write_registers (%d)\n", rc);
				printf("Address = %d, nb = %d\n", addr, nb);
				nb_fail++;
			}
			else {//写入、读取ok
				for (i = 0; i < nb; i++) {
					if (tab_rp_registers[i] != tab_rw_rq_registers[i]) {//请求写入的和读取的响应数据是否一致
						printf("ERROR modbus_read_and_write_registers READ\n");
						printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
							addr, tab_rp_registers[i], tab_rw_rq_registers[i],
							tab_rp_registers[i], tab_rw_rq_registers[i]);//不一致则输出
						nb_fail++;
					}
				}

				rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);//再次读取
				if (rc != nb) {
					printf("ERROR modbus_read_registers (%d)\n", rc);
					printf("Address = %d, nb = %d\n", addr, nb);
					nb_fail++;
				}
				else {//读取成功
					for (i = 0; i < nb; i++) {
						if (tab_rw_rq_registers[i] != tab_rp_registers[i]) {//再次比较请求写入的数据与 读取的响应是否一致
							printf("ERROR modbus_read_and_write_registers WRITE\n");
							printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
								addr, tab_rw_rq_registers[i], tab_rw_rq_registers[i],
								tab_rp_registers[i], tab_rp_registers[i]);
							nb_fail++;//失败次数
						}
					}
				}
			}
		}

		printf("Test: ");
		if (nb_fail)
			printf("%d FAILS\n", nb_fail);//打印失败次数
		else
			printf("SUCCESS\n");
	}

	/* Free the memory 释放内存 */
	free(tab_rq_bits);
	free(tab_rp_bits);
	free(tab_rq_registers);
	free(tab_rp_registers);
	free(tab_rw_rq_registers);

	/* Close the connection  关闭连接*/
	modbus_close(ctx);
	modbus_free(ctx);
	//std::cout << "Hello World!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

 

libmodbus/tests at master · stephane/libmodbus (github.com)







 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值