java读写西门子plc数据块 采用TCP网络连接

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

 

 

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 测试读写西门子PLC数据,支持带网口的PLC是一个相对简单但需要一定技术的过程。 首先,我们需要确保我们的PLC带有网口功能。大多数现代化的西门子PLC都配备了以太网接口,用于与其他设备进行通信。 其次,我们需要编写一段代码来实现数据读写操作。对于西门子PLC,我们可以使用S7通信协议来进行通信。这个协议提供了一系列的指令和函数来读写PLC数据。我们可以使用编程软件(如STEP 7或TIA Portal)编写这个代码。在代码中,我们需要指定要读写数据的地址和数据类型,并使用相应的函数来进行读写操作。 接下来,我们需要配置网络连接。我们需要确保PLC的IP地址和计算机的IP地址在同一个子网段中,并且设置正确的子网掩码和默认网关。此外,我们还需要设置好PLC的网络参数,如端口号、通信速率等。 然后,我们可以使用一个通信测试工具,如Wireshark或Tera Term,来测试与PLC网络连接。我们可以发送一个读取或写入数据的请求,并查看返回的响应。如果我们能够成功读写数据,说明我们的网口通信正常工作。 最后,我们可以使用我们的测试代码来实际读取和写入PLC数据。我们可以读取一些寄存器或地址中的数据,并将其显示出来。我们还可以尝试写入一些数据,然后再读取出来进行确认。 通过上述步骤,我们能够测试读写西门子PLC数据,支持带网口的PLC。这个过程需要一些基本的网络和编程知识,但对于熟悉西门子PLC的工程师来说,是可以轻松完成的。 ### 回答2: 测试读写带网口的西门子PLC数据可以按照以下步骤进行: 首先,需要确定使用的西门子PLC型号和网口通信协议,例如S7-1200系列PLC,通信协议可能是TCP/IP或者Modbus TCP/IP等。 接下来,需要创建一个测试程序,使用编程软件(如TIA Portal)来编写。 在程序中,首先需要配置PLC的网络设置,包括IP地址、子网掩码等。确保PLC与电脑处于同一个网络下。 然后,根据通信协议的要求,设置PLC和电脑之间的通信参数,如端口号、数据传输方式等。 接着,编写读取PLC数据的代码。可以使用相应的读取指令(如DBRead、MBRead等)来读取PLC内部的数据寄存器,如输入、输出、数据等。 在读取数据时,可以选择单个数据寄存器读取,也可以选择读取一组数据寄存器。读取的数据可以存储在电脑中,以供后续处理。 接下来,编写写入PLC数据的代码。同样,可以使用相应的写入指令(如DBWrite、MBWrite等)来写入数据PLC的寄存器中。 在写入数据时,需要注意数据的格式和范围,确保写入的数据PLC的要求匹配,以防止出现错误。 最后,运行测试程序,通过编程软件与PLC建立连接,并进行读写数据的测试。可以通过观察读取和写入的结果,来判断测试是否成功。 需要注意的是,由于不同型号的西门子PLC和不同的通信协议有些细节会不同,因此具体的测试步骤可能会有所调整。建议在操作过程中参考相关的PLC和通信协议的手册或文档。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值