Ubuntu C++ Modbus Tcp 伪代码

该博客介绍了如何使用C++在Ubuntu上实现Modbus RTU网络通信。通过创建TCP连接,初始化Modbus上下文,设置从站ID,进行读写操作。在读取过程中,如果遇到错误,会进行重连尝试,确保数据的稳定传输。
摘要由CSDN通过智能技术生成

数据解析可以参考(写脉冲信号时:应先清零,再写0xff00,在清零):Ubuntu C++ Modbus Rtu 伪代码_yuchunhai321的博客-CSDN博客

modbus 网络通信(伪代码):
void init(std::string ip, uint16_t port)
{	
	modbus_t *m_sensor_ctx = modbus_new_tcp(ip.c_str(), port);

	if(m_sensor_ctx == NULL) {
		printf("sensor modbus connet ip: %s faild", ip.c_str());
		return;
	}

	modbus_set_slave(m_sensor_ctx, 1);
	
	if((m_modbusIsConnect = modbus_connect(m_sensor_ctx)) == -1) {
		printf("modbus tcp connect failed: %s", modbus_strerror(errno));
		return ;
	}
}

void close()
{
	modbus_close(m_sensor_ctx);
	modbus_free(m_sensor_ctx);
}

void write()
{
	uint16_t write_regs[3] = {0};
	write_regs[0] = 0x01;
	write_regs[1] = 0x02;
	write_regs[2] = 0x03;
	modbus_write_registers(m_sensor_ctx, 25, 3, write_regs);

	return true;
}

void read()
{
	uint16_t reg_value[12] = {0};
	int reconnect_times = 0;

	while(true){
		memset(reg_value, 0, sizeof(reg_value));
		modbus_flush(m_sensor_ctx);
		int ret = modbus_read_registers(m_sensor_ctx, 0, 12, reg_value); //返回接收到得数据长度 第一次返回-1, 第二次开始返回接收到得数据长度
		if(ret < 0){
			printf("Sensor board : read_holding_registers error! ret = %d \n",ret);	

			sleep(1);

			if(++reconnect_times > 10)
			{
				printf("Sensor board : disconnected,reconnecting... ret = %d \n",ret);	

				modbus_close(m_sensor_ctx);
				modbus_free(m_sensor_ctx);

				reconnect_times = 0;

				m_sensor_ctx = modbus_new_tcp(ip.c_str(), port);

				modbus_set_slave(m_sensor_ctx, 1);

				if((m_modbusIsConnect = modbus_connect(m_sensor_ctx)) == -1) {

					printf("modbus tcp connect failed: %s", modbus_strerror(errno));
				}
			}
		} else if(ret >= 0) {
			reconnect_times = 0;			



			for(int i = 0 ; i < 12; i++)
				printf("sensor reg_value[%d] = 0x%04x\n",i,reg_value[i]);


			sensor_data.forward_avoidance_sensor = reg_value[0];
			sensor_data.backward_avoidance_sensor = reg_value[1];
			LOG_INFO("recv data 0 = %d  1 = %d", reg_value[0], reg_value[1]);

		}		

		usleep(500*1000)
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值