You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
3.4 KiB
172 lines
3.4 KiB
#include <stdio.h> |
|
#include <unistd.h> |
|
#include <stdlib.h> |
|
#include <errno.h> |
|
#include <string.h> |
|
|
|
#include <modbus.h> |
|
|
|
//TCP模式的Slave端程序 |
|
int main(void) |
|
{ |
|
int ret = 0 ; |
|
int sockfd = -1 ; |
|
modbus_t* ctx = NULL ; |
|
modbus_mapping_t* map = NULL ; |
|
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] ; |
|
int i = 0 ; |
|
|
|
//浮点处理 |
|
uint16_t floatArray[2] = {0} ; |
|
float floatting ; |
|
|
|
//unsigned 转 signed |
|
uint16_t sint ; |
|
|
|
//1. 设置串口信息 |
|
ctx = modbus_new_tcp("192.168.1.231", 1503) ; |
|
if (NULL == ctx) |
|
{ |
|
fprintf(stderr, "Error: %s\n", modbus_strerror(errno)) ; |
|
return 1 ; |
|
} |
|
else |
|
{ |
|
printf("设置TCP信息成功\n") ; |
|
} |
|
|
|
#if 0 |
|
//2. 设置调试模式 |
|
ret = modbus_set_debug(ctx, TRUE); |
|
if (-1 == ret) |
|
{ |
|
printf("modbus_set_debug failed...\n") ; |
|
modbus_free(ctx); |
|
return 1; |
|
} |
|
#endif |
|
|
|
//3. 申请内存 存放寄存器数据 |
|
//map = modbus_mapping_new( 0 , 0 , 30000 + 25 , 0) ; |
|
map = modbus_mapping_new_start_address(0 , 0 , 0 , 0 , 30000 , 25 , 40000 , 135) ; |
|
if (NULL == map) |
|
{ |
|
fprintf(stderr, "Error: mapping %s\n", modbus_strerror(errno)) ; |
|
modbus_free(ctx) ; |
|
return 1 ; |
|
} |
|
for(i = 0 ; i < 24 ; i++) |
|
{ |
|
map->tab_registers[i] = i + 777; |
|
} |
|
map->tab_registers[24] = 999 ; |
|
//map->tab_registers[2] = 0x0020 ; |
|
//map->tab_registers[3] = 0xF147 ; |
|
|
|
for(i = 0 ; i < 135 ; i++) |
|
{ |
|
map->tab_input_registers[i] = i * 2 + 100 ; |
|
} |
|
|
|
//4. 开始监听端口 |
|
sockfd = modbus_tcp_listen(ctx, 1) ; |
|
if (-1 == sockfd) |
|
{ |
|
printf("modbus_tcp_listen failed...\n") ; |
|
modbus_free(ctx) ; |
|
return 1 ; |
|
} |
|
|
|
//5. 接受客户端连接 |
|
ret = modbus_tcp_accept(ctx, &sockfd) ; |
|
if (-1 == ret) |
|
{ |
|
printf("modbus_tcp_accept failedl: %s\n", modbus_strerror(errno)) ; |
|
modbus_free(ctx) ; |
|
return 1 ; |
|
} |
|
|
|
//6. 循环接受客户端请求,并且响应客户端 |
|
while (1) |
|
{ |
|
memset(query, 0, sizeof(query)) ; |
|
|
|
//获取查询请求报文 |
|
ret = modbus_receive(ctx, query) ; |
|
if (ret >= 0) |
|
{ |
|
//恢复响应报文 |
|
modbus_reply(ctx, query, ret, map) ; |
|
} |
|
else |
|
{ |
|
printf("Connection close\n") ; |
|
|
|
modbus_close(ctx) ; |
|
|
|
//等待下一个客户端连接 |
|
modbus_tcp_accept(ctx, &sockfd) ; |
|
} |
|
|
|
//尝试处理浮点数 |
|
floatArray[0] = map->tab_registers[2] ; |
|
floatArray[1] = map->tab_registers[3] ; |
|
floatting = modbus_get_float_dcba(floatArray) ; |
|
|
|
//将unsigned转为signed |
|
if(map->tab_registers[4] & 0x8000) |
|
{ |
|
sint = (~(map->tab_registers[4])) + 1 ; |
|
} |
|
else |
|
{ |
|
sint = map->tab_registers[4] ; |
|
} |
|
|
|
//打印信息 |
|
printf("\n======================================================================\n") ; |
|
|
|
printf("\n----------map->tab_registers----------\n") ; |
|
for(i = 0 ; i < 24 ; i++) |
|
{ |
|
printf("%d\t" , map->tab_registers[i]) ; |
|
} |
|
|
|
printf("\n----------map->tab_input_registers----------\n") ; |
|
for(i = 0 ; i < 135 ; i ++) |
|
{ |
|
printf("%d\t" , map->tab_input_registers[i]) ; |
|
} |
|
|
|
printf("\n----------float DC BA ----------\n"); |
|
printf("%f\n" , floatting) ; |
|
|
|
printf("----------signed int ----------\n"); |
|
if(map->tab_registers[4] & 0x8000) |
|
{ |
|
sint = (~(map->tab_registers[4])) + 1 ; |
|
printf("-%d\n" , sint) ; |
|
} |
|
else |
|
{ |
|
sint = map->tab_registers[4] ; |
|
printf("%d\n" , sint); |
|
} |
|
printf("======================================================================\n") ; |
|
|
|
map->tab_registers[0]++ ; |
|
//sleep(1) ; |
|
} |
|
|
|
printf("Quit the loop: %s\n", modbus_strerror(errno)) ; |
|
|
|
//6. 释放内存 |
|
modbus_mapping_free(map) ; |
|
|
|
//7. 关闭设备 |
|
modbus_close(ctx) ; |
|
modbus_free(ctx) ; |
|
|
|
return 0 ; |
|
} |
|
|
|
|