Browse Source

上传文件至 ''

test^2
wangchenyang 6 months ago
parent
commit
8e91dcd9d4
  1. 166
      TcpSlave.c

166
TcpSlave.c

@ -6,6 +6,10 @@
#include <modbus.h> #include <modbus.h>
int dataProcessing( uint8_t* query , modbus_mapping_t* map) ;
//TCP模式的Slave端程序 //TCP模式的Slave端程序
int main(void) int main(void)
{ {
@ -13,18 +17,11 @@ int main(void)
int sockfd = -1 ; int sockfd = -1 ;
modbus_t* ctx = NULL ; modbus_t* ctx = NULL ;
modbus_mapping_t* map = NULL ; modbus_mapping_t* map = NULL ;
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] ;
int i = 0 ;
//浮点处理 uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] ;
uint16_t floatArray[2] = {0} ;
float floatting ;
//unsigned 转 signed
uint16_t sint ;
//1. 设置串口信息 //1. 设置串口信息
ctx = modbus_new_tcp("192.168.1.231", 1503) ; ctx = modbus_new_tcp("192.168.1.231", 1502) ;
if (NULL == ctx) if (NULL == ctx)
{ {
fprintf(stderr, "Error: %s\n", modbus_strerror(errno)) ; fprintf(stderr, "Error: %s\n", modbus_strerror(errno)) ;
@ -35,19 +32,6 @@ int main(void)
printf("设置TCP信息成功\n") ; 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) ; map = modbus_mapping_new_start_address(0 , 0 , 0 , 0 , 30000 , 25 , 40000 , 135) ;
if (NULL == map) if (NULL == map)
{ {
@ -55,17 +39,20 @@ int main(void)
modbus_free(ctx) ; modbus_free(ctx) ;
return 1 ; return 1 ;
} }
for(i = 0 ; i < 24 ; i++)
for(int i = 0 ; i < 24 ; i++)
{ {
map->tab_registers[i] = i + 777; map->tab_registers[i] = i ;
} }
map->tab_registers[24] = 999 ; map->tab_registers[24] = 999 ;
//浮点测试
//map->tab_registers[2] = 0x0020 ; //map->tab_registers[2] = 0x0020 ;
//map->tab_registers[3] = 0xF147 ; //map->tab_registers[3] = 0xF147 ;
for(i = 0 ; i < 135 ; i++) for(int i = 0 ; i < 135 ; i++)
{ {
map->tab_input_registers[i] = i * 2 + 100 ; map->tab_input_registers[i] = i * 2 ;
} }
//4. 开始监听端口 //4. 开始监听端口
@ -90,83 +77,108 @@ int main(void)
while (1) while (1)
{ {
memset(query, 0, sizeof(query)) ; memset(query, 0, sizeof(query)) ;
//获取查询请求报文 //获取查询请求报文
ret = modbus_receive(ctx, query) ; ret = modbus_receive(ctx, query) ;
if (ret >= 0) if (ret >= 0)
{ {
//恢复响应报文 //恢复响应报文
modbus_reply(ctx, query, ret, map) ; modbus_reply(ctx, query, ret, map) ;
dataProcessing( query , map ) ;
} }
else else
{ {
printf("Connection close\n") ; printf("Connection close\n") ;
modbus_close(ctx) ; modbus_close(ctx) ;
//等待下一个客户端连接 //等待下一个客户端连接
modbus_tcp_accept(ctx, &sockfd) ; modbus_tcp_accept(ctx, &sockfd) ;
} }
}
printf("Quit the loop: %s\n", modbus_strerror(errno)) ;
//6. 释放内存
modbus_mapping_free(map) ;
//7. 关闭设备
modbus_close(ctx) ;
modbus_free(ctx) ;
//尝试处理浮点数 return 0 ;
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] ;
}
//打印信息 int dataProcessing( uint8_t* query , modbus_mapping_t* map )
printf("\n======================================================================\n") ; {
uint16_t address ;
uint16_t address1 ;
uint16_t address2 ;
int i = 0 ;
printf("\n----------map->tab_registers----------\n") ; //浮点处理
for(i = 0 ; i < 24 ; i++) uint16_t floatArray[2] = {0} ;
{ float floatting ;
printf("%d\t" , map->tab_registers[i]) ;
}
printf("\n----------map->tab_input_registers----------\n") ; //unsigned 转 signed
for(i = 0 ; i < 135 ; i ++) uint16_t sint ;
{
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) floatArray[0] = map->tab_registers[2] ;
{ floatArray[1] = map->tab_registers[3] ;
sint = (~(map->tab_registers[4])) + 1 ; floatting = modbus_get_float_dcba(floatArray) ;
printf("-%d\n" , sint) ;
}
else
{
sint = map->tab_registers[4] ;
printf("%d\n" , sint);
}
printf("======================================================================\n") ;
map->tab_registers[0]++ ; //将unsigned转为signed
//sleep(1) ; if(map->tab_registers[4] & 0x8000)
{
sint = (~(map->tab_registers[4])) + 1 ;
}
else
{
sint = map->tab_registers[4] ;
}
printf("\n请求序列号:%d\n" , query[1] ) ;
if( query[7] == 4)
{
printf("读取Input Registers寄存器\n") ;
}
else if(query[7] == 3)
{
printf("读取Holding Registers寄存器\n") ;
}
address1 = query[8] << 8 ;
address2 = query[9] & 0x00ff ;
address = address1 | address2 ;
printf("本次读取的起始地址为:%d\n" , address) ;
printf("本次读取个数为:%d个\n" , query[11] ) ;
//打印信息
printf("\n======================================================================\n") ;
printf("\n----------map->tab_registers----------\n") ;
for(i = 0 ; i < 24 ; i++)
{
printf("%d\t" , map->tab_registers[i]) ;
} }
printf("Quit the loop: %s\n", modbus_strerror(errno)) ; printf("\n----------map->tab_input_registers----------\n") ;
for(i = 0 ; i < 135 ; i ++)
{
printf("%d\t" , map->tab_input_registers[i]) ;
}
//6. 释放内存 printf("\n----------float DC BA ----------\n");
modbus_mapping_free(map) ; printf("%f\n" , floatting) ;
//7. 关闭设备 printf("----------signed int ----------\n");
modbus_close(ctx) ; if(map->tab_registers[4] & 0x8000)
modbus_free(ctx) ; {
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]++ ;
return 0 ; return 0 ;
} }

Loading…
Cancel
Save