需要材料:
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);
}
}