#include "modbus_handle.h" #include #include #include #include #include #include #include #include #include #include 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_LINK); //设置超时时间为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(10000); 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; } //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 ; }