From 600950381e672040bf3ba9422fabab0221b804e2 Mon Sep 17 00:00:00 2001 From: pikastech Date: Mon, 19 Sep 2022 13:27:20 +0800 Subject: [PATCH] modebus rtu_master test ok --- examples/modbus/rtu_master.py | 13 +++ package/modbus/_modbus.c | 69 ++++++------ package/modbus/_modbus.pyi | 30 ++--- package/modbus/modbus.py | 106 ++++++++++++------ port/linux/package/pikascript/_modbus.pyi | 30 ++--- port/linux/package/pikascript/modbus.py | 106 ++++++++++++------ .../pikascript-lib/modbus/_modbus.c | 69 ++++++------ port/linux/test/VM-test.cpp | 30 +++++ port/linux/test/module-test.cpp | 23 ++++ port/linux/test/python/modbus/rtu_master.py | 13 +++ 10 files changed, 327 insertions(+), 162 deletions(-) create mode 100644 examples/modbus/rtu_master.py create mode 100644 port/linux/test/python/modbus/rtu_master.py diff --git a/examples/modbus/rtu_master.py b/examples/modbus/rtu_master.py new file mode 100644 index 000000000..0852beacd --- /dev/null +++ b/examples/modbus/rtu_master.py @@ -0,0 +1,13 @@ +import modbus + +mb_tcp = modbus.ModBusRTU(128, 128) +mb_tcp.setSlave(1) + +send_buff = mb_tcp.serializeReadRegisters(0, 10) + +host_regists = mb_tcp.deserializeReadRegisters( + b'\x01\x03\x14\x00\x00\x00\x00\x04\xD2\x00\x00\x00\x00\x00\x7B\x00\x00\x00\x00\x00\x00\x00\x00\xE5\x0B' +) + +print(send_buff) +print(host_regists) diff --git a/package/modbus/_modbus.c b/package/modbus/_modbus.c index d23dc6a5a..897ef8c00 100644 --- a/package/modbus/_modbus.c +++ b/package/modbus/_modbus.c @@ -5,14 +5,14 @@ void _modbus__ModBus___init__rtu(PikaObj* self, int sendBUffSize, int readBuffSize) { agile_modbus_rtu_t ctx_rtu = {0}; - agile_modbus_t* ctx = &ctx_rtu._ctx; obj_setBytes(self, "sendBuff", NULL, sendBUffSize); obj_setBytes(self, "readBuff", NULL, readBuffSize); agile_modbus_rtu_init(&ctx_rtu, obj_getBytes(self, "sendBuff"), sendBUffSize, obj_getBytes(self, "readBuff"), readBuffSize); obj_setStruct(self, "ctx_rtu", ctx_rtu); - obj_setPtr(self, "ctx", ctx); + agile_modbus_rtu_t* ctx_rtu_heap = obj_getStruct(self, "ctx_rtu"); + obj_setPtr(self, "ctx", &ctx_rtu_heap->_ctx); } void _modbus__ModBus_setSlave(PikaObj* self, int slave) { @@ -24,14 +24,14 @@ void _modbus__ModBus___init__tcp(PikaObj* self, int sendBuffSize, int readBuffSize) { agile_modbus_tcp_t ctx_tcp = {0}; - agile_modbus_t* ctx = &ctx_tcp._ctx; obj_setBytes(self, "sendBuff", NULL, sendBuffSize); obj_setBytes(self, "readBuff", NULL, readBuffSize); agile_modbus_tcp_init(&ctx_tcp, obj_getBytes(self, "sendBuff"), sendBuffSize, obj_getBytes(self, "readBuff"), readBuffSize); obj_setStruct(self, "ctx_tcp", ctx_tcp); - obj_setPtr(self, "ctx", ctx); + agile_modbus_tcp_t* ctx_tcp_heap = obj_getStruct(self, "ctx_tcp"); + obj_setPtr(self, "ctx", &ctx_tcp_heap->_ctx); } int _modbus__ModBus_deserializeMaskWriteRegister(PikaObj* self, int msgLength) { @@ -39,51 +39,54 @@ int _modbus__ModBus_deserializeMaskWriteRegister(PikaObj* self, int msgLength) { return agile_modbus_deserialize_mask_write_register(ctx, msgLength); } -int _modbus__ModBus_deserializeReadBits(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReadRegisters(PikaObj* self, int msgLength) { + uint16_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_read_bits(ctx, msgLength, dest); + int len = agile_modbus_deserialize_read_registers(ctx, msgLength, + (uint16_t*)buff); + return arg_newBytes((uint8_t*)buff, len * 2); } -int _modbus__ModBus_deserializeReadInputBits(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReadBits(PikaObj* self, int msgLength) { + uint8_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_read_input_bits(ctx, msgLength, dest); + int len = agile_modbus_deserialize_read_bits(ctx, msgLength, buff); + return arg_newBytes(buff, len); } -int _modbus__ModBus_deserializeReadInputRegisters(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReadInputBits(PikaObj* self, int msgLength) { + uint8_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_read_input_registers(ctx, msgLength, - (uint16_t*)dest); + int len = agile_modbus_deserialize_read_input_bits(ctx, msgLength, buff); + return arg_newBytes(buff, len); } -int _modbus__ModBus_deserializeReadRegisters(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReadInputRegisters(PikaObj* self, + int msgLength) { + uint16_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_read_registers(ctx, msgLength, - (uint16_t*)dest); + int len = agile_modbus_deserialize_read_input_registers(ctx, msgLength, + (uint16_t*)buff); + return arg_newBytes((uint8_t*)buff, len * 2); } -int _modbus__ModBus_deserializeReportSlaveId(PikaObj* self, - int msgLength, - int maxDest, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReportSlaveId(PikaObj* self, + int msgLength, + int maxDest) { + uint8_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_report_slave_id(ctx, msgLength, maxDest, - dest); + int len = agile_modbus_deserialize_report_slave_id(ctx, msgLength, maxDest, + (uint8_t*)buff); + return arg_newBytes(buff, len); } -int _modbus__ModBus_deserializeWriteAndReadRegisters(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeWriteAndReadRegisters(PikaObj* self, + int msgLength) { + uint16_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_write_and_read_registers(ctx, msgLength, - (uint16_t*)dest); + int len = agile_modbus_deserialize_write_and_read_registers( + ctx, msgLength, (uint16_t*)buff); + return arg_newBytes((uint8_t*)buff, len * 2); } int _modbus__ModBus_deserializeWriteBit(PikaObj* self, int msgLength) { diff --git a/package/modbus/_modbus.pyi b/package/modbus/_modbus.pyi index d044199b7..dbac725eb 100644 --- a/package/modbus/_modbus.pyi +++ b/package/modbus/_modbus.pyi @@ -1,30 +1,30 @@ class _ModBus: def setSlave(self, slave: int): ... + def serializeReadBits(self, addr: int, nb: int) -> int: ... def serializeReadInputBits(self, addr: int, nb: int) -> int: ... def serializeReadRegisters(self, addr: int, nb: int) -> int: ... def serializeReadInputRegisters(self, addr: int, nb: int) -> int: ... - def serializeWriteBit(self, addr: int, status: int) -> int: ... - def deserializeWriteBit(self, msgLength: int) -> int: ... def serializeWriteRegister(self, addr: int, value: int) -> int: ... + def serializeMaskWriteRegister(self, addr: int, andMask: int, orMask: int) -> int: ... + def serializeReportSlaveId(self) -> int: ... + + def serializeWriteAndReadRegisters(self, writeAddr: int, writeNb: int, src: bytes, readAddr: int, readNb: int) -> int: ... + def serializeWriteBits(self, addr: int, nb: int, src: bytes) -> int: ... + def serializeWriteRegisters(self, addr: int, nb: int, src: bytes) -> int: ... + + def deserializeWriteBit(self, msgLength: int) -> int: ... def deserializeWriteRegister(self, msgLength: int) -> int: ... def deserializeWriteBits(self, msgLength: int) -> int: ... def deserializeWriteRegisters(self, msgLength: int) -> int: ... - def serializeMaskWriteRegister(self, addr: int, andMask: int, orMask: int) -> int: ... def deserializeMaskWriteRegister(self, msgLength: int) -> int: ... - def serializeWriteAndReadRegisters(self, writeAddr: int, writeNb: int, src: bytes, readAddr: int, readNb: int) -> int: ... - def serializeReportSlaveId(self) -> int: ... - - def deserializeReadBits(self, msgLength: int, dest: bytes) -> int: ... - def deserializeReadInputBits(self, msgLength: int, dest: bytes) -> int: ... - def deserializeReadRegisters(self, msgLength: int, dest: bytes) -> int: ... - def deserializeReadInputRegisters(self, msgLength: int, dest: bytes) -> int: ... - def serializeWriteBits(self, addr: int, nb: int, src: bytes) -> int: ... - def serializeWriteRegisters(self, addr: int, nb: int, src: bytes) -> int: ... - def deserializeWriteAndReadRegisters(self, msgLength: int, dest: bytes) -> int: ... - - def deserializeReportSlaveId(self, msgLength: int, maxDest: int, dest: bytes) -> int: ... + def deserializeReadBits(self, msgLength: int) -> bytes: ... + def deserializeReadInputBits(self, msgLength: int) -> bytes: ... + def deserializeReadRegisters(self, msgLength: int) -> bytes: ... + def deserializeReadInputRegisters(self, msgLength: int) -> bytes: ... + def deserializeWriteAndReadRegisters(self, msgLength: int) -> bytes: ... + def deserializeReportSlaveId(self, msgLength: int, maxDest: int) -> bytes: ... def getSendBuff(self) -> bytes: ... def getReadBuff(self) -> bytes: ... diff --git a/package/modbus/modbus.py b/package/modbus/modbus.py index 8c0c1e4f7..0600f8e8e 100644 --- a/package/modbus/modbus.py +++ b/package/modbus/modbus.py @@ -2,48 +2,88 @@ import _modbus class ModBus(_modbus._ModBus): - def deserializeReadBits(self, msgLength: int) -> list: - dest = bytes(msgLength) - super().deserializeReadBits(msgLength, dest) - return list(dest) - def deserializeReadInputBits(self, msgLength: int) -> list: - dest = bytes(msgLength) - super().deserializeReadInputBits(msgLength, dest) - return list(dest) + def serializeWriteBits(self, addr: int, nb: int, src: list) -> bytes: + lenth = super().serializeWriteBits(addr, nb, bytes(src)) + return self.sendBuff[0:lenth] - def deserializeReadRegisters(self, msgLength: int) -> list: - dest = bytes(2 * msgLength) - super().deserializeReadRegisters(msgLength, dest) - ret = [] - for i in range(0, len(dest), 2): - ret.append(dest[i] + dest[i + 1] * 256) - return ret - - def deserializeReadInputRegisters(self, msgLength: int) -> list: - dest = bytes(2 * msgLength) - super().deserializeReadInputRegisters(msgLength, dest) - ret = [] - for i in range(0, len(dest), 2): - ret.append(dest[i] + dest[i + 1] * 256) - return ret - - def serializeWriteBits(self, addr: int, nb: int, src: list): - return super().serializeWriteBits(addr, nb, bytes(src)) - - def serializeWriteRegisters(self, addr: int, nb: int, src: list): + def serializeWriteRegisters(self, addr: int, nb: int, src: list) -> bytes: _src = bytes(2 * len(src)) for i in range(len(src)): _src[2 * i] = src[i] % 256 _src[2 * i + 1] = src[i] // 256 - return super().serializeWriteRegisters(addr, nb, _src) + lenth = super().serializeWriteRegisters(addr, nb, _src) + return self.sendBuff[0:lenth] - def deserializeWriteAndReadRegisters(self, msgLength: int) -> list: - dest = bytes(2 * msgLength) - super().deserializeWriteAndReadRegisters(msgLength, dest) + def serializeReadBits(self, addr: int, nb: int) -> bytes: + lenth = super().serializeReadBits(addr, nb) + return self.sendBuff[0:lenth] + + def serializeReadInputBits(self, addr: int, nb: int) -> bytes: + lenth = super().serializeReadInputBits(addr, nb) + return self.sendBuff[0:lenth] + + def serializeReadRegisters(self, addr: int, nb: int) -> bytes: + lenth = super().serializeReadRegisters(addr, nb) + return self.sendBuff[0:lenth] + + def serializeReadInputRegisters(self, addr: int, nb: int) -> bytes: + lenth = super().serializeReadInputRegisters(addr, nb) + return self.sendBuff[0:lenth] + + def serializeWriteBit(self, addr: int, status: int) -> bytes: + lenth = super().serializeWriteBit(addr, status) + return self.sendBuff[0:lenth] + + def serializeWriteRegister(self, addr: int, value: int) -> bytes: + lenth = super().serializeWriteRegister(addr, value) + return self.sendBuff[0:lenth] + + def serializeMaskWriteRegister(self, addr: int, andMask: int, orMask: int) -> bytes: + lenth = super().serializeMaskWriteRegister(addr, andMask, orMask) + return self.sendBuff[0:lenth] + + def serializeReportSlaveId(self) -> int: + lenth = super().serializeReportSlaveId() + return self.sendBuff[0:lenth] + + def deserializeReadRegisters(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeReadRegisters(length) ret = [] for i in range(0, len(dest), 2): - ret.append(dest[i] + dest[i + 1] * 256) + ret.append(int(dest[i]) + int(dest[i + 1]) * 256) + return ret + + def deserializeReadBits(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeReadBits(length) + return list(dest) + + def deserializeReadInputBits(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeReadInputBits(length) + return list(dest) + + def deserializeReadInputRegisters(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeReadInputRegisters(length) + ret = [] + for i in range(0, len(dest), 2): + ret.append(int(dest[i]) + int(dest[i + 1]) * 256) + return ret + + def deserializeWriteAndReadRegisters(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeWriteAndReadRegisters(length) + ret = [] + for i in range(0, len(dest), 2): + ret.append(int(dest[i]) + int(dest[i + 1]) * 256) return ret diff --git a/port/linux/package/pikascript/_modbus.pyi b/port/linux/package/pikascript/_modbus.pyi index d044199b7..dbac725eb 100644 --- a/port/linux/package/pikascript/_modbus.pyi +++ b/port/linux/package/pikascript/_modbus.pyi @@ -1,30 +1,30 @@ class _ModBus: def setSlave(self, slave: int): ... + def serializeReadBits(self, addr: int, nb: int) -> int: ... def serializeReadInputBits(self, addr: int, nb: int) -> int: ... def serializeReadRegisters(self, addr: int, nb: int) -> int: ... def serializeReadInputRegisters(self, addr: int, nb: int) -> int: ... - def serializeWriteBit(self, addr: int, status: int) -> int: ... - def deserializeWriteBit(self, msgLength: int) -> int: ... def serializeWriteRegister(self, addr: int, value: int) -> int: ... + def serializeMaskWriteRegister(self, addr: int, andMask: int, orMask: int) -> int: ... + def serializeReportSlaveId(self) -> int: ... + + def serializeWriteAndReadRegisters(self, writeAddr: int, writeNb: int, src: bytes, readAddr: int, readNb: int) -> int: ... + def serializeWriteBits(self, addr: int, nb: int, src: bytes) -> int: ... + def serializeWriteRegisters(self, addr: int, nb: int, src: bytes) -> int: ... + + def deserializeWriteBit(self, msgLength: int) -> int: ... def deserializeWriteRegister(self, msgLength: int) -> int: ... def deserializeWriteBits(self, msgLength: int) -> int: ... def deserializeWriteRegisters(self, msgLength: int) -> int: ... - def serializeMaskWriteRegister(self, addr: int, andMask: int, orMask: int) -> int: ... def deserializeMaskWriteRegister(self, msgLength: int) -> int: ... - def serializeWriteAndReadRegisters(self, writeAddr: int, writeNb: int, src: bytes, readAddr: int, readNb: int) -> int: ... - def serializeReportSlaveId(self) -> int: ... - - def deserializeReadBits(self, msgLength: int, dest: bytes) -> int: ... - def deserializeReadInputBits(self, msgLength: int, dest: bytes) -> int: ... - def deserializeReadRegisters(self, msgLength: int, dest: bytes) -> int: ... - def deserializeReadInputRegisters(self, msgLength: int, dest: bytes) -> int: ... - def serializeWriteBits(self, addr: int, nb: int, src: bytes) -> int: ... - def serializeWriteRegisters(self, addr: int, nb: int, src: bytes) -> int: ... - def deserializeWriteAndReadRegisters(self, msgLength: int, dest: bytes) -> int: ... - - def deserializeReportSlaveId(self, msgLength: int, maxDest: int, dest: bytes) -> int: ... + def deserializeReadBits(self, msgLength: int) -> bytes: ... + def deserializeReadInputBits(self, msgLength: int) -> bytes: ... + def deserializeReadRegisters(self, msgLength: int) -> bytes: ... + def deserializeReadInputRegisters(self, msgLength: int) -> bytes: ... + def deserializeWriteAndReadRegisters(self, msgLength: int) -> bytes: ... + def deserializeReportSlaveId(self, msgLength: int, maxDest: int) -> bytes: ... def getSendBuff(self) -> bytes: ... def getReadBuff(self) -> bytes: ... diff --git a/port/linux/package/pikascript/modbus.py b/port/linux/package/pikascript/modbus.py index 8c0c1e4f7..0600f8e8e 100644 --- a/port/linux/package/pikascript/modbus.py +++ b/port/linux/package/pikascript/modbus.py @@ -2,48 +2,88 @@ import _modbus class ModBus(_modbus._ModBus): - def deserializeReadBits(self, msgLength: int) -> list: - dest = bytes(msgLength) - super().deserializeReadBits(msgLength, dest) - return list(dest) - def deserializeReadInputBits(self, msgLength: int) -> list: - dest = bytes(msgLength) - super().deserializeReadInputBits(msgLength, dest) - return list(dest) + def serializeWriteBits(self, addr: int, nb: int, src: list) -> bytes: + lenth = super().serializeWriteBits(addr, nb, bytes(src)) + return self.sendBuff[0:lenth] - def deserializeReadRegisters(self, msgLength: int) -> list: - dest = bytes(2 * msgLength) - super().deserializeReadRegisters(msgLength, dest) - ret = [] - for i in range(0, len(dest), 2): - ret.append(dest[i] + dest[i + 1] * 256) - return ret - - def deserializeReadInputRegisters(self, msgLength: int) -> list: - dest = bytes(2 * msgLength) - super().deserializeReadInputRegisters(msgLength, dest) - ret = [] - for i in range(0, len(dest), 2): - ret.append(dest[i] + dest[i + 1] * 256) - return ret - - def serializeWriteBits(self, addr: int, nb: int, src: list): - return super().serializeWriteBits(addr, nb, bytes(src)) - - def serializeWriteRegisters(self, addr: int, nb: int, src: list): + def serializeWriteRegisters(self, addr: int, nb: int, src: list) -> bytes: _src = bytes(2 * len(src)) for i in range(len(src)): _src[2 * i] = src[i] % 256 _src[2 * i + 1] = src[i] // 256 - return super().serializeWriteRegisters(addr, nb, _src) + lenth = super().serializeWriteRegisters(addr, nb, _src) + return self.sendBuff[0:lenth] - def deserializeWriteAndReadRegisters(self, msgLength: int) -> list: - dest = bytes(2 * msgLength) - super().deserializeWriteAndReadRegisters(msgLength, dest) + def serializeReadBits(self, addr: int, nb: int) -> bytes: + lenth = super().serializeReadBits(addr, nb) + return self.sendBuff[0:lenth] + + def serializeReadInputBits(self, addr: int, nb: int) -> bytes: + lenth = super().serializeReadInputBits(addr, nb) + return self.sendBuff[0:lenth] + + def serializeReadRegisters(self, addr: int, nb: int) -> bytes: + lenth = super().serializeReadRegisters(addr, nb) + return self.sendBuff[0:lenth] + + def serializeReadInputRegisters(self, addr: int, nb: int) -> bytes: + lenth = super().serializeReadInputRegisters(addr, nb) + return self.sendBuff[0:lenth] + + def serializeWriteBit(self, addr: int, status: int) -> bytes: + lenth = super().serializeWriteBit(addr, status) + return self.sendBuff[0:lenth] + + def serializeWriteRegister(self, addr: int, value: int) -> bytes: + lenth = super().serializeWriteRegister(addr, value) + return self.sendBuff[0:lenth] + + def serializeMaskWriteRegister(self, addr: int, andMask: int, orMask: int) -> bytes: + lenth = super().serializeMaskWriteRegister(addr, andMask, orMask) + return self.sendBuff[0:lenth] + + def serializeReportSlaveId(self) -> int: + lenth = super().serializeReportSlaveId() + return self.sendBuff[0:lenth] + + def deserializeReadRegisters(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeReadRegisters(length) ret = [] for i in range(0, len(dest), 2): - ret.append(dest[i] + dest[i + 1] * 256) + ret.append(int(dest[i]) + int(dest[i + 1]) * 256) + return ret + + def deserializeReadBits(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeReadBits(length) + return list(dest) + + def deserializeReadInputBits(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeReadInputBits(length) + return list(dest) + + def deserializeReadInputRegisters(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeReadInputRegisters(length) + ret = [] + for i in range(0, len(dest), 2): + ret.append(int(dest[i]) + int(dest[i + 1]) * 256) + return ret + + def deserializeWriteAndReadRegisters(self, msg: bytes) -> list: + self.readBuff = msg + length = len(msg) + dest = super().deserializeWriteAndReadRegisters(length) + ret = [] + for i in range(0, len(dest), 2): + ret.append(int(dest[i]) + int(dest[i + 1]) * 256) return ret diff --git a/port/linux/package/pikascript/pikascript-lib/modbus/_modbus.c b/port/linux/package/pikascript/pikascript-lib/modbus/_modbus.c index d23dc6a5a..897ef8c00 100644 --- a/port/linux/package/pikascript/pikascript-lib/modbus/_modbus.c +++ b/port/linux/package/pikascript/pikascript-lib/modbus/_modbus.c @@ -5,14 +5,14 @@ void _modbus__ModBus___init__rtu(PikaObj* self, int sendBUffSize, int readBuffSize) { agile_modbus_rtu_t ctx_rtu = {0}; - agile_modbus_t* ctx = &ctx_rtu._ctx; obj_setBytes(self, "sendBuff", NULL, sendBUffSize); obj_setBytes(self, "readBuff", NULL, readBuffSize); agile_modbus_rtu_init(&ctx_rtu, obj_getBytes(self, "sendBuff"), sendBUffSize, obj_getBytes(self, "readBuff"), readBuffSize); obj_setStruct(self, "ctx_rtu", ctx_rtu); - obj_setPtr(self, "ctx", ctx); + agile_modbus_rtu_t* ctx_rtu_heap = obj_getStruct(self, "ctx_rtu"); + obj_setPtr(self, "ctx", &ctx_rtu_heap->_ctx); } void _modbus__ModBus_setSlave(PikaObj* self, int slave) { @@ -24,14 +24,14 @@ void _modbus__ModBus___init__tcp(PikaObj* self, int sendBuffSize, int readBuffSize) { agile_modbus_tcp_t ctx_tcp = {0}; - agile_modbus_t* ctx = &ctx_tcp._ctx; obj_setBytes(self, "sendBuff", NULL, sendBuffSize); obj_setBytes(self, "readBuff", NULL, readBuffSize); agile_modbus_tcp_init(&ctx_tcp, obj_getBytes(self, "sendBuff"), sendBuffSize, obj_getBytes(self, "readBuff"), readBuffSize); obj_setStruct(self, "ctx_tcp", ctx_tcp); - obj_setPtr(self, "ctx", ctx); + agile_modbus_tcp_t* ctx_tcp_heap = obj_getStruct(self, "ctx_tcp"); + obj_setPtr(self, "ctx", &ctx_tcp_heap->_ctx); } int _modbus__ModBus_deserializeMaskWriteRegister(PikaObj* self, int msgLength) { @@ -39,51 +39,54 @@ int _modbus__ModBus_deserializeMaskWriteRegister(PikaObj* self, int msgLength) { return agile_modbus_deserialize_mask_write_register(ctx, msgLength); } -int _modbus__ModBus_deserializeReadBits(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReadRegisters(PikaObj* self, int msgLength) { + uint16_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_read_bits(ctx, msgLength, dest); + int len = agile_modbus_deserialize_read_registers(ctx, msgLength, + (uint16_t*)buff); + return arg_newBytes((uint8_t*)buff, len * 2); } -int _modbus__ModBus_deserializeReadInputBits(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReadBits(PikaObj* self, int msgLength) { + uint8_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_read_input_bits(ctx, msgLength, dest); + int len = agile_modbus_deserialize_read_bits(ctx, msgLength, buff); + return arg_newBytes(buff, len); } -int _modbus__ModBus_deserializeReadInputRegisters(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReadInputBits(PikaObj* self, int msgLength) { + uint8_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_read_input_registers(ctx, msgLength, - (uint16_t*)dest); + int len = agile_modbus_deserialize_read_input_bits(ctx, msgLength, buff); + return arg_newBytes(buff, len); } -int _modbus__ModBus_deserializeReadRegisters(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReadInputRegisters(PikaObj* self, + int msgLength) { + uint16_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_read_registers(ctx, msgLength, - (uint16_t*)dest); + int len = agile_modbus_deserialize_read_input_registers(ctx, msgLength, + (uint16_t*)buff); + return arg_newBytes((uint8_t*)buff, len * 2); } -int _modbus__ModBus_deserializeReportSlaveId(PikaObj* self, - int msgLength, - int maxDest, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeReportSlaveId(PikaObj* self, + int msgLength, + int maxDest) { + uint8_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_report_slave_id(ctx, msgLength, maxDest, - dest); + int len = agile_modbus_deserialize_report_slave_id(ctx, msgLength, maxDest, + (uint8_t*)buff); + return arg_newBytes(buff, len); } -int _modbus__ModBus_deserializeWriteAndReadRegisters(PikaObj* self, - int msgLength, - uint8_t* dest) { +Arg* _modbus__ModBus_deserializeWriteAndReadRegisters(PikaObj* self, + int msgLength) { + uint16_t buff[128] = {0}; agile_modbus_t* ctx = obj_getPtr(self, "ctx"); - return agile_modbus_deserialize_write_and_read_registers(ctx, msgLength, - (uint16_t*)dest); + int len = agile_modbus_deserialize_write_and_read_registers( + ctx, msgLength, (uint16_t*)buff); + return arg_newBytes((uint8_t*)buff, len * 2); } int _modbus__ModBus_deserializeWriteBit(PikaObj* self, int msgLength) { diff --git a/port/linux/test/VM-test.cpp b/port/linux/test/VM-test.cpp index 314a30812..f61e1d97a 100644 --- a/port/linux/test/VM-test.cpp +++ b/port/linux/test/VM-test.cpp @@ -1502,6 +1502,36 @@ TEST(vm, super_val) { obj_deinit(pikaMain); EXPECT_EQ(pikaMemNow(), 0); } + +TEST(vm, super_val_) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); + extern unsigned char pikaModules_py_a[]; + obj_linkLibrary(pikaMain, pikaModules_py_a); + /* run */ + __platform_printf("BEGIN\r\n"); + obj_run(pikaMain, + "class test:\n" + " def test(self, a):\n" + " self.a = a\n" + "class test2(test):\n" + " def test(self, a):\n" + " super().test(str(a))\n" + "t1 = test()\n" + "t2 = test2()\n" + "t1.test(1)\n" + "t2.test(1)\n"); + /* collect */ + int t1_a = obj_getInt(pikaMain, "t1.a"); + char* t2_a = obj_getStr(pikaMain, "t2.a"); + /* assert */ + EXPECT_EQ(t1_a, 1); + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); +} + #endif #if !PIKA_NANO_ENABLE diff --git a/port/linux/test/module-test.cpp b/port/linux/test/module-test.cpp index f772871aa..26989565e 100644 --- a/port/linux/test/module-test.cpp +++ b/port/linux/test/module-test.cpp @@ -308,3 +308,26 @@ TEST(re, findall) { EXPECT_EQ(pikaMemNow(), 0); } #endif + +#if !PIKA_NANO_ENABLE + +TEST(modbus, rtu_master) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); + extern unsigned char pikaModules_py_a[]; + obj_linkLibrary(pikaMain, pikaModules_py_a); + /* run */ + __platform_printf("BEGIN\r\n"); + pikaVM_runSingleFile(pikaMain, "test/python/modbus/rtu_master.py"); + /* collect */ + /* assert */ + EXPECT_STREQ(log_buff[2], "BEGIN\r\n"); + EXPECT_STREQ(log_buff[1], + "b'\\x01\\x03\\x00\\x00\\x00\\x0a\\xc5\\xcd'\r\n"); + EXPECT_STREQ(log_buff[0], "[0, 0, 1234, 0, 0, 123, 0, 0, 0, 0]\r\n"); + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); +} +#endif \ No newline at end of file diff --git a/port/linux/test/python/modbus/rtu_master.py b/port/linux/test/python/modbus/rtu_master.py new file mode 100644 index 000000000..0852beacd --- /dev/null +++ b/port/linux/test/python/modbus/rtu_master.py @@ -0,0 +1,13 @@ +import modbus + +mb_tcp = modbus.ModBusRTU(128, 128) +mb_tcp.setSlave(1) + +send_buff = mb_tcp.serializeReadRegisters(0, 10) + +host_regists = mb_tcp.deserializeReadRegisters( + b'\x01\x03\x14\x00\x00\x00\x00\x04\xD2\x00\x00\x00\x00\x00\x7B\x00\x00\x00\x00\x00\x00\x00\x00\xE5\x0B' +) + +print(send_buff) +print(host_regists)