4 changed files with 547 additions and 0 deletions
@ -0,0 +1,121 @@
@@ -0,0 +1,121 @@
|
||||
#include <stdio.h> |
||||
#include <errno.h> |
||||
#include <unistd.h> |
||||
#include <string.h> |
||||
|
||||
#include <modbus.h> |
||||
|
||||
|
||||
int main() |
||||
{ |
||||
//初始化modbus实例
|
||||
modbus_t* ctx ; |
||||
ctx = modbus_new_rtu( "/dev/ttyAS1", 115200, 'N', 8, 1 ) ; |
||||
if ( ctx == NULL) |
||||
{ |
||||
fprintf( stderr , "串口设置失败:%s\n" , modbus_strerror(errno) ) ; |
||||
return -1 ; |
||||
} |
||||
else |
||||
{ |
||||
fprintf( stdout , "串口设置成功\n") ; |
||||
} |
||||
|
||||
|
||||
//设置为RS485模式
|
||||
int ret = -1 ; |
||||
|
||||
|
||||
/*
|
||||
ret = modbus_rtu_set_serial_mode(ctx , MODBUS_RTU_RS485); |
||||
if( ret == -1) |
||||
{ |
||||
fprintf( stderr , "串口设置模式失败:%s\n" , modbus_strerror(errno) ) ; |
||||
return -1 ; |
||||
} |
||||
else |
||||
{ |
||||
fprintf( stdout , "串口设置模式成功\n") ; |
||||
} |
||||
*/ |
||||
|
||||
//设置从机地址为 1
|
||||
ret = modbus_set_slave( ctx , 1 ) ; |
||||
if( ret == -1) |
||||
{ |
||||
fprintf( stderr , "从机地址设置失败:%s\n" , modbus_strerror(errno) ) ; |
||||
return -1 ; |
||||
} |
||||
else |
||||
{ |
||||
fprintf( stdout , "从机地址设置成功\n") ; |
||||
} |
||||
|
||||
|
||||
|
||||
//设置debug模式
|
||||
ret = modbus_set_debug( ctx , TRUE ) ; |
||||
if( ret == -1 ) |
||||
{ |
||||
fprintf( stderr , "debug模式设置失败:%s\n" , modbus_strerror(errno) ) ; |
||||
return -1 ; |
||||
} |
||||
else |
||||
{ |
||||
fprintf( stdout , "debug模式设置成功\n") ; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
//连接串口
|
||||
ret = modbus_connect( ctx ) ; |
||||
if( ret == -1 ) |
||||
{ |
||||
fprintf( stderr , "connect设置失败:%s\n" , modbus_strerror(errno) ) ; |
||||
return -1 ; |
||||
} |
||||
else |
||||
{ |
||||
fprintf( stdout , "connect模式设置成功\n") ; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
//初始化寄存器数组
|
||||
uint16_t tab_registers[24] ; |
||||
uint16_t tab_input_registers[135] ; |
||||
|
||||
|
||||
while(1) |
||||
{ |
||||
memset( tab_registers , 0 , sizeof(tab_registers) ) ; |
||||
memset( tab_input_registers , 0 , sizeof(tab_input_registers) ) ; |
||||
|
||||
|
||||
//直接读取 tab_registers
|
||||
modbus_read_registers( ctx , 30000 , 24 , tab_registers ) ; |
||||
//直接读取 tab_input_registers
|
||||
modbus_read_input_registers( ctx , 40000 , 100 , tab_input_registers ) ; |
||||
|
||||
|
||||
printf("===========================================\n") ; |
||||
printf("---------------tab_registers---------------\n") ; |
||||
for( int i = 0 ; i < 24 ; i++ ) |
||||
{ |
||||
printf("%d\t" , tab_registers[i] ) ; |
||||
} |
||||
printf("\n") ; |
||||
printf("===========================================\n") ; |
||||
printf("----------tab_input_registers--------------\n") ; |
||||
for( int i = 0 ; i < 135 ; i++) |
||||
{ |
||||
printf("%d\t" , tab_input_registers[i]) ; |
||||
} |
||||
printf("\n") ; |
||||
printf("===========================================\n") ; |
||||
sleep(1) ; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,159 @@
@@ -0,0 +1,159 @@
|
||||
#include <stdio.h> |
||||
#include <unistd.h> |
||||
#include <stdlib.h> |
||||
#include <errno.h> |
||||
#include <string.h> |
||||
|
||||
#include <modbus.h> |
||||
|
||||
int dataProessing( uint8_t *query , modbus_mapping_t* map ) ; |
||||
|
||||
int main(void) |
||||
{ |
||||
int ret = 0; |
||||
|
||||
modbus_t* ctx = NULL; |
||||
modbus_mapping_t* map = NULL; |
||||
|
||||
uint8_t query[MODBUS_RTU_MAX_ADU_LENGTH]; |
||||
|
||||
|
||||
ctx = modbus_new_rtu("/dev/ttyAS3", 115200 , 'N', 8, 1); |
||||
if (NULL == ctx) |
||||
{ |
||||
fprintf(stderr, "New Rtu Error: %s\n", modbus_strerror(errno)); |
||||
return 1; |
||||
} |
||||
|
||||
|
||||
ret = modbus_set_slave( ctx, 1 ); |
||||
if (-1 == ret) |
||||
{ |
||||
printf("设置从机地址失败.. %s\n", modbus_strerror(errno)); |
||||
modbus_free(ctx); |
||||
return 1; |
||||
} |
||||
#if 0 |
||||
ret = modbus_set_debug(ctx, TRUE); |
||||
if (-1 == ret) |
||||
{ |
||||
printf("modbus_set_debug failed...\n"); |
||||
modbus_free(ctx); |
||||
return 1; |
||||
} |
||||
#endif |
||||
|
||||
|
||||
ret = modbus_connect(ctx); |
||||
if (-1 == ret) |
||||
{ |
||||
fprintf(stderr, "打开串口失败: %s\n", modbus_strerror(errno)); |
||||
modbus_free(ctx); |
||||
return 1; |
||||
} |
||||
|
||||
|
||||
|
||||
map = modbus_mapping_new_start_address( 0 , 0 , 0 , 0 , 30000 , 24 , 40000 , 135 ) ; |
||||
if (NULL == map) |
||||
{ |
||||
fprintf(stderr, "Error: mapping %s\n", modbus_strerror(errno)); |
||||
modbus_free(ctx); |
||||
return 1; |
||||
} |
||||
|
||||
for(int i = 0 ; i < 24 ; i++) |
||||
{ |
||||
map->tab_registers[i] = i ; |
||||
} |
||||
|
||||
for(int i = 0 ; i < 135 ; i++ ) |
||||
{ |
||||
map->tab_input_registers[i] = i * 2 ; |
||||
} |
||||
|
||||
while (1) |
||||
{ |
||||
map->tab_registers[0]++ ; |
||||
memset(query, 0, sizeof(query)); |
||||
|
||||
//获取查询请求报文
|
||||
ret = modbus_receive(ctx, query); |
||||
if (ret >= 0) |
||||
{ |
||||
//恢复响应报文
|
||||
modbus_reply(ctx, query, ret, map); |
||||
dataProessing( query , map ) ; |
||||
} |
||||
else |
||||
{ |
||||
printf("Connection close\n"); |
||||
} |
||||
} |
||||
|
||||
printf("Quit the loop: %s\n", modbus_strerror(errno)); |
||||
|
||||
|
||||
modbus_mapping_free(map); |
||||
|
||||
modbus_close(ctx); |
||||
modbus_free(ctx); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
|
||||
int dataProessing( uint8_t *query , modbus_mapping_t* map )
|
||||
{ |
||||
uint16_t address ; |
||||
uint16_t address1 ; |
||||
uint16_t address2 ; |
||||
|
||||
uint16_t count ; |
||||
uint16_t count1 ; |
||||
uint16_t count2 ; |
||||
#if 0 |
||||
printf("\n=====================query start======================\n") ; |
||||
for(int i = 0 ; i < MODBUS_RTU_MAX_ADU_LENGTH ; i++) |
||||
{ |
||||
printf( "%d\t" , query[i] ) ; |
||||
} |
||||
printf("\n====================query end==========================\n") ; |
||||
|
||||
return 0 ; |
||||
#endif |
||||
printf("\n=============================================================\n") ; |
||||
printf("从机设备地址为:%d\n" , query[0] ) ; |
||||
if( query[1] == 3 ) |
||||
{ |
||||
printf("03 读取Read Holding Registers寄存器\n") ; |
||||
} |
||||
else if( query[1] == 4 ) |
||||
{ |
||||
printf("04 读取Read Input Registers寄存器\n") ; |
||||
} |
||||
address1 = query[2] << 8 ; |
||||
address2 = query[3] & 0x00ff ; |
||||
address = address1 | address2 ; |
||||
printf("读取的起始地址为:%d\n" , address) ;
|
||||
|
||||
count1 = query[4] << 8 ; |
||||
count2 = query[5] & 0x00ff ; |
||||
count = count1 | count2 ; |
||||
printf("读取的起始地址为:%d\n" , count) ;
|
||||
|
||||
printf("----------tab_registers----------\n") ; |
||||
for(int i = 0 ; i < 24 ; i++) |
||||
{ |
||||
printf("%d\t" , map->tab_registers[i] ) ; |
||||
} |
||||
|
||||
printf("\n----------tab_input_registers----------\n") ; |
||||
for(int i = 0 ; i < 135 ; i++ ) |
||||
{ |
||||
printf("%d\t" , map->tab_input_registers[i] ) ; |
||||
} |
||||
printf("\n=====================================================================\n" ) ; |
||||
|
||||
return 0 ; |
||||
} |
@ -0,0 +1,95 @@
@@ -0,0 +1,95 @@
|
||||
#include <stdio.h> |
||||
#include <unistd.h> |
||||
#include <string.h> |
||||
#include <stdlib.h> |
||||
#include <errno.h> |
||||
#include <string.h> |
||||
//包含Modbus相关头文件
|
||||
#include <modbus.h> |
||||
|
||||
|
||||
|
||||
|
||||
//Tcp模式下的Master端
|
||||
int main(void) |
||||
{ |
||||
int ret = -1 ; |
||||
|
||||
//创建需要轮询的ip地址 和 port端口号
|
||||
char ipArray[2][16] = { "192.168.1.231" , "192.168.1.231" } ;
|
||||
int portArray[2] = { 1502 , 1503 }; |
||||
//创建读取数据的tab_registers数组 和 创将tab_input_registers的数组
|
||||
uint16_t tab_registers[24] ; |
||||
uint16_t tab_input_registers[134] ; |
||||
|
||||
//创建一个TCP类型的变量 并 使用for循环进行轮询
|
||||
modbus_t* ctx[2] = { NULL , NULL } ; |
||||
|
||||
for(int i = 0 ; i < 2; i++) |
||||
{ |
||||
ctx[i] = modbus_new_tcp( ipArray[i] , portArray[i] ); |
||||
if (NULL == ctx[i]) |
||||
{ |
||||
fprintf(stderr, "Error: %s\n", modbus_strerror(errno)); |
||||
return 1; |
||||
} |
||||
else |
||||
{ |
||||
printf("设置TCP成功\n"); |
||||
} |
||||
|
||||
|
||||
//遍历 连接Server
|
||||
ret = modbus_connect(ctx[i]); |
||||
if (-1 == ret) |
||||
{ |
||||
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); |
||||
modbus_free(ctx[i]); |
||||
return 1; |
||||
} |
||||
} |
||||
|
||||
|
||||
while(1) |
||||
{ |
||||
for(int i = 0 ; i < 2 ; i++) |
||||
{
|
||||
//清空缓存并读取数据
|
||||
memset( tab_registers , 0 , sizeof(tab_registers) ) ; |
||||
memset( tab_input_registers , 0 , sizeof(tab_input_registers) ) ; |
||||
|
||||
ret = modbus_read_registers(ctx[i] , 30000 , 24 , tab_registers); |
||||
if( ret == -1 ) |
||||
{ |
||||
perror("read tab_registers error") ; |
||||
printf("\n") ; |
||||
fprintf( stderr , "read tab_registers error %s " , modbus_strerror(errno)); |
||||
printf("\n") ; |
||||
} |
||||
|
||||
ret = modbus_read_input_registers( ctx[i] , 40000 , 100 , tab_input_registers ) ; |
||||
if( ret == -1) |
||||
{ |
||||
perror("read tab_input_registers error") ; |
||||
printf("\n") ; |
||||
fprintf( stderr , "read tab_input_registers error %s " , modbus_strerror(errno)) ; |
||||
} |
||||
|
||||
printf("\n---------- IP is : %s ----------PORT is : %d----------\n" , ipArray[i] , portArray[i]) ; |
||||
printf("\n===================================================================\n") ; |
||||
printf("----------tab_registers value Array :----------\n") ; |
||||
for( int i = 0 ; i < 24 ; i++ ) |
||||
{ |
||||
printf("%d\t" , tab_registers[i]) ; |
||||
} |
||||
printf("\n----------tab_input_registers value Array :----------\n") ; |
||||
for( int i = 0 ; i < 135 ; i++) |
||||
{ |
||||
printf("%d\t" , tab_input_registers[i] ) ; |
||||
} |
||||
printf("\n===================================================================\n") ; |
||||
sleep(1) ; |
||||
} |
||||
} |
||||
return 0 ; |
||||
} |
@ -0,0 +1,172 @@
@@ -0,0 +1,172 @@
|
||||
#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 ; |
||||
} |
||||
|
Loading…
Reference in new issue