pub struct Client { /* private fields */ }
Implementations§
Source§impl Client
impl Client
Sourcepub fn new<A: ToSocketAddrs + Debug>(
addr: A,
timeouts: Timeouts,
source: Source,
) -> Result<(Self, Reader)>
pub fn new<A: ToSocketAddrs + Debug>( addr: A, timeouts: Timeouts, source: Source, ) -> Result<(Self, Reader)>
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.
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.
§Panics
Should not panic
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 session_id(&self) -> usize
pub fn session_id(&self) -> usize
Get internal session ID. The handles should be recreated if changed
Sourcepub fn lock_session(&self) -> Result<SessionGuard>
pub fn lock_session(&self) -> Result<SessionGuard>
Lock TCP session (disable reconnects)
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.
pub fn shutdown(&self)
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Client
impl !RefUnwindSafe for Client
impl Send for Client
impl Sync for Client
impl Unpin for Client
impl !UnwindSafe for Client
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more