Modubus TCP Client

Modubus TCP Client

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#include <modbus.h>


#define LOOP  			1    //循环次数
#define SERVER_ID 		17	 //从端设备地址
#defind ADDRESS_START 	0	 //测试寄存器起始地址
#definf ADDRESS_END 	99	 //测试寄存器结束地址

int main()
{
	modbus_t *ctx;
	int rc,nb_fail,nb_loop,addr,nb;
	uint8_t *tab_rq_bits,*tab_rp_bits;
	uint16_t *tab_rq_registers,tab_rp_registers;
	uint16_t *tab_rw_rq_registers;
	
	ctx = modbus_new_tcp("127.0.0.1",8000);
	modbus_set_debug(ctx,TRUE); //设置dubug模式

	if(modbus_connect(ctx) == -1)
	{
		fprintf(stderr,"connect fail:%s\n",modbus_strerror(errno));
		modbus_free(ctx);
		return -1;
	}
	/*计算需测试的寄存器个数*/
	nb = ADDRESS_END-ADDRESS_START;
	/*申请内存块,用于保存发送与接收的数据*/
	tab_rq_bits = (uint8_t *)malloc(nb * sizeof(uint8_t));
	memset(tab_rq_bits,0x00,nb * sizeof(uing8_t));
	
	tab_rp_bits = (uint8_t *)malloc(nb * sizeof(uint8_t));
	memset(tab_rp_bits,0x00,nb * sizeof(uing8_t));
	
	tab_rq_registers = (uint16_t *)malloc(nb * sizeof(uint16_t));
	memset(tab_rq_registers,0x00,nb * sizeof(uing16_t));
	
	tab_rp_registers = (uint16_t *)malloc(nb * sizeof(uint16_t));
	memset(tab_rp_registers,0x00,nb * sizeof(uing16_t));
	
	tab_rw_rq_registers = (uint16_t *)malloc(nb * sizeof(uint16_t));
	memset(tab_rw_rq_registers,0x00,nb * sizeof(uing16_t));
	nb_loop = nb_fail = 0;
	while(nb_loop++ < nb_fail)
	{
		//顺序测试
		for(addr = ADDRESS_START;addr < ADDRESS_END;addr++)
		{
			int i;
			//随机数用于测试
			for(i = 0;i < nb;i++)
			{
				tab_rq_registers[i] = (uint16_t)(65535.0 * rand()/(RAND_MAX+1.0));
				tab_rw_registers[i] = ~tab_rq_registers[i];
				tab_rq_bits[i] = tab_rq_registers[i]%2;
				
			}
			nb = ADDRESS_END - addr;
			//线圈寄存器单个读写
			rc = modbus_write_bit(ctx,addr,tab_rq_bits[0]);
			if(rc != 1)
			{
				printf("error modbus_write_bit %s\n",modbus_strerror(errno));
				printf("address = %d\n",addr);
				nb_fail++;
			}
			else
			{
				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 %d\n",rc);
					printf("address = %d\n",addr);
					nb_fail++;
				}
			}
			//线圈寄存器批量读写
			rc = modbus_write_bits(ctx,addr,nb,tab_rq_bits);
			if(rc != nb)
			{
				printf("error modbus_write_bits %d\n",rc));
				printf("address = %d\n",addr);
				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\n",addr);
					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\n",addr);
							nb_fail++;
						}
					}
				}
			}
			//保持寄存器单个读写
			rc = modbus_write_register(ctx,addr,tab_rq_registers[0]);
			if(rc != 1)
			{
				printf("error modbus_write_register %s\n",modbus_strerror(errno));
				printf("address = %d\n",addr);
				nb_fail++;
			}
			else
			{
				rc = modbus_read_register(ctx,addr,1,tab_rp_registers);
				if(rc != 1)
				{
					printf("error modbus_read_register \n");
					printf("address = %d\n",addr);
					nb_fail++;
				}
				else
				{
					if(tab_rp_registers[0] != tab_rq_registers[0])
					{
						printf("error modbus_read_register \n");
						printf("address = %d\n",addr);
						nb_fail++;
					}
				}
			}
			//线圈寄存器批量读写
			rc = modbus_write_registers(ctx,addr,nb,tab_rq_registers);
			if(rc != nb)
			{
				printf("error modbus_write_registers %d\n",rc));
				printf("address = %d\n",addr);
				nb_fail++;
			}
			else
			{
				rc = modbus_read_registers(ctx,addr,nb,tab_rp_registers);
				if(rc != nb)
				{
					printf("error modbus_read_registers \n");
					printf("address = %d\n",addr);
					nb_fail++;
				}
				else
				{
					for(i = 0;i < nb; i++)
					{
						if(tab_rp_registers[i] != tab_rq_registers[i])
						{
							printf("error modbus_read_registers \n");
							printf("address = %d\n",addr);
							nb_fail++;
						}
					}
				}
			}
			//功能码23(0x17)多个寄存器读写
			rc = modbus_write_read_registers(ctx,addr,nb,tab_rw_rq_registers,addr,nb,tab_rp_registers);
			if(rc != nb)
			{
				printf("error modbus_write_read_registers %d\n",rc));
				printf("address = %d\n",addr);
				nb_fail++;
			}
			else
			{
				for(i = 0;i < nb; i++)
				{
					if(tab_rp_registers[i] != tab_rw_rq_registers[i])
					{
						printf("error modbus_read_registers \n");
						printf("address = %d\n",addr);
						nb_fail++;
					}
				}
				rc = modbus_read_registers(ctx,addr,nb,tab_rp_registers);
				if(rc != nb)
				{
					printf("error modbus_read_registers \n");
					printf("address = %d\n",addr);
					nb_fail++;
				}
				else
				{
					for(i = 0;i < nb; i++)
					{
						if(tab_rw_rp_registers[i] != tab_rp_registers[i])
						{
							printf("error modbus_read_registers \n");
							printf("address = %d\n",addr);
							nb_fail++;
						}
					}
				}
			}
		}
		printf("Test :");
		if(nb_fail)
			printf("%d fail\n",nb_fail);
		else
			printf("success\n");
	}
	free(tab_rq_bits);
	free(tab_rp_bits);
	free(tab_rq_registers);
	free(tab_rq_registers);
	free(tab_rw_rq_registers);
	
	modbus_close(ctx);
	modbus_fress(ctx);
	
	return 0;
}



在这里插入代码片
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值