【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)







 

Modbus是一种通信协议,用于在不同设备之间进行数据传输和通信。modbus_tk是一个Python库,提供了在RTU模式下使用Modbus协议的功能。 使用modbus_tk.modbus_rtu模块,你可以在Python中实现Modbus RTU通信。这个模块提供了一些函数和类,用于建立Modbus RTU通信连接、读取和写入数据等操作。 你可以使用modbus_tk.modbus_rtu模块来创建一个Modbus RTU主站或从站,然后通过调用相应的函数来进行读写操作。例如,你可以使用`modbus_tk.modbus_rtu.RtuMaster`类来创建一个主站对象,然后使用该对象的`execute`方法来发送读写请求。 以下是一个简单示例,演示了如何使用modbus_tk.modbus_rtu模块进行Modbus RTU通信: ```python import modbus_tk.modbus_rtu as modbus_rtu import serial # 创建串口连接 ser = serial.Serial(port='COM1', baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0) # 创建Modbus RTU主站 master = modbus_rtu.RtuMaster(ser) # 连接到从站设备 master.open() # 读取保持寄存器的值 data = master.execute(1, modbus_rtu.READ_HOLDING_REGISTERS, 0, 10) # 写入保持寄存器的值 master.execute(1, modbus_rtu.WRITE_SINGLE_REGISTER, 0, output_value=12345) # 关闭连接 master.close() ``` 在上面的示例中,我们首先创建了一个串口连接,然后使用该连接创建了一个Modbus RTU主站对象。然后,我们可以通过调用主站对象的execute方法来发送读写请求。在示例中,我们首先读取了从站设备保持寄存器的值,然后写入了一个新的值。 请注意,上述示例中的参数和函数调用可能需要根据你的实际情况进行相应的修改。此外,你需要确保安装了modbus_tk库和所需的依赖项,以便能够成功运行该代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值