def test_ams_packet(self):
        source_addr = AmsAddr('127.0.0.1.1.1', 59558)
        target_addr = AmsAddr('172.38.1.1.1.1', 59559)

        header1 = structs.AmsHeader(
            target_net_id=target_addr.netIdStruct(),
            target_port=target_addr.port,
            source_net_id=source_addr.netIdStruct(),
            source_port=source_addr.port,
            command_id=pyads.constants.ADSCOMMAND_READDEVICEINFO,
            state_flags=pyads.constants.ADSSTATEFLAG_COMMAND,
            data_length=6,
            error_code=1,
            invoke_id=2,
        )
        ads_data = b'\x00' * 6
        amstcpheader = structs.AmsTcpHeader(header1.length + len(ads_data))
        packet = structs.AmsPacket(amstcpheader, header1, ads_data)

        # first six bytes should be amstcpheader
        self.assertEqual(packet.to_bytes()[:6], amstcpheader.to_bytes())

        # next 32 bytes should be ams header
        self.assertEqual(packet.to_bytes()[6:38], header1.to_bytes())

        # last bytes should be data
        self.assertEqual(packet.to_bytes()[38:44], ads_data)

        # check from bytes function
        self.assertEqual(
            structs.AmsPacket.from_bytes(packet.to_bytes()).to_bytes(),
            packet.to_bytes()
        )
    def test_amsheader(self):
        source_addr = AmsAddr('127.0.0.1.1.1', 59558)
        target_addr = AmsAddr('172.38.1.1.1.1', 59559)

        header1 = structs.AmsHeader(
            target_net_id=target_addr.netIdStruct(),
            target_port=target_addr.port,
            source_net_id=source_addr.netIdStruct(),
            source_port=source_addr.port,
            command_id=pyads.constants.ADSCOMMAND_READDEVICEINFO,
            state_flags=pyads.constants.ADSSTATEFLAG_COMMAND,
            data_length=6,
            error_code=1,
            invoke_id=2,
        )

        data_bytes = header1.to_bytes()
        self.assertEqual(len(data_bytes), header1.length)
        header2 = structs.AmsHeader.from_bytes(data_bytes)

        self.assertEqual(bytearray(header1.target_net_id.b),
                         bytearray(header2.target_net_id.b))
        self.assertEqual(header1.target_port, header2.target_port)
        self.assertEqual(bytearray(header1.source_net_id),
                         bytearray(header2.source_net_id))
        self.assertEqual(header1.source_port, header2.source_port)
        self.assertEqual(header1.command_id, header2.command_id)
        self.assertEqual(header1.state_flags, header2.state_flags)
        self.assertEqual(header1.data_length, header2.data_length)
        self.assertEqual(header1.error_code, header2.error_code)
        self.assertEqual(header1.invoke_id, header2.invoke_id)
    def test_ams_packet(self):
        source_addr = AmsAddr("127.0.0.1.1.1", 59558)
        target_addr = AmsAddr("172.38.1.1.1.1", 59559)

        header1 = structs.AmsHeader(
            target_net_id=target_addr.netIdStruct(),
            target_port=target_addr.port,
            source_net_id=source_addr.netIdStruct(),
            source_port=source_addr.port,
            command_id=pyads.constants.ADSCOMMAND_READDEVICEINFO,
            state_flags=pyads.constants.ADSSTATEFLAG_COMMAND,
            data_length=6,
            error_code=1,
            invoke_id=2,
        )
        ads_data = b"\x00" * 6
        amstcpheader = structs.AmsTcpHeader(header1.length + len(ads_data))
        packet = structs.AmsPacket(amstcpheader, header1, ads_data)

        # first six bytes should be amstcpheader
        self.assertEqual(packet.to_bytes()[:6], amstcpheader.to_bytes())

        # next 32 bytes should be ams header
        self.assertEqual(packet.to_bytes()[6:38], header1.to_bytes())

        # last bytes should be data
        self.assertEqual(packet.to_bytes()[38:44], ads_data)

        # check from bytes function
        self.assertEqual(
            structs.AmsPacket.from_bytes(packet.to_bytes()).to_bytes(),
            packet.to_bytes(),
        )
    def test_amsheader(self):
        source_addr = AmsAddr("127.0.0.1.1.1", 59558)
        target_addr = AmsAddr("172.38.1.1.1.1", 59559)

        header1 = structs.AmsHeader(
            target_net_id=target_addr.netIdStruct(),
            target_port=target_addr.port,
            source_net_id=source_addr.netIdStruct(),
            source_port=source_addr.port,
            command_id=pyads.constants.ADSCOMMAND_READDEVICEINFO,
            state_flags=pyads.constants.ADSSTATEFLAG_COMMAND,
            data_length=6,
            error_code=1,
            invoke_id=2,
        )

        data_bytes = header1.to_bytes()
        self.assertEqual(len(data_bytes), header1.length)
        header2 = structs.AmsHeader.from_bytes(data_bytes)

        self.assertEqual(bytearray(header1.target_net_id.b),
                         bytearray(header2.target_net_id.b))
        self.assertEqual(header1.target_port, header2.target_port)
        self.assertEqual(bytearray(header1.source_net_id),
                         bytearray(header2.source_net_id))
        self.assertEqual(header1.source_port, header2.source_port)
        self.assertEqual(header1.command_id, header2.command_id)
        self.assertEqual(header1.state_flags, header2.state_flags)
        self.assertEqual(header1.data_length, header2.data_length)
        self.assertEqual(header1.error_code, header2.error_code)
        self.assertEqual(header1.invoke_id, header2.invoke_id)
示例#5
0
    def setUpClass(cls):
        # Start dummy ADS Endpoint
        cls.test_server = AdsTestServer(logging=False)
        cls.test_server.start()

        # Endpoint AMS Address
        cls.endpoint = AmsAddr(TEST_SERVER_AMS_NET_ID, TEST_SERVER_AMS_PORT)

        # Open AMS Port
        ads.open_port()

        # wait a bit otherwise error might occur
        time.sleep(1)

        # NOTE: On a Windows machine, this route needs to be configured
        # within the router service for the tests to work.
        if platform_is_linux():
            ads.add_route(cls.endpoint, TEST_SERVER_IP_ADDRESS)
import pyads
from pyads.structs import AmsAddr

# x, y, z, a, b, c
cartesian_coordinates = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

pyads.open_port()

netID = '5.46.135.204.1.1'
port = 0x8888

target_addr = AmsAddr(netID, port)

while True:
    cartesian_coordinates[0], cartesian_coordinates[1], cartesian_coordinates[
        2] = eval(input("x,y,z: "))
    pyads.read_write(target_addr, 2, 1, pyads.PLCTYPE_BOOL,
                     cartesian_coordinates, pyads.PLCTYPE_ARR_LREAL(6))

pyads.close_port()