| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035 |
- /**
- * @file _modbus_rt.c
- * @brief modbus_rt的pika层的API实现
- * @author SenySunny (senysunny@163.com)
- * @date 2023-05-14
- *
- * @attention
- *
- * <h2><center>© Copyright (c) 2022 Ma Longwei.
- * All rights reserved.</center></h2>
- *
- */
- #include "PikaObj.h"
- #include "PikaStdData_List.h"
- #include "TinyObj.h"
- #include "_modbus_rt__tcp.h"
- #include "modbus_tcp.h"
- #if MODBUS_P2P_ENABLE
- #include "modbus_p2p.h"
- #endif
- void _modbus_rt__tcp___del__(PikaObj *self) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return ;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_del error, dev is NULL.\n");
- return ;
- }
- ret = modbus_tcp_destroy(&dev);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_destroy error, code:%d.\n", ret);
- return ;
- }
- obj_setPtr(self, "dev", NULL);
- #endif
- }
- void _modbus_rt__tcp__init(PikaObj *self, int mode) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- #else
- tcp_modbus_device_t dev = modbus_tcp((modbus_mode_type)mode);
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp create error.\n");
- }
- obj_setInt(self, "mode", mode);
- obj_setPtr(self, "dev", dev);
- #endif
- }
- int _modbus_rt__tcp__set_net(PikaObj *self, char* ip, int port, int type) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_net error, dev is NULL.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_net error, dev is opened.\n");
- return 0;
- }
- if(0 == strlen(ip)) {
- ip = NULL;
- }
- ret = modbus_tcp_set_net(dev, ip, port, type);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_net error, code:%d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__set_ip(PikaObj *self, char* ip) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_ip error, dev is NULL.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_ip error, dev is opened.\n");
- return 0;
- }
- if(0 == strlen(ip)) {
- ip = NULL;
- }
- ret = modbus_tcp_set_ip(dev, ip);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_ip error, code:%d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__set_port(PikaObj *self, int port) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_port error, dev is NULL.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_port error, dev is opened.\n");
- return 0;
- }
- ret = modbus_tcp_set_port(dev, port);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_port error, code:%d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__set_type(PikaObj *self, int type) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_type error, dev is NULL.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_type error, dev is opened.\n");
- return 0;
- }
- ret = modbus_tcp_set_type(dev, type);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_type error, code:%d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__set_p2p(PikaObj *self, int p2p_flag) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return 0;
- #elif (!MODBUS_P2P_ENABLE)
- pika_platform_printf("MODBUS_P2P_ENABLE is not enabled.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
-
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_p2p error, dev is NULL.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_p2p error, dev is opened.\n");
- return 0;
- }
- ret = modbus_tcp_set_p2p_flag(dev, p2p_flag);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_p2p error, code:%d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__open(PikaObj *self) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_open error, dev is NULL.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_open error, dev is opened.\n");
- return 0;
- }
- ret = modbus_tcp_open(dev);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_open error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__isopen(PikaObj *self) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return 0;
- #else
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_isopen error, dev is NULL.\n");
- return 0;
- }
- return modbus_tcp_isopen(dev);
- #endif
- }
- int _modbus_rt__tcp__close(PikaObj *self) {
- #if (!MODBUS_TCP_SLAVE_ENABLE) && (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_close error, dev is NULL.\n");
- return 0;
- }
- if(0 == dev->status) {
- pika_platform_printf("modbus_tcp_close error, dev is closed.\n");
- return 0;
- }
- ret = modbus_tcp_close(dev);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_close error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__slave_set_addr(PikaObj *self, int addr) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_addr error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_set_addr is only for slave.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_addr error, dev is opened.\n");
- return 0;
- }
- ret = modbus_tcp_set_addr(dev,addr);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_addr error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__slave_set_strict(PikaObj *self, int strict) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_strict error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_set_strict is only for slave.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_strict error, dev is opened.\n");
- return 0;
- }
- ret = modbus_tcp_set_strict(dev,strict);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_strict error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__slave_add_block(PikaObj *self, char* name, int type, int addr, int nums) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_add_block error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_add_block is only for slave.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_add_block error, dev is opened.\n");
- return 0;
- }
- if((0 >= strlen(name)) || (0 > type) || (4 < type)){
- pika_platform_printf("modbus_tcp_add_block: the para is error.\n");
- return 0;
- }
- int len = 0;
- if((CIOLS == type) || (INPUTS == type)) {
- len = nums;
- } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
- len = nums * 2;
- }
- obj_setBytes(self, name, NULL, len);
- uint8_t* block = obj_getBytes(self, name);
- ret = modbus_tcp_add_block(dev,type, addr, block, nums);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_add_block error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__slave_regs_binding(PikaObj *self, Arg* regs, int type, int addr, int nums) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- int ret = 0;
- ArgType t = arg_getType(regs);
- if (ARG_TYPE_BYTES != t) {
- pika_platform_printf("modbus_tcp_regs_binding: the regs buf type is only for bytes.\n");
- return 0;
- }
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_regs_binding error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_regs_binding is only for slave.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_regs_binding error, dev is opened.\n");
- return 0;
- }
- size_t regs_size = arg_getBytesSize(regs);
- if((CIOLS == type) || (INPUTS == type)) {
- if(regs_size < nums) {
- pika_platform_printf("modbus_tcp_regs_binding: For CIOLS and INPUTS, the length of regs buf must be greater than nums.\n");
- return 0;
- }
- } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
- if(regs_size < nums) {
- pika_platform_printf("modbus_tcp_regs_binding: For INPUT_REGISTERS and REGISTERS, the length of regs buf must be greater than 2 * nums.\n");
- return 0;
- }
- }
- uint8_t* block = arg_getBytes(regs);
- ret = modbus_tcp_add_block(dev, type, addr, block, nums);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_regs_binding error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- return 0;
- }
- #if (MODBUS_TCP_SLAVE_ENABLE) || (MODBUS_TCP_MASTER_ENABLE)
- PikaEventListener* g_modbus_rt_tcp_event_listener = NULL;
- #endif
- int _modbus_rt__tcp__slave_pre_ans_handler(agile_modbus_t *ctx, int slave, int function,int addr, int quantity) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- char hash_str[32] = {0};
- memset(hash_str, 0, sizeof(hash_str));
- sprintf(hash_str, "pre_ans%p", ctx);
- uint32_t eventId = hash_time33(hash_str);
- Arg* evt_obj_arg = arg_newDirectObj(New_TinyObj);
- PikaObj* evt_obj = arg_getPtr(evt_obj_arg);
- obj_setInt(evt_obj, "slave", slave);
- obj_setInt(evt_obj, "function", function);
- obj_setInt(evt_obj, "addr", addr);
- obj_setInt(evt_obj, "quantity", quantity);
- pika_eventListener_send(g_modbus_rt_tcp_event_listener, eventId, evt_obj_arg);
- return 1;
- #endif
- }
- int _modbus_rt__tcp__slave_set_pre_ans_callback(PikaObj *self, Arg* cb) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_pre_ans_callback error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_set_pre_ans_callback is only for slave.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_pre_ans_callback error, dev is opened.\n");
- return 0;
- }
- if(NULL == cb) {
- pika_platform_printf("modbus_tcp_set_pre_ans_callback error, cb is NULL.\n");
- return 0;
- }
- ret = modbus_tcp_set_pre_ans_callback(dev,_modbus_rt__tcp__slave_pre_ans_handler);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_rtu_set_pre_ans_callback error, code: %d.\n", ret);
- return 0;
- }
- if (NULL == g_modbus_rt_tcp_event_listener) {
- pika_eventListener_init(&g_modbus_rt_tcp_event_listener);
- }
- char hash_str[32] = {0};
- memset(hash_str, 0, sizeof(hash_str));
- sprintf(hash_str, "pre_ans%p", dev->ctx);
- uint32_t eventId = hash_time33(hash_str);
- pika_eventListener_registEventCallback(g_modbus_rt_tcp_event_listener, eventId, cb);
- return 1;
- #endif
- }
- int _modbus_rt__tcp__slave_done_handler(agile_modbus_t *ctx, int slave, int function,int addr, int quantity) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- char hash_str[32] = {0};
- memset(hash_str, 0, sizeof(hash_str));
- sprintf(hash_str, "done%p", ctx);
- uint32_t eventId = hash_time33(hash_str);
- Arg* evt_obj_arg = arg_newDirectObj(New_TinyObj);
- PikaObj* evt_obj = arg_getPtr(evt_obj_arg);
- obj_setInt(evt_obj, "slave", slave);
- obj_setInt(evt_obj, "function", function);
- obj_setInt(evt_obj, "addr", addr);
- obj_setInt(evt_obj, "quantity", quantity);
- pika_eventListener_send(g_modbus_rt_tcp_event_listener, eventId, evt_obj_arg);
- return 1;
- #endif
- }
- int _modbus_rt__tcp__slave_set_done_callback(PikaObj *self, Arg* cb) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_done_callback error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_set_done_callback is only for slave.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_done_callback error, dev is opened.\n");
- return 0;
- }
- if(NULL == cb) {
- pika_platform_printf("modbus_tcp_set_done_callback error, cb is NULL.\n");
- return 0;
- }
- ret = modbus_tcp_set_done_callback(dev,_modbus_rt__tcp__slave_done_handler);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_done_callback error, code: %d.\n", ret);
- return 0;
- }
- if (NULL == g_modbus_rt_tcp_event_listener) {
- pika_eventListener_init(&g_modbus_rt_tcp_event_listener);
- }
- char hash_str[32] = {0};
- memset(hash_str, 0, sizeof(hash_str));
- sprintf(hash_str, "done%p", dev->ctx);
- uint32_t eventId = hash_time33(hash_str);
- pika_eventListener_registEventCallback(g_modbus_rt_tcp_event_listener, eventId, cb);
- return 1;
- #endif
- }
- int _modbus_rt__tcp__slave_set_dev_binding(PikaObj *self, int flag) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #elif (!SLAVE_DATA_DEVICE_BINDING)
- pika_platform_printf("SLAVE_DATA_DEVICE_BINDING is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_dev_binding error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_set_dev_binding is only for slave.\n");
- return 0;
- }
- if(0 != dev->status) {
- pika_platform_printf("modbus_tcp_set_dev_binding error, dev is opened.\n");
- return 0;
- }
- ret = modbus_tcp_set_dev_binding(dev,flag);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_dev_binding error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__master_set_server(PikaObj *self, char* saddr, int sport) {
- #if (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp master is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_set_server error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_MASTER != dev->mode){
- pika_platform_printf("modbus_tcp_set_server is only for master.\n");
- return 0;
- }
- ret = modbus_tcp_set_server(dev, saddr, sport);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_set_server error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- char* _modbus_rt__tcp__master_get_saddr(PikaObj *self) {
- #if (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp master is not activated.\n");
- return NULL;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_get_saddr error, dev is NULL.\n");
- return NULL;
- }
- if((MODBUS_MASTER != dev->mode)){
- pika_platform_printf("modbus_tcp_get_saddr is only for master.\n");
- return NULL;
- }
- char saddr[INET_ADDRSTRLEN];
- ret = modbus_tcp_get_saddr(dev, saddr);
- if(MODBUS_RT_EOK != ret){
- pika_platform_printf("modbus_tcp_get_saddr error, code: %d.\n", ret);
- return NULL;
- }
- char* str = obj_cacheStr(self, saddr);
- return str;
- #endif
- }
- PikaObj* _modbus_rt__tcp__slave_read_regs(PikaObj *self, int type, int addr, PikaTuple* val){
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return NULL;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_read_regs error, dev is NULL.\n");
- return NULL;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_read_regs is only for slave.\n");
- return NULL;
- }
- if(0 == dev->status) {
- pika_platform_printf("modbus_tcp_read_regs error, dev is not opened.\n");
- return 0;
- }
- uint8_t *dest = NULL;
- /* 确保参数正确,且值无误*/
- if(1 != pikaTuple_getSize(val)) {
- pika_platform_printf("modbus_tcp_read_regs: the para num of func is error.\n");
- return NULL;
- }
- Arg* arg_0 = pikaTuple_getArg(val, 0);
- ArgType t = arg_getType(arg_0);
- if (ARG_TYPE_INT != t) {
- pika_platform_printf("modbus_tcp_read_regs: the para type of func is error.\n");
- return NULL;
- }
- int quantity = arg_getInt(arg_0);
- if(0 >= quantity) {
- pika_platform_printf("modbus_tcp_read_regs: quantity can not be zero or negative.\n");
- return NULL;
- }
- if((CIOLS == type) || (INPUTS == type)) {
- dest = modbus_rt_calloc(1,quantity);
- if(dest == NULL) {
- pika_platform_printf("modbus_tcp_read_regs: mem is not enough.\n");
- return NULL;
- }
- } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
- dest = modbus_rt_calloc(1,quantity * 2);
- if(dest == NULL) {
- pika_platform_printf("modbus_tcp_read_regs: mem is not enough.\n");
- return NULL;
- }
- }
- pika_GIL_EXIT();
- ret = modbus_tcp_excuse(dev, MODBUS_READ, type, addr, quantity, dest);
- pika_GIL_ENTER();
- if(MODBUS_RT_EOK != ret) {
- modbus_rt_free(dest);
- pika_platform_printf("modbus_tcp_read_regs: modbus_tcp_excuse error, code: %d.\n", ret);
- return NULL;
- }
- uint16_t *dest_r = (uint16_t *)dest;
- PikaList* list = New_PikaList();
- for(int i = 0; i < quantity; i++ ) {
- if((CIOLS == type) || (INPUTS == type)) {
- pikaList_append(list, arg_newInt(dest[i]));
- } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
- pikaList_append(list, arg_newInt(dest_r[i]));
- }
- }
- modbus_rt_free(dest);
- return list;
- #endif
- }
- int _modbus_rt__tcp__slave_write_regs(PikaObj *self, int type, int addr, PikaTuple* val) {
- #if (!MODBUS_TCP_SLAVE_ENABLE)
- pika_platform_printf("modbus tcp slave is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_write_regs error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_SLAVE != dev->mode){
- pika_platform_printf("modbus_tcp_write_regs is only for master.\n");
- return 0;
- }
- if(0 == dev->status) {
- pika_platform_printf("modbus_tcp_write_regs error, dev is not opened.\n");
- return 0;
- }
- uint8_t *dest = NULL;
- /* 确保参数正确,且值无误*/
- if(2 != pikaTuple_getSize(val)) {
- pika_platform_printf("modbus_tcp_write_regs: the para num of func is error.\n");
- return 0;
- }
- Arg* arg_0 = pikaTuple_getArg(val, 0);
- ArgType t = arg_getType(arg_0);
- if (ARG_TYPE_INT != t) {
- pika_platform_printf("modbus_tcp_write_regs: the para0 type of func is error.\n");
- return 0;
- }
- int quantity = arg_getInt(arg_0);
- if((CIOLS == type) || (INPUTS == type)) {
- dest = modbus_rt_calloc(1,quantity);
- if(dest == NULL) {
- pika_platform_printf("modbus_tcp_write_regs: mem is not enough.\n");
- return 0;
- }
- memset(dest,0,quantity);
- } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
- dest = modbus_rt_calloc(1,quantity * 2);
- if(dest == NULL) {
- pika_platform_printf("modbus_tcp_write_regs: mem is not enough.\n");
- return 0;
- }
- memset(dest,0,quantity * 2);
- }
- Arg* arg_1 = pikaTuple_getArg(val, 1);
- t = arg_getType(arg_1);
- if (ARG_TYPE_OBJECT != t) {
- pika_platform_printf("modbus_tcp_write_regs: the para1 type of func is error.\n");
- return 0;
- }
- PikaObj* _list = arg_getPtr(arg_1);
- int len_list = pikaList_getSize(_list);
- if(len_list > quantity) {
- len_list = quantity;
- }
- if((CIOLS == type) || (INPUTS == type)) {
- for(int i = 0; i < len_list; i++) {
- dest[i] = pikaList_getInt(_list, i);
- }
- pika_GIL_EXIT();
- ret = modbus_tcp_excuse(dev, MODBUS_WRITE, type, addr, quantity, dest);
- pika_GIL_ENTER();
- if(MODBUS_RT_EOK != ret) {
- modbus_rt_free(dest);
- pika_platform_printf("modbus_tcp_write_regs: modbus_tcp_excuse error, code: %d.\n", ret);
- return 0;
- }
- } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
- uint16_t *dest_r = (uint16_t *)dest;
- for(int i = 0; i < len_list; i++){
- dest_r[i] = pikaList_getInt(_list, i);
- }
- pika_GIL_EXIT();
- ret = modbus_tcp_excuse(dev, MODBUS_WRITE, type, addr, quantity, dest_r);
- pika_GIL_ENTER();
- if(MODBUS_RT_EOK != ret) {
- modbus_rt_free(dest);
- pika_platform_printf("modbus_tcp_write_regs: modbus_tcp_excuse error, code: %d.\n", ret);
- return 0;
- }
- }
- modbus_rt_free(dest);
- return 1;
- #endif
- }
- PikaObj* _modbus_rt__tcp__master_read_list(PikaObj *self, int slave, int fuction, int addr, PikaTuple* val) {
- #if (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp master is not activated.\n");
- return NULL;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_read_list error, dev is NULL.\n");
- return NULL;
- }
- if(MODBUS_MASTER != dev->mode){
- pika_platform_printf("modbus_tcp_read_list is only for master.\n");
- return NULL;
- }
- if(0 == dev->status) {
- pika_platform_printf("modbus_tcp_read_list error, dev is not opened.\n");
- return 0;
- }
- uint8_t *dest = NULL;
- /* 确保参数正确,且值无误*/
- if(1 != pikaTuple_getSize(val)) {
- pika_platform_printf("modbus_tcp_read_list: the para num of func is error.\n");
- return NULL;
- }
- Arg* arg_0 = pikaTuple_getArg(val, 0);
- ArgType t = arg_getType(arg_0);
- if (ARG_TYPE_INT != t) {
- pika_platform_printf("modbus_tcp_read_list: the para type of func is error.\n");
- return NULL;
- }
- int quantity = arg_getInt(arg_0);
- if(0 >= quantity) {
- pika_platform_printf("modbus_tcp_read_list: quantity can not be zero or negative.\n");
- return NULL;
- }
- if((AGILE_MODBUS_FC_READ_COILS == fuction) ||(AGILE_MODBUS_FC_READ_DISCRETE_INPUTS == fuction)) {
- dest = modbus_rt_calloc(1,quantity);
- if(dest == NULL) {
- pika_platform_printf("modbus_tcp_read_list: mem is not enough.\n");
- return NULL;
- }
- } else if((AGILE_MODBUS_FC_READ_HOLDING_REGISTERS == fuction) ||(AGILE_MODBUS_FC_READ_INPUT_REGISTERS == fuction)) {
- dest = modbus_rt_calloc(1,quantity * 2);
- if(dest == NULL) {
- pika_platform_printf("modbus_tcp_read_list: mem is not enough.\n");
- return NULL;
- }
- }
- pika_GIL_EXIT();
- ret = modbus_tcp_excuse(dev, slave, fuction, addr, quantity, dest);
- pika_GIL_ENTER();
- if(MODBUS_RT_EOK != ret) {
- modbus_rt_free(dest);
- pika_platform_printf("modbus_tcp_read_list: modbus_tcp_excuse error, code: %d.\n", ret);
- return NULL;
- }
- uint16_t *dest_r = (uint16_t *)dest;
- PikaList* list = New_PikaList();
- for(int i = 0; i < quantity; i++ ) {
- if((AGILE_MODBUS_FC_READ_COILS == fuction) ||(AGILE_MODBUS_FC_READ_DISCRETE_INPUTS == fuction)) {
- pikaList_append(list, arg_newInt(dest[i]));
- } else if((AGILE_MODBUS_FC_READ_HOLDING_REGISTERS == fuction) ||(AGILE_MODBUS_FC_READ_INPUT_REGISTERS == fuction)) {
- pikaList_append(list, arg_newInt(dest_r[i]));
- }
- }
- modbus_rt_free(dest);
- return list;
- #endif
- }
- int _modbus_rt__tcp__master_write_int(PikaObj *self, int slave, int fuction, int addr, PikaTuple* val) {
- #if (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp master is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_write_int error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_MASTER != dev->mode){
- pika_platform_printf("modbus_tcp_write_int is only for master.\n");
- return 0;
- }
- if(0 == dev->status) {
- pika_platform_printf("modbus_tcp_write_int error, dev is not opened.\n");
- return 0;
- }
- /* 确保参数正确,且值无误*/
- if(1 != pikaTuple_getSize(val)) {
- pika_platform_printf("modbus_tcp_write_int: the para num of func is error.\n");
- return 0;
- }
- Arg* arg_0 = pikaTuple_getArg(val, 0);
- ArgType t = arg_getType(arg_0);
- if (ARG_TYPE_INT != t) {
- pika_platform_printf("modbus_tcp_write_int: the para type of func is error.\n");
- return 0;
- }
- int value = arg_getInt(arg_0);
- pika_GIL_EXIT();
- ret = modbus_tcp_excuse(dev, slave, fuction, addr, 1, &value);
- pika_GIL_ENTER();
- if(MODBUS_RT_EOK != ret) {
- pika_platform_printf("modbus_tcp_write_int: modbus_tcp_excuse error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__master_write_list(PikaObj *self, int slave, int fuction, int addr, PikaTuple* val) {
- #if (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp master is not activated.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_write_int error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_MASTER != dev->mode){
- pika_platform_printf("modbus_tcp_write_int is only for master.\n");
- return 0;
- }
- if(0 == dev->status) {
- pika_platform_printf("modbus_tcp_write_int error, dev is not opened.\n");
- return 0;
- }
- uint8_t *dest = NULL;
- /* 确保参数正确,且值无误*/
- if(2 != pikaTuple_getSize(val)) {
- pika_platform_printf("modbus_tcp_write_int: the para num of func is error.\n");
- return 0;
- }
- Arg* arg_0 = pikaTuple_getArg(val, 0);
- ArgType t = arg_getType(arg_0);
- if (ARG_TYPE_INT != t) {
- pika_platform_printf("modbus_tcp_write_int: the para0 type of func is error.\n");
- return 0;
- }
- int quantity = arg_getInt(arg_0);
- if(fuction == AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS) {
- dest = modbus_rt_calloc(1,quantity);
- if(dest == NULL) {
- pika_platform_printf("modbus_tcp_write_int: mem is not enough.\n");
- return 0;
- }
- memset(dest,0,quantity);
- } else if(fuction == AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS) {
- dest = modbus_rt_calloc(1,quantity * 2);
- if(dest == NULL) {
- pika_platform_printf("modbus_tcp_write_int: mem is not enough.\n");
- return 0;
- }
- memset(dest,0,quantity * 2);
- }
- Arg* arg_1 = pikaTuple_getArg(val, 1);
- t = arg_getType(arg_1);
- if (ARG_TYPE_OBJECT != t) {
- pika_platform_printf("modbus_tcp_write_int: the para1 type of func is error.\n");
- return 0;
- }
- PikaObj* _list = arg_getPtr(arg_1);
- int len_list = pikaList_getSize(_list);
- if(len_list > quantity) {
- len_list = quantity;
- }
- if(fuction == AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS) {
- for(int i = 0; i < len_list; i++) {
- dest[i] = pikaList_getInt(_list, i);
- }
- pika_GIL_EXIT();
- ret = modbus_tcp_excuse(dev, slave, fuction, addr, quantity, dest);
- pika_GIL_ENTER();
- if(MODBUS_RT_EOK != ret) {
- modbus_rt_free(dest);
- pika_platform_printf("modbus_tcp_write_int: modbus_tcp_excuse error, code: %d.\n", ret);
- return 0;
- }
- } else if(fuction == AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS) {
- uint16_t *dest_r = (uint16_t *)dest;
- for(int i = 0; i < len_list; i++){
- dest_r[i] = pikaList_getInt(_list, i);
- }
- pika_GIL_EXIT();
- ret = modbus_tcp_excuse(dev, slave, fuction, addr, quantity, dest_r);
- pika_GIL_ENTER();
- if(MODBUS_RT_EOK != ret) {
- modbus_rt_free(dest);
- pika_platform_printf("modbus_tcp_write_int: modbus_tcp_excuse error, code: %d.\n", ret);
- return 0;
- }
- }
- modbus_rt_free(dest);
- return 1;
- #endif
- }
- int _modbus_rt__tcp__master_download(PikaObj *self, int slave, char* file_dev, char* file_master) {
- #if (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp master is not activated.\n");
- return 0;
- #elif (!MODBUS_P2P_ENABLE) || (!MODBUS_P2P_MASTER_ENABLE)
- pika_platform_printf("MODBUS_P2P_ENABLE and MODBUS_P2P_MASTER_ENABLE is not enabled.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_download error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_MASTER != dev->mode){
- pika_platform_printf("modbus_tcp_download is only for master.\n");
- return 0;
- }
- if(0 == dev->status) {
- pika_platform_printf("modbus_tcp_download error, dev is not opened.\n");
- return 0;
- }
- if(0 == dev->p2p_flag) {
- pika_platform_printf("modbus_tcp_download error, p2p_flag is not seted.\n");
- return 0;
- }
- ret = modbus_tcp_excuse_file(dev, slave, MODBUS_WRITE, file_dev, file_master);
- if(MODBUS_RT_EOK != ret) {
- pika_platform_printf("modbus_tcp_download error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
- int _modbus_rt__tcp__master_upload(PikaObj *self, int slave, char* file_dev, char* file_master) {
- #if (!MODBUS_TCP_MASTER_ENABLE)
- pika_platform_printf("modbus tcp master is not activated.\n");
- return 0;
- #elif (!MODBUS_P2P_ENABLE) || (!MODBUS_P2P_MASTER_ENABLE)
- pika_platform_printf("MODBUS_P2P_ENABLE and MODBUS_P2P_MASTER_ENABLE is not enabled.\n");
- return 0;
- #else
- int ret = 0;
- tcp_modbus_device_t dev = (tcp_modbus_device_t)obj_getPtr(self, "dev");
- if(NULL == dev) {
- pika_platform_printf("modbus_tcp_upload error, dev is NULL.\n");
- return 0;
- }
- if(MODBUS_MASTER != dev->mode){
- pika_platform_printf("modbus_tcp_upload is only for master.\n");
- return 0;
- }
- if(0 == dev->status) {
- pika_platform_printf("modbus_tcp_upload error, dev is not opened.\n");
- return 0;
- }
- if(0 == dev->p2p_flag) {
- pika_platform_printf("modbus_tcp_upload error, p2p_flag is not seted.\n");
- return 0;
- }
- ret = modbus_tcp_excuse_file(dev, slave, MODBUS_READ, file_dev, file_master);
- if(MODBUS_RT_EOK != ret) {
- pika_platform_printf("modbus_tcp_upload error, code: %d.\n", ret);
- return 0;
- }
- return 1;
- #endif
- }
|