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

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

0x0
  • ​ 阅读本文章你能会使用java与西门子plc 进行通信
  • ​ 所有环境都为仿真模拟环境,
  • ​ 本测试使用的是西门子plc(s7-1500)
  • ​ 软件为: 博图v16 plc仿真(s7-1500) idea
0x1
  • 开始工作,首先搭建plc环境 在这里不解释请转移到 模拟环境文章(在写了 会更新的)
  • IDEA 使用 Maven 你也可以吧集成到spring 或者boot, 做进一步操作
0x2
  1. 创建工程
  2. 导入maven 坐标

         
            
                com.github.s7connector
                s7connector
                2.1
            
        
  3. 使用的是 s7connector 官网有简单的案例 官网地址https://s7connector.github.io...
  4. github地址 https://github.com/s7connecto...
0x3
开始代码

创建对象

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

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第1张图片

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

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第2张图片

ip地址可以在接口中看到

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第3张图片

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

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

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

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第4张图片

0x4
开始读

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

plc数据块

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第5张图片

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

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

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

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第6张图片

两个解决方法

  1. 使用内置方法来转换字符串 内置方法传参 字节偏移参数0就好因为源码中有拼接如果拼接大于读取长度会下标异常 位偏移 根本没用这
  2. 如果plc 内数据长度是固定的 可以使用固定长度开始位置+2 比如上边的我偏移量为4 那么我就从6位置开始读取 源码下图其实也是截断后两位

源码图

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第7张图片

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

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第8张图片

0x5
写操作
        String data = "qqqqqqqq111";
        byte[] bytes = data.getBytes();

        connector.write(DaveArea.DB,1,4,bytes);

写入操作就比较简单了

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第9张图片

image.png

结束!

进阶

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

java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接_第10张图片

求求你关注公众在走吧

所有代码

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

    }

你可能感兴趣的:(plc,java)