PLC数据

Eclipse+Maven+JDK8

使用的轮子是 s7connector 官网有简单的案例 官网地址https://s7connector.github.io/s7connector/

  1. 创建Maven工程,

  2. 需要导入的Maven依赖

  3. <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");
	}
}

 

 

更多推荐