pub struct Client { /* private fields */ }
Expand description
Represents a connection to a ADS server.
The Client’s communication methods use &self
, so that it can be freely
shared within one thread, or sent, between threads. Wrappers such as
Device
or symbol::Handle
use a &Client
as well.
Implementations
sourceimpl Client
impl Client
sourcepub fn new(
addr: impl ToSocketAddrs,
timeouts: Timeouts,
source: Source
) -> Result<Self>
pub fn new(
addr: impl ToSocketAddrs,
timeouts: Timeouts,
source: Source
) -> Result<Self>
Open a new connection to an ADS server.
If connecting to a server that has an AMS router, it needs to have a
route set for the source IP and NetID, otherwise the connection will be
closed immediately. The route can be added from TwinCAT, or this
crate’s udp::add_route
helper can be used to add a route via UDP
message.
source
is the AMS address to to use as the source; the NetID needs to
match the route entry in the server. If Source::Auto
, the NetID is
constructed from the local IP address with .1.1 appended; if there is no
IPv4 address, 127.0.0.1.1.1
is used.
The AMS port of source
is not important, as long as it is not a
well-known service port; an ephemeral port number > 49152 is
recommended. If Auto, the port is set to 58913.
If you are connecting to the local PLC, you need to set source
to
Source::Request
. This will ask the local AMS router for a new
port and use it as the source port.
Since all communications is supposed to be handled by an ADS router, only one TCP/ADS connection can exist between two hosts. Non-TwinCAT clients should make sure to replicate this behavior, as opening a second connection will close the first.
sourcepub fn get_notification_channel(&self) -> Receiver<Notification>
pub fn get_notification_channel(&self) -> Receiver<Notification>
Get a receiver for notifications.
sourcepub fn device(&self, addr: AmsAddr) -> Device<'_>
pub fn device(&self, addr: AmsAddr) -> Device<'_>
Return a wrapper that executes operations for a target device (known by NetID and port).
The local NetID 127.0.0.1.1.1
is mapped to the client’s source NetID,
so that you can connect to a local PLC using:
let client = Client::new("127.0.0.1", ..., Source::Request);
let device = client.device(AmsAddr::new(AmsNetId::local(), 851));
without knowing its NetID.
sourcepub fn communicate(
&self,
cmd: Command,
target: AmsAddr,
data_in: &[&[u8]],
data_out: &mut [&mut [u8]]
) -> Result<usize>
pub fn communicate(
&self,
cmd: Command,
target: AmsAddr,
data_in: &[&[u8]],
data_out: &mut [&mut [u8]]
) -> Result<usize>
Low-level function to execute an ADS command.
Writes a data from a number of input buffers, and returns data in a number of output buffers. The latter might not be filled completely; the return value specifies the number of total valid bytes. It is up to the caller to determine what this means in terms of the passed buffers.