PLC数据
Eclipse+Maven+JDK8
使用的轮子是 s7connector 官网有简单的案例 官网地址https://s7connector.github.io/s7connector/
-
创建Maven工程,
-
需要导入的Maven依赖
-
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.github.s7connector</groupId> <artifactId>s7connector</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies>
获取数据代码
import java.io.IOException;
import java.math.BigDecimal;
import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import com.github.s7connector.api.factory.S7ConnectorFactory;
import com.github.s7connector.impl.serializer.converter.BitConverter;
import com.github.s7connector.impl.serializer.converter.IntegerConverter;
import com.github.s7connector.impl.serializer.converter.RealConverter;
import com.github.s7connector.impl.serializer.converter.StringConverter;
/**
* 测试PLC通信
* 获得PLC的数据
*/
public class PlcTest1 {
//Int类型的封装类 用来转义
private static IntegerConverter intCon = new IntegerConverter();
//String...
private static StringConverter strCon = new StringConverter();
//Boolean...
private static BitConverter boolCon = new BitConverter();
//real实数浮点...
private static RealConverter realCon = new RealConverter();
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 获取开始时间
//创建与PLC的链接
final S7Connector connector = S7ConnectorFactory.buildTCPConnector().withHost("192.168.0.21") //
.withRack(0) // 架机号 可选
.withSlot(1) // 插槽号 可选
.build();
byte[] PlcData = connector.read(DaveArea.DB, // 选择数据区块
5, // 区块编号
2, // 数据值长度 int长度2
2); // 开始位置 偏移量
System.out.println("转换int="+intCon.extract(new Integer(0).getClass(), PlcData, 0, 0));
PlcData = connector.read(DaveArea.DB, // 选择数据区块
5, // 区块编号
16, // 数据值长度 String最小3 随值长度增加
4); // 开始位置偏移量
System.out.println("转换str="+strCon.extract(new String().getClass(), PlcData, 0, 0));
PlcData = connector.read(DaveArea.DB, // 选择数据区块
5, // 区块编号
1, // 数据值长度 boolean长度1
0); // 开始位置偏移量
System.out.println("转换bool="+boolCon.extract(new Boolean(false).getClass(), PlcData, 0, 0));
PlcData = connector.read(DaveArea.DB, // 选择数据区块
5, // 区块编号
4, // 数据值长度 double长度4
516); //偏移量
Double num1 = realCon.extract(new Double(0).getClass(), PlcData, 0, 0);
BigDecimal bd1 = new BigDecimal(num1);
System.out.println("转换real浮点="+bd1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
try {
connector.close();//关闭链接
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis(); // 获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); // 输出程序运行时间
}
}
运行结果
写入数据代码
package wlf.learn;
import java.math.BigDecimal;
import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import com.github.s7connector.api.factory.S7ConnectorFactory;
import com.github.s7connector.impl.serializer.converter.BitConverter;
import com.github.s7connector.impl.serializer.converter.IntegerConverter;
import com.github.s7connector.impl.serializer.converter.RealConverter;
import com.github.s7connector.impl.serializer.converter.StringConverter;
/**
* 测试PLC通信 获得PLC的数据
* 多线程
*/
public class PlcTest2 {
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 计算开始时间
S7Connector connector = S7ConnectorFactory.buildTCPConnector().withHost("192.168.0.21") //
.withRack(0) // 架机号 可选
.withSlot(1) // 插槽号 可选
.build();
// 线程池
ExecutorService pool = Executors.newFixedThreadPool(10);
ThreadPoolExecutor executor = (ThreadPoolExecutor) pool;
executor.setCorePoolSize(2);
executor.setMaximumPoolSize(3);
//Real读写
executor.execute(new WriteReal(connector,(float)202109.06));
executor.execute(new GetReal(connector));
//String读写
executor.execute(new WriteString(connector,"SShelloword"));//'SS'占位符 从第3个字符开始为写入内容
executor.execute(new GetString(connector));
//关闭线程池
pool.shutdown();
long endTime = System.currentTimeMillis(); // 计算结束时间
System.out.println("程序整体运行时间:" + (endTime - startTime) + "ms"); // 输出程序运行时间
}
}
class GetString implements Runnable {
S7Connector connector = null;
GetString(S7Connector connector) {
this.connector = connector;
}
public void run() {
long startTime = System.currentTimeMillis(); // 计算开始时间
// String...
StringConverter strCon = new StringConverter();
byte[] PlcData = connector.read(DaveArea.DB, // 选择数据区块
5, // 区块编号
128, //byte数据值长度 String最小3 最大96 随值长度增加
4); // 开始位置偏移量
System.out.print("str=" + strCon.extract(new String().getClass(), PlcData, 0, 0).trim());
long endTime = System.currentTimeMillis(); // 计算结束时间
System.out.println("\t时间:" + (endTime - startTime) + "ms"); // 输出程序运行时间
}
}
class GetReal implements Runnable {
S7Connector connector = null;
GetReal(S7Connector connector) {
this.connector = connector;
}
public void run() {
long startTime = System.currentTimeMillis(); // 计算开始时间
RealConverter realCon = new RealConverter();
byte[] PlcData = connector.read(DaveArea.DB, // 选择数据区块
5, // 区块编号
4, //byte数据值长度 double长度4
260); // 偏移量
Double num1 = realCon.extract(new Double(0).getClass(), PlcData, 0, 0);
BigDecimal bd1 = new BigDecimal(num1);
System.out.print("real浮点=" + bd1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
long endTime = System.currentTimeMillis(); // 计算结束时间
System.out.println("\t时间:" + (endTime - startTime) + "ms"); // 输出程序运行时间
}
}
/**
* 写入Real到PLC
* @author 1
*
*/
class WriteReal implements Runnable {
S7Connector connector = null;
Float data = null;
WriteReal(S7Connector connector,Float data) {
this.connector = connector;
this.data = data;
}
public void run() {
long startTime = System.currentTimeMillis(); // 计算开始时间
System.out.println(); // 输出程序运行时间
byte[] bytes = ByteBuffer.allocate(4).putFloat(data).array();
connector.write(DaveArea.DB,5,260,bytes);
long endTime = System.currentTimeMillis(); // 计算结束时间
System.out.println("写入Real成功:"+data+"\t时间:" + (endTime - startTime) + "ms");
}
}
/**
* 写入String到PLC
* @author 1
*
*/
class WriteString implements Runnable {
S7Connector connector = null;
String data = null;
WriteString(S7Connector connector,String data) {
this.connector = connector;
this.data = data;
}
public void run() {
long startTime = System.currentTimeMillis(); // 计算开始时间
byte[] bytes = data.getBytes();
connector.write(DaveArea.DB,5,4,bytes);
long endTime = System.currentTimeMillis(); // 计算结束时间
System.out.println("写入Str成功:"+data+"\t时间:" + (endTime - startTime) + "ms");
}
}