/* * modbus.c * * Change Logs: * Date Author Notes * 2024-04-02 qiyongzhong first version */ #include #include #include "modbus.h" #include "modbus_cvt.h" #include "modbus_port.h" #ifdef MB_USING_RAW_PRT static void mb_raw_prt(bool is_send, const u8 *pdata, int dlen)//原始数据打印 { MB_PRINTF("%s", is_send ? ">>" : "<<"); for (int i=0; isaddr = MB_RTU_ADDR_DEF; hinst->prot = (type == MB_BACKEND_TYPE_RTU) ? MB_PROT_RTU : MB_PROT_TCP; hinst->tid = 0; hinst->backend = backend; #ifdef MB_USING_SLAVE extern const mb_cb_table_t mb_cb_table; hinst->cb = (mb_cb_table_t *)&mb_cb_table; #else hinst->cb = NULL; #endif return(hinst); } //销毁modbus实例 void mb_destory(mb_inst_t *hinst) { MB_ASSERT(hinst != NULL); if (hinst->backend != NULL) { mb_backend_destory(hinst->backend); hinst->backend = NULL; } free(hinst); } //修改从机地址, 默认地址为1 void mb_set_slave(mb_inst_t *hinst, u8 saddr) { MB_ASSERT(hinst != NULL); hinst->saddr = saddr; } //修改协议, 默认使用与后端类型一致的协议类型 void mb_set_prot(mb_inst_t *hinst, mb_prot_t prot) { MB_ASSERT(hinst != NULL); hinst->prot = prot; } //修改超时时间, 默认应答超时300ms, 字节超时32ms void mb_set_tmo(mb_inst_t *hinst, int ack_tmo_ms, int byte_tmo_ms) { MB_ASSERT(hinst != NULL); MB_ASSERT(hinst->backend != NULL); mb_backend_config(hinst->backend, ack_tmo_ms, byte_tmo_ms); } //建立连接, 成功返回0, 失败返回-1 int mb_connect(mb_inst_t *hinst) { MB_ASSERT(hinst != NULL); MB_ASSERT(hinst->backend != NULL); return(mb_backend_open(hinst->backend)); } //断开连接, 成功返回0, 失败返回-1 int mb_disconn(mb_inst_t *hinst) { MB_ASSERT(hinst != NULL); MB_ASSERT(hinst->backend != NULL); return(mb_backend_close(hinst->backend)); } int mb_recv(mb_inst_t *hinst, u8 *buf, int bufsize) { MB_ASSERT(hinst != NULL); MB_ASSERT(hinst->backend != NULL); MB_ASSERT(buf != NULL); MB_ASSERT(bufsize > 0); int len = mb_backend_read(hinst->backend, buf, bufsize); if (len < 0)//发生错误, 关闭后端 { mb_backend_close(hinst->backend); } #ifdef MB_USING_RAW_PRT if (len > 0) { mb_raw_prt(false, buf, len); } #endif return(len); } int mb_send(mb_inst_t *hinst, u8 *buf, int size) { MB_ASSERT(hinst != NULL); MB_ASSERT(hinst->backend != NULL); MB_ASSERT(buf != NULL); MB_ASSERT(size > 0); int len = mb_backend_write(hinst->backend, buf, size); if (len < 0)//发生错误, 关闭后端 { mb_backend_close(hinst->backend); } #ifdef MB_USING_RAW_PRT if (len > 0) { mb_raw_prt(true, buf, len); } #endif return(len); } //清空接收缓存, 成功返回0, 失败返回-1 int mb_flush(mb_inst_t *hinst) { MB_ASSERT(hinst != NULL); MB_ASSERT(hinst->backend != NULL); return(mb_backend_flush(hinst->backend)); }