基于libmodbus 开发RTU Slave端测试程序

基于libmodbus 开发RTU Master端测试程序

  • 开发环境
  • 完整代码
  • 配合上一篇博客写的Master端测试程序测试 测试运行演示

开发环境

  1. 编译软件:VS2019
  2. libmodbusbus库:3.1.6版本 下载地址:https://libmodbus.org/download/

完整代码

//******************************************************************************                                
//name:             TestRtuSlave.cpp                   
//introduce:        串口Modbus-RTU Master(主机)测试代码            
//author:           szq                                               
//changetime:       2019.8.13
//****************************************************************************** 

/*********************************************************************
 * INCLUDES
 */
#include 
#ifndef _MSC_VER
include <unistd.h>
#endif
#include 
#include 
#include 

#include "modbus.h"  //应用libmodbus库



/*All these functions arre called with random values on a address range defined by the following defines.
* 所有这些函数都是在以下定义的地址范围内使用随机值调用的。
*/
#define SERVER_ID      17    //从端设备地址 

/*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;
	modbus_mapping_t* mb_mapping;

	system("title C++ modbus-RTU 测试程序");//设置cmd窗口标题
	system("mode con cols=48 lines=25");//窗口宽度高度
	system("color 0B");//0背景色黑色 B前景色浅绿色
	system("date /T");//输出当前日期时间
	system("TIME /T");

	printf(" ╪╪╪╪╪╪╧╧╧╧╧╧╧╧╪╪╪╪╪╪\n");
	printf("╔═╧╧ C++ modbus-RTU TEST CODE ╧╧═╗\n");
	printf("║※1. ║\n");
	printf("║※2. ║\n");
	printf("║※3. ║\n");
	printf("║※0. ║\n");
	printf("╚═══════════════════╝\n");
	Sleep(1000);//延时1秒 

	/* RTU */
	ctx = modbus_new_rtu("COM4", 9600, 'N', 8, 1);  //创建一个RTU类型的容器,即创建一个COM口为C0M4 波特率9600bit/s
	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;
	}

	//申请4块内存区用以存放寄存器数据,这里各申请500个寄存器地址
	mb_mapping = modbus_mapping_new(500, 500, 500, 500);
	if (mb_mapping == NULL)
	{
		fprintf(stderr,"Error mapping:%s\n", modbus_strerror(errno));
		modbus_free(ctx);
		return -1;
	}

	//循环接收查询帧并回复消息
	for (;;)
	{
		uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
		int rc;

		rc = modbus_receive(ctx, query);
		if (rc >= 0)
		{
			/*rc is the query size*/
			modbus_reply(ctx, query, rc, mb_mapping);
		}
		else
		{
			//connection closed by the client or error
			printf("Connection Closed\n");
		}
	}

	printf("Quit the loop:%s\n", modbus_strerror(errno));

	//释放内存
	modbus_mapping_free(mb_mapping);
	modbus_close(ctx);
	modbus_free(ctx);
	return 0;
}

配合上一篇博客写的Master端测试程序测试 测试运行演示

基于libmodbus 开发RTU Slave端测试程序_第1张图片

你可能感兴趣的:(Modbus学习)