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)
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()