C++vs2013 + Modbus通讯协议 实现与PLC通讯

本文介绍了在VS2013环境下,使用Qt5.8.0和Libmodbus库进行C++编程,展示了如何搭建框架、连接PLC、读写寄存器以及断开连接的测试例程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境说明

        开发环境:vs2013、qt5.8.0、Libmodbus库

        开发语言:C++

二、框架搭建

        项目属性内分别引入modbus.dll、modbus.h、modbus-tcp.h、modbus.lib等头文件、动态库、静态库。具体操作与引入位置参考第一篇博客。

        注意64位与32位系统、debug模式与release模式下分别对应不同的引入文件。

三、测试例程

        程序中引入头文件 #include "modbus.h"

        1.建立PLC连接

void pcPLC::connect()
{
	std::cout << "modbus init success" << std::endl;
	
	// 设置PLC的IP地址与端口,建立TCP连接
	ctx = modbus_new_tcp("192.168.1.1", 502);
	if (ctx == NULL)
	{
		std::cout << "Unable to allocate libmodbus context " << modbus_strerror(errno) << std::endl;
	}

	std::cout << "modbus_connect(ctx) =  " << modbus_connect(ctx) << std::endl;
	if (modbus_connect(ctx) == -1)
	{
		modbus_close(ctx);
		modbus_free(ctx); 
		std::cout << "PLC connect failed " << modbus_strerror(errno) << std::endl;
	}
	else 
	{
		std::cout << "PLC connect success " << std::endl;
		plcFlag = 1;
	}
}

        2.读取寄存器数据

int pcPLC::readRegister(int num)
{
	uint16_t regs[1];
	if (plcFlag != 0)
	{
		int res = modbus_read_registers(ctx, num, 1, regs);
		if (res == -1)
		{
			std::cerr << "Failed to read registers: " << modbus_strerror(errno) << std::endl;
			// 读取失败返回值0x0000
			regs[0] = 0x0000;
		}
		else
		{
			//std::cout << "Read Register " << num << " : " << regs[0] << std::endl;
		}
	}
	// 返回读取值
	return regs[0];
}

        3.数据写入寄存器

void pcPLC::writeRegister( int num, int value)
{
	if (plcFlag != 0)
	{
		if (modbus_write_register(ctx, num, value) == -1)
		{
			std::cerr << "Failed to write to register: " << modbus_strerror(errno) << std::endl;
		}
		else
		{
			//std::cout << "Changed Register " << num << " to : " << value << std::endl;
		}
	}
}

        4.断开PLC连接

void pcPLC::disconnect()
{	
	if (plcFlag != 0)
	{
		modbus_close(ctx);
		modbus_free(ctx);
		plcFlag = 0;
		std::cout << "PLC disconnect success " << std::endl;
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值