java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接

·  阅读 414

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接

0x0

  • ​ 阅读本文章你能会使用java与西门子plc 进行通信
  • ​ 所有环境都为仿真模拟环境,
  • ​ 本测试使用的是西门子plc(s7-1500)
  • ​ 软件为: 博图v16 plc仿真(s7-1500) idea

0x1

  • 开始工作,首先搭建plc环境 在这里不解释请转移到 模拟环境文章(在写了 会更新的)
  • IDEA 使用 Maven 你也可以吧集成到spring 或者boot, 做进一步操作

0x2

  1. 创建工程

  2. 导入maven 坐标

    	 <dependencies>
            <dependency>
                <groupId>com.github.s7connector</groupId>
                <artifactId>s7connector</artifactId>
                <version>2.1</version>
            </dependency>
        </dependencies>
    复制代码
  3. 使用的是 s7connector 官网有简单的案例 官网地址s7connector.github.io/s7connector…

  4. github地址 github.com/s7connector…

0x3

开始代码

创建对象

S7Connector connector =
        S7ConnectorFactory
                .buildTCPConnector()
                .withHost("ip") //
                .withRack(0) //架机号  可选
                .withSlot(0) //插槽号  可选
                .build();
复制代码

image-20201230101410917

架机和插槽在博图软件可以看到,当然了你也可以不写

image-20201230102148626

ip地址可以在接口中看到

image-20201230102542046

在plc保护中一定要开始读写操作和 远程对象put get 访问 要不然读取不到

对了还要关机 优化数据块的优化要不然看不到偏移地址

数据块 - 右键属性 -属性 - 优化块的访问

image-20201230103614633

0x4

开始读

首先开始读取 String 字符串读取

plc数据块

image-20201230113321919

byte[] PlcData = connector.read(
                DaveArea.DB, //选择区块
                1, // 区块编号
                50,  //长度
                4);   //开始位置
        String str = new String(PlcData);
        String str1 = "";
        System.out.println("读取到的数据="+str);
		StringConverter converter = new StringConverter();
        String extract1 = converter.extract(str1.getClass(), PlcData, 0, 0);
        System.out.println("内置方法转换str="+extract1);


复制代码

注意这里的长度和开始位置有一些复杂关系

如果不使用内置方法转换字符串那么 读取出来的结果直接转换的话前两个字符换乱码

image-20201230113635897

两个解决方法

  1. 使用内置方法来转换字符串 内置方法传参 字节偏移参数0就好因为源码中有拼接如果拼接大于读取长度会下标异常 位偏移 根本没用这

  2. 如果plc 内数据长度是固定的 可以使用固定长度开始位置+2 比如上边的我偏移量为4 那么我就从6位置开始读取 源码下图其实也是截断后两位

源码图

image-20201230114155098

其他类型都差不多,,注意类型转换就好了 ,方法有类型转换

0x5

写操作

		String data = "qqqqqqqq111";
        byte[] bytes = data.getBytes();

        connector.write(DaveArea.DB,1,4,bytes);
复制代码

写入操作就比较简单了

image-20201230121434697

image-20201230121745495

结束!

进阶

  • 使用opc ua 通讯方式 读写西门子 (如果现场设备比较多品牌不一样的情况下但是数据需要汇总收集分析,就可以用opcua ) 在写了.
  • 使用kepserver 进行opc 通讯 kep server 是一款很强大的软件可以跟设备通讯 也可以跟上位机通讯 在写了
  • 等待下次更新

image-20201230122044546

求求你关注公众在走吧

所有代码

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.StringConverter;
import com.github.s7connector.impl.utils.S7Type;
import com.sun.org.apache.xpath.internal.objects.XString;

/**
 * @Author Alkin
 * @Date 2020/12/30 10:08
 * @Version 1.0
 */
public class Test {

    public static void main(String[] args) {
        //创建一个链接对象
        S7Connector connector =
                S7ConnectorFactory
                        .buildTCPConnector()
                        .withHost("192.168.0.1") //
                        .withRack(0) //架机号  可选
                        .withSlot(1) //插槽号  可选
                        .build();
        String data = "qqqqqqqq111";
        byte[] bytes = data.getBytes();
        System.out.println("bytes = " + bytes.length);
        connector.write(DaveArea.DB,1,4,bytes);

        byte[] PlcData = connector.read(
                DaveArea.DB, //选择区块
                1, // 区块编号
                255,  //长度
                4);   //偏移地址
        String str = new String(PlcData);
        String str1 = "";
        System.out.println("读取到的数据="+str);
        StringConverter converter = new StringConverter();
        String extract1 = converter.extract(str1.getClass(), PlcData, 0, 0);
        System.out.println("内置方法转换str="+extract1);
    }

    }

复制代码
分类:
阅读
标签:
分类:
阅读
标签:
收藏成功!
已添加到「」, 点击更改