Struct S7Partner

Source
pub struct S7Partner { /* private fields */ }
Expand description

S7 伙伴

§Examples

创建被动伙伴

use snap7_rs::S7Partner;

// 创建 S7 被动伙伴
let partner = S7Partner::create(0);

// 设置接收回调
partner
    .set_recv_callback(Some(|_, op, r_id, p_data: *mut c_void, size: i32| unsafe {
        let buff = std::slice::from_raw_parts(p_data as *const u8, size as usize);
        println!("op: {}, r_id:{}, p_data:{:#x?}", op, r_id, buff);
    }))
    .unwrap();

// 启动伙伴服务
if let Err(e) = partner.start_to("0.0.0.0", "127.0.0.1", 0x1002, 0x1002) {
    dbg!(e);
}

// 业务逻辑
//loop {
    //...
//}

// 停止服务
partner.stop().unwrap();

创建主动伙伴

use snap7_rs::S7Partner;
use std::ffi::*;

// 创建 S7 主动伙伴
let partner = S7Partner::create(1);

// 设置发送回调
partner
    .set_send_callback(Some(|_, op| {
        dbg!(S7Partner::error_text(op));
    }))
    .unwrap();

// 启动伙伴服务
if let Err(e) = partner.start_to("0.0.0.0", "127.0.0.1", 0x1002, 0x1002) {
    dbg!(e);
}

let mut buff = [0x01u8, 0x02, 0x03, 0x04, 0x05, 0x06];
if let Err(e) = partner.b_send(1, &mut buff) {
    dbg!(e);
} else {
    dbg!("同步发送成功!");
}

let mut buff = [0x07u8, 0x08, 0x09, 0x0a, 0x0b, 0x0c];
if let Err(e) = partner.as_b_send(1, &mut buff) {
    dbg!(e);
} else {
    dbg!("异步发送...");
}

dbg!(S7Partner::error_text(partner.wait_as_b_send_completion(10)));

// 业务逻辑
//loop {
    //...
//}

// 停止服务
partner.stop().unwrap();

Implementations§

Source§

impl S7Partner

Source

pub fn create(active: i32) -> Self

创建一个 S7 伙伴

输入参数:

  • active: 内部参数类型
    • 0: 创建一个被动(连接)伙伴
    • 1: 创建一个主动(连接)伙伴
Source

pub fn get_param( &self, param: InternalParam, value: &mut InternalParamValue, ) -> Result<()>

读取一个伙伴对象的内部参数。

输入参数:

  • param: 内部参数类型
  • value: 内部参数值

返回值:

  • Ok: 设置成功
  • Err: 设置失败
Source

pub fn set_param( &self, param: InternalParam, value: InternalParamValue, ) -> Result<()>

设置伙伴对象的内部参数。

输入参数:

  • param: 内部参数类型
  • value: 内部参数值

返回值:

  • Ok: 设置成功
  • Err: 设置失败
Source

pub fn start_to( &self, local_address: &str, remote_address: &str, loc_tsap: u16, rem_tsap: u16, ) -> Result<()>

启动伙伴将其绑定到指定的 IP 地址和 TCP 端口。

输入参数:

  • local_address: 本地服务器地址
  • remote_address: 远程服务器地址
  • loc_tsap: 本地 TSAP
  • rem_tsap: PLC TSAP

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn start(&self) -> Result<()>

启动伙伴并使用之前 start_to() 中指定的参数。

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn stop(&self) -> Result<()>

停止伙伴,优雅地断开所有伙伴的连接,销毁所有的 S7 作业,并解除监听器套接字与地址的绑定。

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn set_send_callback<F>(&self, callback: Option<F>) -> Result<()>
where F: FnMut(*mut c_void, c_int) + 'static,

设置用户回调,当异步数据发送完成后伙伴对象将调用该回调。

输入参数:

  • callback: 回调函数

返回值:

  • Ok: 操作成功
  • Err: 操作失败
§Examples
partner.set_send_callback(Some(|_ptr, op_result| {
    if op_result == 0 {
        println!("发送成功!");
    }else{
        println!("发送失败!");
    }
})).unwrap();
Source

pub fn set_recv_callback<F>(&self, callback: Option<F>) -> Result<()>
where F: FnMut(*mut c_void, c_int, u32, *mut c_void, c_int) + 'static,

设置用户回调,当有数据包时,伙伴对象将调用该回调。

输入参数:

  • callback: 回调函数

返回值:

  • Ok: 操作成功
  • Err: 操作失败
§Examples
partner.set_recv_callback(Some(|_ptr, op, r_id, p_data: *mut c_void, size: i32| {
    let buff = std::slice::from_raw_parts(p_data, size as usize);
    println!("op: {}, r_id:{}, p_data:{:#x?}", op, r_id, buff);
})).unwrap();
Source

pub fn b_send(&self, r_id: u32, buff: &mut [u8]) -> Result<()>

向伙伴发送一个数据包,这个功能是同步的,即当传输工作(send+ack)完成后它才会返回。

输入参数:

  • r_id: 路由参数,必须向b_recv 提供相同的值
  • buff: 用户缓冲区

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn as_b_send(&self, r_id: u32, buff: &mut [u8]) -> Result<()>

向伙伴发送一个数据包,这个函数是异步的,也就是说它会立即返回,需要一个检查方法来知道传输何时完成。

输入参数:

  • r_id: 路由参数,必须向b_recv 提供相同的值
  • buff: 用户缓冲区

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn check_as_b_send_completion(&self, op_result: &mut i32) -> i32

检查当前的异步发送任务是否完成并立即返回。

输入参数:

  • op_result: 操作结果

返回值:

  • 0: 已完成
  • 1:任务进行中
  • -2: 提供的处理方式无效

注:如果返回值是 0,则 op_result 包含函数执行结果。

§Examples
// 如果不想使用循环,可以考虑使用 wait_as_b_send_completion() 函数;
loop {
    let mut op = -1;
    if partner.check_as_b_send_completion(&mut op) == 0 {
        println!("{}", op);
        break;
    }
    std::thread::sleep(std::time::Duration::from_millis(1));
}
Source

pub fn wait_as_b_send_completion(&self, timeout: u32) -> i32

等待直到当前的异步发送任务完成或超时结束。

输入参数:

  • timeout: 超时,单位 ms

返回值:

  • 0: 已完成
  • 0x00B00000:任务超时
  • 其它值: 见错误代码

注:这个函数使用本地操作系统原语(事件、信号...),以避免浪费CPU时间。

Source

pub fn b_recv( &self, r_id: u32, buff: &mut [u8], size: &mut i32, timeout: u32, ) -> Result<()>

从伙伴那里接收一个数据包,这个函数是同步的,它将一直等待,直到收到一个数据包或提供的超时过期。

输入参数:

  • r_id: 路由参数,远程伙伴 b_send 应提供相同的值
  • buff: 用户缓冲区
  • size: 接收数据长度
  • timeout: 超时,单位 ms

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn check_as_b_recv_completion( &self, op_result: &mut i32, r_id: &mut u32, p_data: &mut [u8], size: &mut i32, ) -> i32

检查是否收到数据包。

输入参数:

  • op_result: 操作结果
  • r_id: 路由参数,远程伙伴 b_send 应提供相同的值
  • p_data: 用户缓冲区
  • size: 接收数据长度

返回值:

  • 0: 已完成
  • 1:数据包处理中
  • -2: 提供的处理方式无效

注:仅当返回值是 0 时,参数结果才有意义。

Source

pub fn get_times(&self, send_time: &mut u32, recv_time: &mut u32) -> Result<()>

返回最后一次发送和接收作业的执行时间,单位为毫秒。

输入参数:

  • send_time: 发送时长
  • recv_time: 接收时长

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn get_stats( &self, bytes_sent: &mut u32, bytes_recv: &mut u32, send_errors: &mut u32, recv_errors: &mut u32, ) -> Result<()>

返回一些统计数据。

输入参数:

  • bytes_sent: 发送的字节数
  • bytes_recv: 接收的字节数
  • send_errors: 发送错误的数量
  • recv_errors: 接收错误的数量

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn get_last_error(&self, last_error: &mut i32) -> Result<()>

返回最后的工作结果。

输入参数:

  • last_error: 最后一次工作的返回

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn get_status(&self, status: &mut i32) -> Result<()>

返回伙伴服务状态。

输入参数:

  • status: 状态值
    • 0: 已停止
    • 1: 运行中,处于主动状态,正在尝试连接
    • 2: 运行中,处于被动状态,等待连接
    • 3: 已连接
    • 4: 正在发送数据
    • 5: 正在接收数据
    • 6: 启动被动伙伴出错

返回值:

  • Ok: 操作成功
  • Err: 操作失败
Source

pub fn error_text(error: i32) -> String

返回一个给定错误的文本解释。

输入参数:

  • error: 错误代码

Trait Implementations§

Source§

impl Drop for S7Partner

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.