Example #1
0
 def testSerialAsyncioClient(self, mock_gather, mock_event_loop, method,
                             framer):
     """
     Test that AsyncModbusSerialClient instantiates AsyncioModbusSerialClient for asyncio scheduler.
     :return:
     """
     loop = asyncio.get_event_loop()
     loop.is_running.side_effect = lambda: False
     loop, client = AsyncModbusSerialClient(schedulers.ASYNC_IO,
                                            method=method,
                                            port=SERIAL_PORT,
                                            loop=loop,
                                            baudrate=19200,
                                            parity='E',
                                            stopbits=2,
                                            bytesize=7)
     assert (isinstance(client, AsyncioModbusSerialClient))
     assert (isinstance(client.framer, framer))
     assert (client.port == SERIAL_PORT)
     assert (client.baudrate == 19200)
     assert (client.parity == 'E')
     assert (client.stopbits == 2)
     assert (client.bytesize == 7)
     client.stop()
     loop.stop()
Example #2
0
    def testSerialTwistedClient(self, method, framer):
        """ Test the serial twisted client client initialize """
        from serial import Serial
        with patch("serial.Serial") as mock_sp:
            from twisted.internet import reactor
            from twisted.internet.serialport import SerialPort

            with patch('twisted.internet.reactor') as mock_reactor:

                protocol, client = AsyncModbusSerialClient(schedulers.REACTOR,
                                                           method=method,
                                                           port=SERIAL_PORT,
                                                           proto_cls=ModbusSerClientProtocol)

                assert (isinstance(client, SerialPort))
                assert (isinstance(client.protocol, ModbusSerClientProtocol))
                assert (0 == len(list(client.protocol.transaction)))
                assert (isinstance(client.protocol.framer, framer))
                assert (client.protocol._connected)

                def handle_failure(failure):
                    assert (isinstance(failure.exception(), ConnectionException))

                d = client.protocol._buildResponse(0x00)
                d.addCallback(handle_failure)

                assert (client.protocol._connected)
                client.protocol.close()
                protocol.stop()
                assert (not client.protocol._connected)
Example #3
0
    def testSerialTwistedClient(self, method, framer):
        """ Test the serial tornado client client initialize """
        from serial import Serial
        with patch("serial.Serial") as mock_sp:
            from twisted.internet import reactor
            from twisted.internet.serialport import SerialPort

            with patch('twisted.internet.reactor') as mock_reactor:

                protocol, client = AsyncModbusSerialClient(schedulers.REACTOR,
                                                           method=method,
                                                           port=SERIAL_PORT,
                                                           proto_cls=ModbusSerClientProtocol)

                assert (isinstance(client, SerialPort))
                assert (isinstance(client.protocol, ModbusSerClientProtocol))
                assert (0 == len(list(client.protocol.transaction)))
                assert (isinstance(client.protocol.framer, framer))
                assert (client.protocol._connected)

                def handle_failure(failure):
                    assert (isinstance(failure.exception(), ConnectionException))

                d = client.protocol._buildResponse(0x00)
                d.addCallback(handle_failure)

                assert (client.protocol._connected)
                client.protocol.close()
                protocol.stop()
                assert (not client.protocol._connected)
Example #4
0
    def testSerialTornadoClient(self, method, framer):
        """ Test the serial tornado client client initialize """
        from serial import Serial
        with maybe_manage(sys.platform in ('darwin', 'win32'),
                          patch.object(Serial, "open")):
            protocol, future = AsyncModbusSerialClient(schedulers.IO_LOOP,
                                                       method=method,
                                                       port=SERIAL_PORT)
            client = future.result()
            assert (isinstance(client, AsyncTornadoModbusSerialClient))
            assert (0 == len(list(client.transaction)))
            assert (isinstance(client.framer, framer))
            assert (client.port == SERIAL_PORT)
            assert (client._connected)

            def handle_failure(failure):
                assert (isinstance(failure.exception(), ConnectionException))

            d = client._build_response(0x00)
            d.add_done_callback(handle_failure)

            assert (client._connected)
            client.close()
            protocol.stop()
            assert (not client._connected)
Example #5
0
 def testSerialAsyncioClientPython2(self):
     """
     Test Serial asynchronous asyncio client exits on python2
     :return:
     """
     with pytest.raises(SystemExit) as pytest_wrapped_e:
         AsyncModbusSerialClient(schedulers.ASYNC_IO, method="rtu", port=SERIAL_PORT)
     assert pytest_wrapped_e.type == SystemExit
     assert pytest_wrapped_e.value.code == 1
Example #6
0
    def testSerialTornadoClient(self, method, framer):
        """ Test the serial tornado client client initialize """
        protocol, future = AsyncModbusSerialClient(schedulers.IO_LOOP, method=method, port=SERIAL_PORT)
        client = future.result()
        assert(isinstance(client, AsyncTornadoModbusSerialClient))
        assert(0 == len(list(client.transaction)))
        assert(isinstance(client.framer, framer))
        assert(client.port == SERIAL_PORT)
        assert(client._connected)

        def handle_failure(failure):
            assert(isinstance(failure.exception(), ConnectionException))

        d = client._build_response(0x00)
        d.add_done_callback(handle_failure)

        assert(client._connected)
        client.close()
        protocol.stop()
        assert(not client._connected)
Example #7
0
    def testSerialTornadoClient(self, method, framer):
        """ Test the serial tornado client client initialize """
        protocol, future = AsyncModbusSerialClient(schedulers.IO_LOOP, method=method, port=SERIAL_PORT)
        client = future.result()
        assert(isinstance(client, AsyncTornadoModbusSerialClient))
        assert(0 == len(list(client.transaction)))
        assert(isinstance(client.framer, framer))
        assert(client.port == SERIAL_PORT)
        assert(client._connected)

        def handle_failure(failure):
            assert(isinstance(failure.exception(), ConnectionException))

        d = client._build_response(0x00)
        d.add_done_callback(handle_failure)

        assert(client._connected)
        client.close()
        protocol.stop()
        assert(not client._connected)
Example #8
0
        :param response: The response to process
        """
        log.info(response.getBit(0))
        log.info(response.getBit(1))
        log.info(response.getBit(2))
        reactor.callLater(CLIENT_DELAY, self.fetch_holding_registers)

    def error_handler(self, failure):
        """ Handle any twisted errors

        :param failure: The error to handle
        """
        log.error(failure)


if __name__ == "__main__":
    proto, client = AsyncModbusSerialClient(
        schedulers.REACTOR,
        method="rtu",
        port=SERIAL_PORT,
        baudrate=115200,
        # parity='O',
        # bytesize=8,
        # stopbits=1,
        # timeout=2,
        proto_cls=ExampleProtocol)
    #client.inter_char_timeout = 0.1
    proto.start()
    # proto.stop()
        adress_register = 0x0  # 起始寄存器
        length_data = 0x40  # 数据长度 HEX=
        adress_gateway = 0x1  # 云盒地址
        rr = await client.read_holding_registers(adress_register,
                                                 length_data,
                                                 unit=adress_gateway)
        print('rr: %s' % repr(rr.registers))
        print(len(rr.registers))
        # assert(rq.function_code < 0x80)     # test that we are not an error
        # assert(rq.registers == [20]*8)      # test the expected value
        # assert(rr.registers == [20]*8)      # test the expected value
    except Exception as e:
        log.exception(e)
        client.transport.close()
    await asyncio.sleep(1)


if __name__ == '__main__':
    # ----------------------------------------------------------------------- #
    # For testing on linux based systems you can use socat to create serial
    # ports
    # ----------------------------------------------------------------------- #
    # socat -d -d PTY,link=/tmp/ptyp0,raw,echo=0,ispeed=9600 PTY,
    # link=/tmp/ttyp0,raw,echo=0,ospeed=9600
    loop, client = ModbusClient(schedulers.ASYNC_IO,
                                port='COM2',
                                baudrate=115200,
                                method="rtu")
    loop.run_until_complete(start_async_test(client.protocol))
    loop.close()
        d.addCallbacks(self.start_next_cycle, self.error_handler)

    def start_next_cycle(self, response):
        """ Write values of coils, trigger next cycle

        :param response: The response to process
        """
        print(response)
        log.info(response.getBit(0))
        log.info(response.getBit(1))
        log.info(response.getBit(2))
        reactor.callLater(CLIENT_DELAY, self.fetch_holding_registers)

    def error_handler(self, failure):
        """ Handle any twisted errors

        :param failure: The error to handle
        """
        log.error(failure)


if __name__ == "__main__":
    proto, client = AsyncModbusSerialClient(schedulers.REACTOR,
                                            method="rtu",
                                            baudrate=sys.argv[2],
                                            port=sys.argv[1],
                                            timeout=2,
                                            proto_cls=ExampleProtocol)
    proto.start()
    # proto.stop()
        arguments = {
            'read_address':    1,
            'read_count':      8,
            'write_address':   1,
            'write_registers': [20]*8,
        }
        log.debug("Read write registers simulataneously")
        rq = await client.readwrite_registers(unit=UNIT, **arguments)
        rr = await client.read_holding_registers(1, 8, unit=UNIT)
        assert(rq.function_code < 0x80)     # test that we are not an error
        assert(rq.registers == [20]*8)      # test the expected value
        assert(rr.registers == [20]*8)      # test the expected value
    except Exception as e:
        log.exception(e)
        client.transport.close()
    await asyncio.sleep(1)


if __name__ == '__main__':
    # ----------------------------------------------------------------------- #
    # For testing on linux based systems you can use socat to create serial
    # ports
    # ----------------------------------------------------------------------- #
    # socat -d -d PTY,link=/tmp/ptyp0,raw,echo=0,ispeed=9600 PTY,
    # link=/tmp/ttyp0,raw,echo=0,ospeed=9600
    loop, client = ModbusClient(schedulers.ASYNC_IO, port='/tmp/ptyp0',
                                baudrate=9600, method="rtu")
    loop.run_until_complete(start_async_test(client.protocol))
    loop.close()

        d.addCallbacks(self.start_next_cycle, self.error_handler)

    def start_next_cycle(self, response):
        """ Write values of coils, trigger next cycle

        :param response: The response to process
        """
        log.info(response.getBit(0))
        log.info(response.getBit(1))
        log.info(response.getBit(2))
        reactor.callLater(CLIENT_DELAY, self.fetch_holding_registers)

    def error_handler(self, failure):
        """ Handle any twisted errors

        :param failure: The error to handle
        """
        log.error(failure)


if __name__ == "__main__":
    proto, client = AsyncModbusSerialClient(schedulers.REACTOR,
                                            method="rtu", 
                                            port=SERIAL_PORT, 
                                            timeout=2, 
                                            proto_cls=ExampleProtocol)
    proto.start()
    # proto.stop()


        d.addCallbacks(self.start_next_cycle, self.error_handler)

    def start_next_cycle(self, response):
        """ Write values of coils, trigger next cycle

        :param response: The response to process
        """
        log.info(response.getBit(0))
        log.info(response.getBit(1))
        log.info(response.getBit(2))
        reactor.callLater(CLIENT_DELAY, self.fetch_holding_registers)

    def error_handler(self, failure):
        """ Handle any twisted errors

        :param failure: The error to handle
        """
        log.error(failure)


if __name__ == "__main__":
    import time
    proto, client = AsyncModbusSerialClient(schedulers.REACTOR,
                                            method="rtu",
                                            port=SERIAL_PORT,
                                            timeout=2,
                                            proto_cls=ExampleProtocol)
    proto.start()
    time.sleep(10)  # Wait for operation to complete
    # proto.stop()

if __name__ == "__main__":
    # ----------------------------------------------------------------------- #
    # Create temporary serial ports using SOCAT

    # socat -d -d PTY,link=/tmp/ptyp0,raw,echo=0,ispeed=9600 PTY,
    # link=/tmp/ttyp0,raw,echo=0,ospeed=9600

    # Default framer is ModbusRtuFramer
    # ----------------------------------------------------------------------- #

    # Rtu
    protocol, future = AsyncModbusSerialClient(schedulers.IO_LOOP,
                                               method="rtu",
                                               port="/tmp/ptyp0",
                                               baudrate=9600,
                                               timeout=2)

    # Asci
    # from pymodbus.transaction import ModbusAsciiFramer
    # protocol, future = AsyncModbusSerialClient(schedulers.IO_LOOP,
    #                                            method="ascii",
    #                                            port="/dev/ptyp0",
    #                                            framer=ModbusAsciiFramer,
    #                                            baudrate=9600,
    #                                            timeout=2)

    # Binary
    # from pymodbus.transaction import ModbusBinaryFramer
    # protocol, future = AsyncModbusSerialClient(schedulers.IO_LOOP,
Example #15
0
    parser = argparse.ArgumentParser()
    parser.add_argument("serialPort", help="The serial port device to use")
    parser.add_argument("--httpListenPort", help="The port for the HTTP server to listen on", type=int, default=8080)
    parser.add_argument("--verbose", help="Use verbose logging", action="store_true")
    args = parser.parse_args()

    logging.basicConfig()
    log = logging.getLogger()
    if args.verbose:
        log.setLevel(logging.DEBUG)
    else:
        log.setLevel(logging.INFO)

    log.info("Listening on port {}, using device {}".format(args.httpListenPort, args.serialPort))

    loop, client = AsyncModbusSerialClient(schedulers.ASYNC_IO, port=args.serialPort, baudrate=19200, method="rtu")
    modbus = Modbus(client.protocol)
    handler = HttpHandler(modbus)
    app = web.Application()
    app.add_routes([
        web.get("/", handler.handle_root),
        web.get("/summary", handler.get_summary),
        web.get("/mode/{flag}", handler.get_mode_status),
        web.post("/mode/{flag}", handler.set_mode_status),
        web.post("/setSetting/{setting}/{value}", handler.set_setting)
    ])

    try:
        loop.run_until_complete(web._run_app(app, port=args.httpListenPort))
    finally:
        loop.close()