C++ modbus通信

需要材料:

libmodbus调试助手

modbus发送数据子函数
第一步:
	#include modbus.h
第二步:
	char *ip = "192.168.83.75";
	int port = 502; 
	int SERVER_ID = 2;	//从端设备slave
	int LOOP = 1;	//循环次数
	int ADDRESS_START = 4096;	//测试寄存器起始地址
	int ADDRESS_END = 4102;	//测试寄存器结束地址
	int nb = ADDRESS_END - ADDRESS_START;
	 /*申请存储空间*/
	uint16_t *send_data;
	send_data = (uint16_t *)malloc(nb * sizeof(uint16_t));
	memset(send_data, 0, nb* sizeof(uint16_t));
	for (int i = 0; i < nb; i++)
	{
		send_data[i] = (uint16_t)(0);//发送的数据输入
	}
	int flag = modbus_tcpip_send_data(send_data, ip, port, SERVER_ID, LOOP, ADDRESS_START, ADDRESS_END);//发送失败返回-1

第三步:
int modbus_tcpip_send_data(uint16_t *send_data, char *ip, int port, int SERVER_ID, int LOOP, int ADDRESS_START, int ADDRESS_END)
{
	modbus_t *ctx;
	int rc;
	int nb_fail;
	int nb_loop;
	int addr;
	int nb;
	uint16_t *tab_rq_registers;
	uint16_t *tab_rp_registers;

	/*连接TCP*///("Master"(主盘)接口和"Slave"(从盘)接口)
	ctx = modbus_new_tcp(ip, port);
	modbus_set_debug(ctx, TRUE);//调试:返回IP和port
	modbus_set_slave(ctx, SERVER_ID);

	/*连接报错*/
	if (modbus_connect(ctx) == -1)
	{
		modbus_free(ctx);
		return -1;
	}

	nb = ADDRESS_END - ADDRESS_START;

	/*申请存储空间*/
	tab_rq_registers = (uint16_t *)malloc(nb * sizeof(uint16_t));
	memset(tab_rq_registers, 0, nb* sizeof(uint16_t));

	tab_rp_registers = (uint16_t *)malloc(nb * sizeof(uint16_t));
	memset(tab_rp_registers, 0, nb* sizeof(uint16_t));

	/*设定欲写入的数值*/
	for (addr = ADDRESS_START; addr < ADDRESS_END; addr++)
	{
		for (int i = 0; i < nb; i++)
		{
			tab_rq_registers[i] = (uint16_t)(send_data[i]);//(uint16_t)(65535.0 * rand() / (RAND_MAX + 1.0));			
		}
	}

	/*传送与读取数据*/
	nb_loop = nb_fail = 0;
	while (nb_loop++ < LOOP)//写入的条件(一满足【条件】即写入并返回正确写入的【标志】)
	{
		int i;
		addr = ADDRESS_START;
		/*寄存器的批量写*/
		rc = modbus_write_registers(ctx, ADDRESS_START, nb, tab_rq_registers);//返回rc为写入
		if (rc != nb)
		{//rc!=nb则写入错误			
			nb_fail++;//错误的标识
		}
		else
		{//正确写入后,读取寄存器状态			
			rc = modbus_read_registers(ctx, ADDRESS_START, nb, tab_rp_registers);
			if (rc != nb)
			{//rc!=nb则读取失败				
				nb_fail++;
			}/*单步调试成功*/
			else
			{//正确读取后,返回正确标志
				for (i = 0; i < nb; i++)
				{
					if (tab_rq_registers[i] != tab_rp_registers[i])
					{//寄存器数值不匹配则:						
						nb_fail++;
					}/*单步调试成功*/
				}
			}
		}
		
		if (nb_fail)return -1;
		else return 0;			

		/*释放内存*/
		free(tab_rq_registers);
		free(tab_rp_registers);

		/*关闭连接*/
		modbus_close(ctx);
		modbus_free(ctx);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41275726/article/details/85006488