Crates.io | s7 |
lib.rs | s7 |
version | 0.1.9 |
source | src |
created_at | 2019-10-12 10:16:42.788547 |
updated_at | 2019-10-20 11:37:28.371973 |
description | A simple library that can be used to communicate with Siemens S7 family PLC devices |
homepage | |
repository | https://github.com/petar-dambovaliev/s7 |
max_upload_size | |
id | 171880 |
size | 62,357 |
A simple library that can be used to communicate with Siemens S7 family PLC devices
This crate provides communication tools for Siemens s7 family devices
So far only PG.db_read
and PG.db_write
have been tested on actual hardware
The crate is unstable as of now and provides no guarantees
extern crate s7;
use s7::{client::Client, field::Bool, field::Fields, field::Float, tcp, transport::Connection};
use std::net::{IpAddr, Ipv4Addr};
use std::time::Duration;
fn main() {
let addr = Ipv4Addr::new(127, 0, 0, 1);
let mut opts = tcp::Options::new(IpAddr::from(addr), 5, 5, Connection::PG);
opts.read_timeout = Duration::from_secs(2);
opts.write_timeout = Duration::from_secs(2);
let t = tcp::Transport::connect(opts).unwrap();
let mut cl = Client::new(t).unwrap();
let buffer = &mut vec![0u8; Bool::size() as usize];
let db = 888;
// the offset in the PLC is represented by a float
// the difit on the left is the index within the block
// the digit after the decimal point is only important for the `Bool` to be able to change the relevant bit
// we don't need after
let mut offset = 8.4;
// Since this is a boolean field, we are going to get back 1 byte
cl.ag_read(db, offset as i32, Bool::size(), buffer).unwrap();
// field mod provides types to handle the data from the PLC
// create a bool field from the byte we got
let mut lights = Bool::new(db, offset, buffer.to_vec()).unwrap();
// the bit in the byte is set without changing any of the other bits
lights.set_value(!lights.value()); // toggle the light switch
offset = 12.0;
let mut cooling_buffer = vec![0u8; Float::size() as usize];
cl.ag_read(db, offset as i32, Float::size(), cooling_buffer.as_mut())
.unwrap();
let mut cooling = Float::new(db, offset, cooling_buffer).unwrap();
cooling.set_value(121.3);
let fields: Fields = vec![Box::new(lights), Box::new(cooling)];
// save back the changed values
for field in fields.iter() {
cl.ag_write(
field.data_block(),
field.offset(),
field.to_bytes().len() as i32,
field.to_bytes().as_mut(),
)
.unwrap();
}
}
Copyright 2019 Petar Dambovaliev. All rights reserved. This software may be modified and distributed under the terms of the BSD license. See the LICENSE file for details.