chenbin %!s(int64=4) %!d(string=hai) anos
pai
achega
bcd30d26ef

+ 1 - 1
SConscript

@@ -5,7 +5,7 @@ cwd = GetCurrentDir()
 
 src = Glob('src/*.c')
 
-path = cwd
+path = [cwd]
 path += [cwd + '/inc']
 
 if GetDepend(['SMALL_MODBUS_RTOS_HWPORT']):

+ 23 - 15
inc/small_modbus_rtthread.h

@@ -2,10 +2,15 @@
 #define _SMALL_MODBUS_RTTHREAD_H_
 
 #include <rtthread.h>
-#include <rtdevice.h>
 #include "string.h"
 #include "small_modbus.h"
 
+/*
+*modbus port device
+*/
+#define SMALL_MODBUS_RTTHREAD_USE_DEVICDE 
+#ifdef SMALL_MODBUS_RTTHREAD_USE_DEVICDE
+#include <rtdevice.h>
 
 typedef struct _small_modbus_port_device   small_modbus_port_device_t;
 
@@ -21,6 +26,21 @@ struct _small_modbus_port_device
   int 		(*rts_set)(int on);
 };
 
+int modbus_port_device_init(small_modbus_port_device_t *port,const char *device_name);
+small_modbus_port_device_t *modbus_port_device_create(const char *device_name);
+small_modbus_port_device_t *modbus_port_device_get(small_modbus_t *smb);
+
+int modbus_set_rts(small_modbus_t *smb,int (*rts_set)(int on));
+int modbus_set_serial_config(small_modbus_t *smb,struct serial_configure *serial_config);
+int modbus_set_oflag(small_modbus_t *smb,int oflag);
+
+#endif
+
+/*
+*modbus port socket
+*/
+//#define SMALL_MODBUS_RTTHREAD_USE_SOCKET
+#ifdef SMALL_MODBUS_RTTHREAD_USE_SOCKET
 
 typedef struct _small_modbus_port_socket   small_modbus_port_socket_t;
 
@@ -34,24 +54,12 @@ struct _small_modbus_port_socket
 	int32_t     socket_fd;
 };
 
-/*
-*modbus port device
-*/
-int modbus_port_device_init(small_modbus_port_device_t *port,const char *device_name);
-small_modbus_port_device_t *modbus_port_device_create(const char *device_name);
-small_modbus_port_device_t *modbus_port_device_get(small_modbus_t *smb);
-
-int modbus_set_rts(small_modbus_t *smb,int (*rts_set)(int on));
-int modbus_set_serial_config(small_modbus_t *smb,struct serial_configure *serial_config);
-int modbus_set_oflag(small_modbus_t *smb,int oflag);
-
-/*
-*modbus port socket
-*/
 int modbus_port_socket_init(small_modbus_port_socket_t *port,char *hostname,char *hostport);
 small_modbus_port_socket_t *modbus_port_socket_create(char *hostname,char *hostport);
 small_modbus_port_socket_t *modbus_port_socket_get(small_modbus_t *smb);
 
+#endif
+
 /*
 *modbus_init
 */

+ 5 - 0
inc/small_modbus_utils.h

@@ -21,6 +21,11 @@ void modbus_coil_m2h(uint8_t *des,uint8_t *src,int coil_num);
 void modbus_reg_h2m(void *dest_modbus_reg,void *source_host,int reg_num);
 void modbus_reg_m2h(void *dest_host,void *source_modbus_reg,int reg_num);
 
+int dio_get_val(uint8_t *array,uint16_t index);
+void dio_set_val(uint8_t *array,uint16_t index,int status);
+int aio_get_val(uint16_t *array,uint16_t index);
+void aio_set_val(uint8_t *array,uint16_t index,int status);
+
 void modbus_set_bits_from_byte(uint8_t *dest, int idx, const uint8_t value);
 void modbus_set_bits_from_bytes(uint8_t *dest, int idx, unsigned int nb_bits,
                                        const uint8_t *tab_byte);

+ 10 - 56
src/small_modbus_rtthread.c

@@ -24,6 +24,12 @@ int _modbus_debug(small_modbus_t *smb,int level,const char *fmt, ...)
 	return 0;
 }
 
+
+/*
+*modbus port device
+*/
+#ifdef SMALL_MODBUS_RTTHREAD_USE_DEVICDE
+
 static rt_err_t _modbus_rtdevice_rx_indicate(rt_device_t dev, rt_size_t size)
 {
 	small_modbus_port_device_t *smb_port_device = dev->user_data;
@@ -114,19 +120,6 @@ static int _modbus_rtdevice_wait(small_modbus_t *smb,int timeout)
 	}
 	return rc;
 }
-/*
-*modbus port device
-*/
-//small_modbus_port_t _port_device_default = 
-//{
-//	.type = MODBUS_PORT_DEVICE,
-//	.open = _modbus_rtdevice_open,
-//	.close = _modbus_rtdevice_close,
-//	.read = _modbus_rtdevice_read,
-//	.write = _modbus_rtdevice_write,
-//	.flush = _modbus_rtdevice_flush,
-//	.wait = _modbus_rtdevice_wait
-//};
 int modbus_port_device_init(small_modbus_port_device_t *port,const char *device_name)
 {
 	//rt_memcpy(&port->base,&_port_device_default,sizeof(small_modbus_port_t));
@@ -198,20 +191,13 @@ int modbus_set_oflag(small_modbus_t *smb,int oflag)
 	return 0;
 }
 
+#endif
 
 /*
 *modbus port socket
 */
-//small_modbus_port_t _port_socket_default = 
-//{
-//	.type = MODBUS_PORT_SOCKET,
-//	.open = _modbus_rtdevice_open,
-//	.close = _modbus_rtdevice_close,
-//	.read = _modbus_rtdevice_read,
-//	.write = _modbus_rtdevice_write,
-//	.flush = _modbus_rtdevice_flush,
-//	.wait = _modbus_rtdevice_wait
-//};
+#ifdef SMALL_MODBUS_RTTHREAD_USE_SOCKET
+
 int modbus_port_socket_init(small_modbus_port_socket_t *port,char *hostname,char *hostport)
 {
 //	rt_memcpy(&port->base,&_port_socket_default,sizeof(small_modbus_port_t));
@@ -253,6 +239,7 @@ small_modbus_port_socket_t * modbus_port_socket_get(small_modbus_t *smb)
 	return NULL;
 }
 
+#endif
 
 /*
 *modbus_init
@@ -303,36 +290,3 @@ small_modbus_t *modbus_create(uint8_t core_type,void *port)
 	return NULL;
 }
 
-//int modbus_rtu_init(small_modbus_t *smb,void *port)
-//{
-//	small_modbus_port_t *smb_port;
-//	if(smb&&port)
-//	{
-//		_modbus_init(smb);
-//		smb->core = (small_modbus_core_t*)&_modbus_rtu_core;
-//		
-//		smb_port = port;
-//		if((smb_port->type == MODBUS_PORT_DEVICE)||(smb_port->type == MODBUS_PORT_SOCKET))
-//		{
-//			smb->port = smb_port;
-//		}
-//	}
-//	return 0;
-//}
-//int modbus_tcp_init(small_modbus_t *smb,void *port)
-//{
-//	small_modbus_port_t *smb_port;
-//	if(smb&&port)
-//	{
-//		_modbus_init(smb);
-//		smb->core = (small_modbus_core_t*)&_modbus_tcp_core;
-//		
-//		smb_port = port;
-//		if((smb_port->type == MODBUS_PORT_DEVICE)||(smb_port->type == MODBUS_PORT_SOCKET))
-//		{
-//			smb->port = smb_port;
-//		}
-//	}
-//	return 0;
-//}
-

+ 32 - 0
src/small_modbus_utils.c

@@ -185,6 +185,38 @@ void modbus_reg_m2h(void *dest_host,void *source_modbus_reg,int reg_num)
 	}while(--reg_num);
 }
 
+
+int dio_get_val(uint8_t *array,uint16_t index)
+{
+	uint8_t offset_bit = (index & 0x07); //(index%8);  //
+	uint8_t offset_arr = (index >> 0x03); //(index/8);  //
+	return (array[offset_arr] & (0x01 << offset_bit))?1:0;
+}
+
+void dio_set_val(uint8_t *array,uint16_t index,int status)
+{
+	uint8_t offset_bit = (index & 0x07); //(index%8);  //
+	uint8_t offset_arr = (index >> 0x03); //(index/8);  //
+	if(status)
+	{
+		array[offset_arr] |= (0x01 << offset_bit);
+	}else
+	{
+		array[offset_arr] &= ~(0x01 << offset_bit);
+	}
+}
+
+int aio_get_val(uint16_t *array,uint16_t index)
+{
+	return array[index];
+}
+
+void aio_set_val(uint8_t *array,uint16_t index,int status)
+{
+	array[index] = status;
+}
+
+
 static inline uint16_t bswap_16(uint16_t x)
 {
     return (x >> 8) | (x << 8);

+ 31 - 10
test/test_modbus_rtu_matser.c

@@ -7,7 +7,7 @@ static small_modbus_t modbus_master = {0};
 //#define MODBUS_PRINTF(...) 
 #define MODBUS_PRINTF(...)   modbus_debug((&modbus_master),__VA_ARGS__)
 
-static int uart4_rts(int on)
+static int uart_rts(int on)
 {
 	board_uart_dir(4,on);
 	return 0;
@@ -30,25 +30,31 @@ static void test_modbus_rtu_master_thread(void *param)
 	serial_config.parity = PARITY_NONE;
 	modbus_set_serial_config(smb_master,&serial_config);  //config serial 
 	
-	modbus_set_rts(smb_master,uart4_rts);
+	modbus_set_rts(smb_master,uart_rts);
 	
-	//modbus_set_oflag(&modbus_slave,RT_DEVICE_FLAG_INT_RX);
-	modbus_set_oflag(smb_master,RT_DEVICE_FLAG_DMA_RX);
+	modbus_set_oflag(smb_master,RT_DEVICE_FLAG_INT_RX);
+	//modbus_set_oflag(smb_master,RT_DEVICE_FLAG_DMA_RX);
 	
 	modbus_connect(smb_master);
 	rt_kprintf("modbus master\n");
 	
 	int count_ok = 0;
 	int count_err = 0;
+	int index = 0;
 	while (1)
 	{
 		rt_thread_mdelay(30);
 		modbus_error_recovery(smb_master);
 		modbus_set_slave(smb_master, 1);
-		rc = modbus_read_input_bits(smb_master, 0, 8, temp_buff); // modbus_read_input_bits
+		rc = modbus_read_input_bits(smb_master, 10000, 8, temp_buff); // modbus_read_input_bits
 		rt_kprintf("modbus_read_input_bits:%d\n",rc);
 		if(rc >= MODBUS_OK)
 		{
+			for(index = 0; index <8;index++)
+			{
+				rt_kprintf("[%d]",dio_get_val(temp_buff,index));
+			}
+			rt_kputs("\n\r");
 			count_ok++;
 		}else
 		{
@@ -58,7 +64,7 @@ static void test_modbus_rtu_master_thread(void *param)
 		rt_thread_mdelay(30);
 		modbus_error_recovery(smb_master);
 		modbus_set_slave(smb_master, 1);
-		rc = modbus_write_bits(smb_master, 0 , 8, temp_buff); // modbus_write_bits
+		rc = modbus_write_bits(smb_master, 00000 , 8, temp_buff); // modbus_write_bits
 		rt_kprintf("modbus_write_bits:%d\n",rc);
 		if(rc >= MODBUS_OK)
 		{
@@ -71,10 +77,15 @@ static void test_modbus_rtu_master_thread(void *param)
 		rt_thread_mdelay(30);
 		modbus_error_recovery(smb_master);
 		modbus_set_slave(smb_master, 1);
-		rc = modbus_read_bits(smb_master, 0 , 8, temp_buff); // modbus_read_bits
+		rc = modbus_read_bits(smb_master, 00000 , 8, temp_buff); // modbus_read_bits
 		rt_kprintf("modbus_read_bits:%d\n",rc);
 		if(rc >= MODBUS_OK)
 		{
+			for(index = 0; index <8;index++)
+			{
+				rt_kprintf("[%d]",dio_get_val(temp_buff,index));
+			}
+			rt_kputs("\n\r");
 			count_ok++;
 		}else
 		{
@@ -85,10 +96,15 @@ static void test_modbus_rtu_master_thread(void *param)
 		rt_thread_mdelay(30);
 		modbus_error_recovery(smb_master);
 		modbus_set_slave(smb_master, 1);
-		rc = modbus_read_input_registers(smb_master, 0 , 8, (uint16_t*)temp_buff);  // modbus_read_input_registers
+		rc = modbus_read_input_registers(smb_master, 30000 , 8, (uint16_t*)temp_buff);  // modbus_read_input_registers
 		rt_kprintf("modbus_read_input_registers:%d\n",rc);
 		if(rc >= MODBUS_OK)
 		{
+			for(index = 0; index <8;index++)
+			{
+				rt_kprintf("[%d]",aio_get_val((uint16_t*)temp_buff,index));
+			}
+			rt_kputs("\n\r");
 			count_ok++;
 		}else
 		{
@@ -98,7 +114,7 @@ static void test_modbus_rtu_master_thread(void *param)
 		rt_thread_mdelay(30);
 		modbus_error_recovery(smb_master);
 		modbus_set_slave(smb_master, 1);
-		rc = modbus_write_registers(smb_master, 0 , 8, (uint16_t*)temp_buff); // modbus_write_registers
+		rc = modbus_write_registers(smb_master, 40000 , 8, (uint16_t*)temp_buff); // modbus_write_registers
 		rt_kprintf("modbus_write_registers:%d\n",rc);
 		if(rc >= MODBUS_OK)
 		{
@@ -111,10 +127,15 @@ static void test_modbus_rtu_master_thread(void *param)
 		rt_thread_mdelay(30);
 		modbus_error_recovery(smb_master);
 		modbus_set_slave(smb_master, 1);
-		rc = modbus_read_registers(smb_master, 0 , 8, (uint16_t*)temp_buff); // modbus_read_registers
+		rc = modbus_read_registers(smb_master, 40000 , 8, (uint16_t*)temp_buff); // modbus_read_registers
 		rt_kprintf("modbus_read_registers:%d\n",rc);
 		if(rc >= MODBUS_OK)
 		{
+			for(index = 0; index <8;index++)
+			{
+				rt_kprintf("[%d]",aio_get_val((uint16_t*)temp_buff,index));
+			}
+			rt_kputs("\n\r");
 			count_ok++;
 		}else
 		{

+ 19 - 18
test/test_modbus_rtu_slave.c

@@ -13,57 +13,57 @@ static small_modbus_t modbus_slave = {0};
 //#define MODBUS_PRINTF(...) 
 #define MODBUS_PRINTF(...)   modbus_debug((&modbus_slave),__VA_ARGS__)
 
-//浠庢満鍥炶皟鍑芥暟,褰撲粠鏈烘帴鏀跺埌涓绘満鐨勮�姹�(鏁版嵁鏍¢獙鍜屽湴鍧€鍔熻兘鐮佸凡缁忚В鏋愬畬),鍦ㄨ繖涓�洖璋冨嚱鏁板唴濉�厖鏁版嵁锛岃繑鍥炴暟鎹�殑闀垮害鍗冲彲
+//从机回调函数,当从机接收到主机的请求(数据校验和地址功能码已经解析完),在这个回调函数内填充数据,返回数据的长度即可
 static int test_modbus_rtu_slave_callback(small_modbus_t *smb,int function_code,int addr,int num,void *read_write_data)
 {
 	int rc = 0;
 	switch(function_code)
 	{
-		case MODBUS_FC_READ_HOLDING_COILS:	//璇诲彇淇濇寔绾垮湀,1bit浠h〃涓€涓�嚎鍦�
+		case MODBUS_FC_READ_HOLDING_COILS:	//读取保持线圈,1bit代表一个线圈
 		{
-			if((0 <= addr)&&(addr < 10000))	//鍦板潃鏄犲皠锛屽湴鍧€浠�0寮€濮�
+			if((0 <= addr)&&(addr < 10000))	//地址映射,地址从0开始
 			{
 				rc = rt_device_read(bio_dev,DO_MASK+addr,read_write_data,num);  
 			}
 		}break;
-		case MODBUS_FC_READ_INPUTS_COILS:	//璇诲彇鍙��绾垮湀,1bit浠h〃涓€涓�嚎鍦�
+		case MODBUS_FC_READ_INPUTS_COILS:	//读取只读线圈,1bit代表一个线圈
 		{
-			if((10000 <= addr)&&(addr < 20000)) //鍦板潃鏄犲皠锛屽湴鍧€浠�10000寮€濮�
+			if((10000 <= addr)&&(addr < 20000)) //地址映射,地址从10000开始
 			{
 				addr = addr - 10000;
 				rc = rt_device_read(bio_dev,DI_MASK+addr,read_write_data,num);  
 			}
 		}break;
-		case MODBUS_FC_READ_HOLDING_REGISTERS:	//璇诲彇淇濇寔瀵勫瓨鍣�,16bit浠h〃涓€涓�瘎瀛樺櫒
+		case MODBUS_FC_READ_HOLDING_REGISTERS:	//读取保持寄存器,16bit代表一个寄存器
 		{
-			if((20000 <= addr)&&(addr < 30000)) //鍦板潃鏄犲皠锛屽湴鍧€浠�20000寮€濮�
+			if((40000 <= addr)&&(addr < 50000)) //地址映射,地址从40000开始
 			{
-				addr = addr - 20000;
+				addr = addr - 40000;
 				rc = rt_device_read(bio_dev,AO_MASK+addr,read_write_data,num);  
 			}
 		}break;
-		case MODBUS_FC_READ_INPUT_REGISTERS:	//璇诲彇杈撳叆瀵勫瓨鍣�,16bit浠h〃涓€涓�瘎瀛樺櫒
+		case MODBUS_FC_READ_INPUT_REGISTERS:	//读取输入寄存器,16bit代表一个寄存器
 		{
-			if((30000 <= addr)&&(addr < 40000)) //鍦板潃鏄犲皠锛屽湴鍧€浠�30000寮€濮�
+			if((30000 <= addr)&&(addr < 40000)) //地址映射,地址从30000开始
 			{
 				addr = addr - 30000;
 				rc = rt_device_read(bio_dev,AI_MASK+addr,read_write_data,num);  
 			}
 		}break;
-		case MODBUS_FC_WRITE_SINGLE_COIL:	//鍐欏崟涓�嚎鍦�,1bit浠h〃涓€涓�嚎鍦�
-		case MODBUS_FC_WRITE_MULTIPLE_COILS:		//鍐欑嚎鍦�,1bit浠h〃涓€涓�嚎鍦�
+		case MODBUS_FC_WRITE_SINGLE_COIL:	//写单个线圈,1bit代表一个线圈
+		case MODBUS_FC_WRITE_MULTIPLE_COILS:		//写线圈,1bit代表一个线圈
 		{
-			if((0 <= addr)&&(addr < 10000))	//鍦板潃鏄犲皠锛屽湴鍧€浠�0寮€濮�
+			if((0 <= addr)&&(addr < 10000))	//地址映射,地址从0开始
 			{
 				rc = rt_device_write(bio_dev,DO_MASK+addr,read_write_data,num);
 			}
 		}break;
-		case MODBUS_FC_WRITE_SINGLE_REGISTER:	//鍐欏崟涓�瘎瀛樺櫒,16bit浠h〃涓€涓�瘎瀛樺櫒
-		case MODBUS_FC_WRITE_MULTIPLE_REGISTERS:	//鍐欏瘎瀛樺櫒,16bit浠h〃涓€涓�瘎瀛樺櫒
+		case MODBUS_FC_WRITE_SINGLE_REGISTER:	//写单个寄存器,16bit代表一个寄存器
+		case MODBUS_FC_WRITE_MULTIPLE_REGISTERS:	//写寄存器,16bit代表一个寄存器
 		{	
-			if((20000 <= addr)&&(addr < 30000))	//鍦板潃鏄犲皠锛屽湴鍧€浠�20000寮€濮�
+			if((40000 <= addr)&&(addr < 50000))	//地址映射,地址从40000开始
 			{
-				addr = addr - 20000;
+				addr = addr - 40000;
 				rc = rt_device_write(bio_dev,AO_MASK+addr,read_write_data,num);
 			}
 		}break;
@@ -77,7 +77,8 @@ static int test_modbus_rtu_slave_callback(small_modbus_t *smb,int function_code,
 
 static int uart_rts(int on)
 {
-	board_uart_dir(4,on);//rts璁剧疆
+	board_uart_dir(4,on);//rts设置
+	board_led_set(1,on);//led 状态
 	return 0;
 }
 

+ 44 - 40
test/test_modbus_rtu_slave_netdevice.c

@@ -73,8 +73,8 @@ typedef enum
 	
 	NETSOCKET_CMD_HOSTNAME_SET =			0x21,
 	NETSOCKET_CMD_HOSTNAME_GET =			0x22,
-	NETSOCKET_CMD_HOSTPORT_SET =			0x23,
-	NETSOCKET_CMD_HOSTPORT_GET =			0x24,
+	NETSOCKET_CMD_PORTNAME_SET =			0x23,
+	NETSOCKET_CMD_PORTNAME_GET =			0x24,
 }netsocket_cmd_t;
 
 typedef union
@@ -101,7 +101,7 @@ static void netdevice_config_init(void)
 	val = NETSOCKET_PROTOCOL_TCP;
 	rt_device_control(socket0_dev,NETSOCKET_CMD_PROTOCOL_SET,&val);
 	
-	val = NETSOCKET_TYPE_SERVER;
+	val = NETSOCKET_TYPE_SERVER;  //服务端
 	rt_device_control(socket0_dev,NETSOCKET_CMD_TYPE_SET,&val);
 	
 	ip_addr_t ip;
@@ -118,8 +118,6 @@ static void netdevice_config_init(void)
 	rt_device_control(socket0_dev,NETSOCKET_CMD_SPORT_SET,&port);
 }
 
-
-
 #define DO_MASK		0x10000000
 #define DI_MASK		0x20000000
 #define AO_MASK		0x40000000
@@ -130,54 +128,60 @@ static small_modbus_t modbus_slave = {0};
 //#define MODBUS_PRINTF(...) 
 #define MODBUS_PRINTF(...)   modbus_debug((&modbus_slave),__VA_ARGS__)
 
-static uint8_t temp_buff[256];
 
+//从机回调函数,当从机接收到主机的请求(数据校验和地址功能码已经解析完),在这个回调函数内填充数据,返回数据的长度即可
 static int test_modbus_rtu_slave_callback(small_modbus_t *smb,int function_code,int addr,int num,void *read_write_data)
 {
 	int rc = 0;
 	switch(function_code)
 	{
-		case MODBUS_FC_READ_HOLDING_COILS:
-		{
-			rc = rt_device_read(bio_dev,DO_MASK+addr,temp_buff,num);
-			rc = modbus_array2bit(read_write_data, temp_buff, rc);
-		}break;
-		case MODBUS_FC_READ_INPUTS_COILS:
+		case MODBUS_FC_READ_HOLDING_COILS:	//读取保持线圈,1bit代表一个线圈
 		{
-			rc = rt_device_read(bio_dev,DI_MASK+addr,temp_buff,num);
-			rc = modbus_array2bit(read_write_data, temp_buff, rc);
+			if((0 <= addr)&&(addr < 10000))	//地址映射,地址从0开始
+			{
+				rc = rt_device_read(bio_dev,DO_MASK+addr,read_write_data,num);  
+			}
 		}break;
-		case MODBUS_FC_READ_HOLDING_REGISTERS:
+		case MODBUS_FC_READ_INPUTS_COILS:	//读取只读线圈,1bit代表一个线圈
 		{
-			rc = rt_device_read(bio_dev,AO_MASK+addr,temp_buff,num);
-			rc = modbus_array2reg(read_write_data, temp_buff, rc);
+			if((10000 <= addr)&&(addr < 20000)) //地址映射,地址从10000开始
+			{
+				addr = addr - 10000;
+				rc = rt_device_read(bio_dev,DI_MASK+addr,read_write_data,num);  
+			}
 		}break;
-		case MODBUS_FC_READ_INPUT_REGISTERS:
+		case MODBUS_FC_READ_HOLDING_REGISTERS:	//读取保持寄存器,16bit代表一个寄存器
 		{
-			rc = rt_device_read(bio_dev,AI_MASK+addr,temp_buff,num);
-			rc = modbus_array2reg(read_write_data, temp_buff, rc);
+			if((40000 <= addr)&&(addr < 50000)) //地址映射,地址从40000开始
+			{
+				addr = addr - 40000;
+				rc = rt_device_read(bio_dev,AO_MASK+addr,read_write_data,num);  
+			}
 		}break;
-		
-		case MODBUS_FC_WRITE_SINGLE_COIL:
+		case MODBUS_FC_READ_INPUT_REGISTERS:	//读取输入寄存器,16bit代表一个寄存器
 		{
-			uint8_t value1 = num?1:0;
-			rc = rt_device_write(bio_dev,DO_MASK+addr,&value1,1);
+			if((30000 <= addr)&&(addr < 40000)) //地址映射,地址从30000开始
+			{
+				addr = addr - 30000;
+				rc = rt_device_read(bio_dev,AI_MASK+addr,read_write_data,num);  
+			}
 		}break;
-		case MODBUS_FC_WRITE_SINGLE_REGISTER:
+		case MODBUS_FC_WRITE_SINGLE_COIL:	//写单个线圈,1bit代表一个线圈
+		case MODBUS_FC_WRITE_MULTIPLE_COILS:		//写线圈,1bit代表一个线圈
 		{
-			uint16_t value2 = num;
-			rc = rt_device_write(bio_dev,AO_MASK+addr,&value2,1);
+			if((0 <= addr)&&(addr < 10000))	//地址映射,地址从0开始
+			{
+				rc = rt_device_write(bio_dev,DO_MASK+addr,read_write_data,num);
+			}
 		}break;
-		
-		case MODBUS_FC_WRITE_MULTIPLE_COILS:
-		{
-			rc = modbus_bit2array(temp_buff,read_write_data,num);
-			rc = rt_device_write(bio_dev,DO_MASK+addr,temp_buff,num);
-		}break;
-		case MODBUS_FC_WRITE_MULTIPLE_REGISTERS:
-		{
-			rc = modbus_reg2array(temp_buff,read_write_data,num);
-			rc = rt_device_write(bio_dev,AO_MASK+addr,temp_buff,num);
+		case MODBUS_FC_WRITE_SINGLE_REGISTER:	//写单个寄存器,16bit代表一个寄存器
+		case MODBUS_FC_WRITE_MULTIPLE_REGISTERS:	//写寄存器,16bit代表一个寄存器
+		{	
+			if((40000 <= addr)&&(addr < 50000))	//地址映射,地址从40000开始
+			{
+				addr = addr - 40000;
+				rc = rt_device_write(bio_dev,AO_MASK+addr,read_write_data,num);
+			}
 		}break;
 	}	
 	if(rc<0)
@@ -193,6 +197,9 @@ static void test_modbus_rtu_slave_thread(void *param)
 	int count = 0;
 	small_modbus_t *smb_slave = param;
 	
+	bio_dev = rt_device_find("bio");
+	rt_device_open(bio_dev,0);
+	
 	netdevice_config_init();
 	
 	modbus_init(smb_slave,MODBUS_CORE_RTU,modbus_port_device_create("socket0")); // init modbus  RTU mode
@@ -223,9 +230,6 @@ int test_modbus_rtu_slave_netdevice(void)
 {
 	rt_thread_t tid;
 	
-	bio_dev = rt_device_find("bio");
-	rt_device_open(bio_dev,0);
-	
 	tid = rt_thread_create("slave1",test_modbus_rtu_slave_thread, &modbus_slave,2048,20, 10);
 	if (tid != RT_NULL)
 			rt_thread_startup(tid);