| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- #include "modbus_handle.h"
- #include <sys/ioctl.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <asm/ioctls.h>
- #include <errno.h>
- #include <termios.h>
- #include <string.h>
- struct rs485_ctrl {
- unsigned short rts_on_send;
- unsigned short rts_after_sent;
- unsigned int delay_rts_before_send;
- unsigned short enabled;
- };
- /// @brief 初始化modbus
- /// @param manger
- /// @param port_name
- /// @param type
- /// @param saddr
- /// @param name
- /// @return
- int g_modbus_init(void* manger,
- const char* port_name,
- unsigned int baud,
- unsigned char type,
- unsigned char saddr,
- const char* name,
- int delay)
- {
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- modbus_manger->port_name = (char*)port_name;
- modbus_manger->baud = baud;
- modbus_manger->type = type;
- modbus_manger->saddr = saddr;
- modbus_manger->delay = delay;
- strcpy(modbus_manger->name,name);
- //初始化
- modbus_manger->mb = modbus_new_rtu(modbus_manger->port_name, modbus_manger->baud,'N', 8, 1);
- printf(modbus_strerror(errno));
- if(modbus_manger->mb == NULL)
- return -1;
- manger = modbus_manger;
- //链接
- int ret = modbus_connect(modbus_manger->mb);
- //if (ret!=0)
- //{
-
- // return -5;
- /* code */
- // }
- //int fd;
- //struct rs485_ctrl ctrl485;
- //fd = modbus_get_socket(modbus_manger->mb);
- //ctrl485.rts_on_send = 0; // It means that DE is at 3.3 volt on send
- //ctrl485.rts_after_sent = 1; // It means that DE is at 0 volt on send
- //ctrl485.delay_rts_before_send = 0; // DE will be active at same time of data
- //ctrl485.enabled = 1;
- //ret = ioctl(fd, TIOCSRS485, &ctrl485);
- //if (ret) {
- // printf("ERROR PORT 1! TIOCSERSETRS485 failed %i\n", ret);
- // return -2;
- //}
- //设置为485模式
- //int nModeType = modbus_rtu_get_rts(modbus_manger->mb);
- //if (nModeType != MODBUS_RTU_RTS_NONE)
- //{
- //}
- //ret = modbus_set_debug(modbus_manger->mb,TRUE);
- ret = 0;//modbus_rtu_set_serial_mode(modbus_manger->mb, MODBUS_RTU_RS485);
- if (ret != 0)
- {
- printf("modbus_rtu_set_serial_mode failed, %s\n", modbus_strerror(errno));
- //return -2;
- /* code */
- }
- //启用RTS模式并同时设置极性
- ret = modbus_rtu_set_rts(modbus_manger->mb, MODBUS_RTU_RTS_NONE);
- if (ret != 0)
- {
- return -3;
- /* code */
- }
- ret =modbus_set_error_recovery(modbus_manger->mb,MODBUS_ERROR_RECOVERY_PROTOCOL);
- //设置超时时间为2S
- struct timeval response_timeout;
- response_timeout.tv_sec = 1;
- response_timeout.tv_usec = 0;
- modbus_set_response_timeout(modbus_manger->mb, 0,800000);
- modbus_set_byte_timeout(modbus_manger->mb,0,50000);
- //modbus_set_response_timeout(modbus_manger->mb,3,100000);
- //初始化锁
- ret = pthread_mutex_init(&modbus_manger->mutex,NULL);
- if (ret!=0)
- {
- return -4;
- /* code */
- }
- return 0;
- }
- /// @brief 写单个寄存器值
- /// @param manger
- /// @param reg
- /// @param data
- /// @return
- int g_modbus_write_reg(void* manger,int saddr,unsigned short reg,unsigned short data)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- if(modbus_manger->delay>0) usleep(30000);
- modbus_set_slave(modbus_manger->mb, saddr);
- ret=modbus_write_register(modbus_manger->mb, reg, data);//06
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret;
- }
- /// @brief 写多个寄存器
- /// @param manger
- /// @param reg
- /// @param size
- /// @param data
- /// @return
- int g_modbus_write_x_reg(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- if(modbus_manger->delay>0) usleep(30000);
- modbus_set_slave(modbus_manger->mb, saddr);
- ret = modbus_write_registers(modbus_manger->mb, reg, size,data);//06
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret ;
- }
- //slave receive
- int g_modbus_receive(void* manger, uint8_t *req)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- ret = modbus_receive(modbus_manger->mb, req);
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret ;
- }
- int g_modbus_reply(void* manger, uint8_t *req, int reqlen, modbus_mapping_t *map)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- ret = modbus_reply(modbus_manger->mb, req, reqlen, map);
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret ;
- }
- int g_modbus_set_slave(void* manger, int saddr)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- ret = modbus_set_slave(modbus_manger->mb, saddr);
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret ;
- }
- /// @brief 读取单个寄存器值
- /// @param manger
- /// @param reg
- /// @param data
- /// @return
- int g_modbus_read_reg(void* manger,int saddr,unsigned short reg,unsigned short *data)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- if(modbus_manger->delay>0) usleep(30000);
- modbus_set_slave(modbus_manger->mb, saddr);
- ret = modbus_read_registers(modbus_manger->mb, reg, 1, data);//0x03
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret;
- }
- /// @brief 读取多个寄存器值
- /// @param manger
- /// @param reg
- /// @param size
- /// @param data
- /// @return
- int g_modbus_read_x_reg(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- if(modbus_manger->delay>0) usleep(30000);
- modbus_set_slave(modbus_manger->mb, saddr);
- ret = modbus_read_registers(modbus_manger->mb, reg, size, data);//0x03
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret ;
- }
- /// @brief 读取多个寄存器值-延时版
- /// @param manger
- /// @param reg
- /// @param size
- /// @param data
- /// @return
- int g_modbus_read_x_reg_delay(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- if(modbus_manger->delay>0) usleep(30000);
- modbus_set_slave(modbus_manger->mb, saddr);
- ret = modbus_read_registers(modbus_manger->mb, reg, size, data);//0x03
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret ;
- }
- /// @brief 释放modbus接口
- /// @param manger
- void g_modbus_deinit(void* manger)
- {
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- modbus_close(modbus_manger->mb);
- modbus_free(modbus_manger->mb);
- pthread_mutex_destroy(&modbus_manger->mutex);
- }
- int g_modbus_set_timeout(void* manger,int timeout_ms)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- ret = modbus_set_response_timeout(modbus_manger->mb, timeout_ms/1000, (timeout_ms%1000)*1000);
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret;
- }
- int g_modbus_get_timeout(void* manger,int *timeout_ms)
- {
- int ret = 0 ;
- uint32_t s,us;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- ret = modbus_get_response_timeout(modbus_manger->mb, &s, &us);
- if(ret==0 && timeout_ms) {
- *timeout_ms = s*1000 + us/1000;
- }
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret;
- }
- //04
- int g_modbus_read_input_reg(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
- {
- int ret = 0 ;
- Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
- pthread_mutex_lock(&modbus_manger->mutex);
- if(modbus_manger->delay>0) usleep(30000);
- modbus_set_slave(modbus_manger->mb, saddr);
- ret = modbus_read_input_registers(modbus_manger->mb, reg, size, data);//0x04
- pthread_mutex_unlock(&modbus_manger->mutex);
- return ret ;
- }
|