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;
}
在这里插入代码片