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
impl S7Partner
Sourcepub fn create(active: i32) -> Self
pub fn create(active: i32) -> Self
创建一个 S7 伙伴
输入参数:
- active: 内部参数类型
- 0: 创建一个被动(连接)伙伴
- 1: 创建一个主动(连接)伙伴
Sourcepub fn get_param(
&self,
param: InternalParam,
value: &mut InternalParamValue,
) -> Result<()>
pub fn get_param( &self, param: InternalParam, value: &mut InternalParamValue, ) -> Result<()>
读取一个伙伴对象的内部参数。
输入参数:
- param: 内部参数类型
- value: 内部参数值
返回值:
- Ok: 设置成功
- Err: 设置失败
Sourcepub fn set_param(
&self,
param: InternalParam,
value: InternalParamValue,
) -> Result<()>
pub fn set_param( &self, param: InternalParam, value: InternalParamValue, ) -> Result<()>
设置伙伴对象的内部参数。
输入参数:
- param: 内部参数类型
- value: 内部参数值
返回值:
- Ok: 设置成功
- Err: 设置失败
Sourcepub fn start_to(
&self,
local_address: &str,
remote_address: &str,
loc_tsap: u16,
rem_tsap: u16,
) -> Result<()>
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: 操作失败
Sourcepub fn stop(&self) -> Result<()>
pub fn stop(&self) -> Result<()>
停止伙伴,优雅地断开所有伙伴的连接,销毁所有的 S7 作业,并解除监听器套接字与地址的绑定。
返回值:
- Ok: 操作成功
- Err: 操作失败
Sourcepub fn set_send_callback<F>(&self, callback: Option<F>) -> Result<()>
pub fn set_send_callback<F>(&self, callback: Option<F>) -> Result<()>
Sourcepub fn set_recv_callback<F>(&self, callback: Option<F>) -> Result<()>
pub fn set_recv_callback<F>(&self, callback: Option<F>) -> Result<()>
Sourcepub fn b_send(&self, r_id: u32, buff: &mut [u8]) -> Result<()>
pub fn b_send(&self, r_id: u32, buff: &mut [u8]) -> Result<()>
向伙伴发送一个数据包,这个功能是同步的,即当传输工作(send+ack)完成后它才会返回。
输入参数:
- r_id: 路由参数,必须向b_recv 提供相同的值
- buff: 用户缓冲区
返回值:
- Ok: 操作成功
- Err: 操作失败
Sourcepub fn as_b_send(&self, r_id: u32, buff: &mut [u8]) -> Result<()>
pub fn as_b_send(&self, r_id: u32, buff: &mut [u8]) -> Result<()>
向伙伴发送一个数据包,这个函数是异步的,也就是说它会立即返回,需要一个检查方法来知道传输何时完成。
输入参数:
- r_id: 路由参数,必须向b_recv 提供相同的值
- buff: 用户缓冲区
返回值:
- Ok: 操作成功
- Err: 操作失败
Sourcepub fn check_as_b_send_completion(&self, op_result: &mut i32) -> i32
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));
}
Sourcepub fn wait_as_b_send_completion(&self, timeout: u32) -> i32
pub fn wait_as_b_send_completion(&self, timeout: u32) -> i32
等待直到当前的异步发送任务完成或超时结束。
输入参数:
- timeout: 超时,单位 ms
返回值:
- 0: 已完成
- 0x00B00000:任务超时
- 其它值: 见错误代码
注:这个函数使用本地操作系统原语(事件、信号...),以避免浪费CPU时间。
Sourcepub fn b_recv(
&self,
r_id: u32,
buff: &mut [u8],
size: &mut i32,
timeout: u32,
) -> Result<()>
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: 操作失败
Sourcepub fn check_as_b_recv_completion(
&self,
op_result: &mut i32,
r_id: &mut u32,
p_data: &mut [u8],
size: &mut i32,
) -> i32
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 时,参数结果才有意义。
Sourcepub fn get_times(&self, send_time: &mut u32, recv_time: &mut u32) -> Result<()>
pub fn get_times(&self, send_time: &mut u32, recv_time: &mut u32) -> Result<()>
返回最后一次发送和接收作业的执行时间,单位为毫秒。
输入参数:
- send_time: 发送时长
- recv_time: 接收时长
返回值:
- Ok: 操作成功
- Err: 操作失败
Sourcepub fn get_stats(
&self,
bytes_sent: &mut u32,
bytes_recv: &mut u32,
send_errors: &mut u32,
recv_errors: &mut u32,
) -> Result<()>
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: 操作失败
Sourcepub fn get_last_error(&self, last_error: &mut i32) -> Result<()>
pub fn get_last_error(&self, last_error: &mut i32) -> Result<()>
返回最后的工作结果。
输入参数:
- last_error: 最后一次工作的返回
返回值:
- Ok: 操作成功
- Err: 操作失败
Sourcepub fn get_status(&self, status: &mut i32) -> Result<()>
pub fn get_status(&self, status: &mut i32) -> Result<()>
返回伙伴服务状态。
输入参数:
- status: 状态值
- 0: 已停止
- 1: 运行中,处于主动状态,正在尝试连接
- 2: 运行中,处于被动状态,等待连接
- 3: 已连接
- 4: 正在发送数据
- 5: 正在接收数据
- 6: 启动被动伙伴出错
返回值:
- Ok: 操作成功
- Err: 操作失败
Sourcepub fn error_text(error: i32) -> String
pub fn error_text(error: i32) -> String
返回一个给定错误的文本解释。
输入参数:
- error: 错误代码
Trait Implementations§
Auto Trait Implementations§
impl Freeze for S7Partner
impl RefUnwindSafe for S7Partner
impl Send for S7Partner
impl Sync for S7Partner
impl Unpin for S7Partner
impl UnwindSafe for S7Partner
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
Mutably borrows from an owned value. Read more