JAVA与西门子S7协议通讯

1.引入maven依赖

  <!--S7协议(与西门子通信依赖)-->
        <dependency>
            <groupId>com.github.s7connector</groupId>
            <artifactId>s7connector</artifactId>
            <version>2.1</version>
        </dependency>

2.工具类

package com.nwpusct.csal.controller.s7plc;

import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import com.github.s7connector.api.S7Serializer;
import com.github.s7connector.api.factory.S7ConnectorFactory;
import com.github.s7connector.api.factory.S7SerializerFactory;

import java.io.IOException;
import java.math.BigInteger;
import java.nio.ByteBuffer;

/**
 * 测试PLC通信,使用
 */
public class S7Utlis {
    public static S7Connector initConnect(String ipAddress) {
        S7Connector s7connector = null;
        try {
            //PLC地址 ipAddress
            //默认端口
            int port = 102;
            int rack = 0;
            int slot = 1;
            int timeout = 10000;
            s7connector =
                    S7ConnectorFactory
                            .buildTCPConnector()
                            .withHost(ipAddress)
                            .withPort(port) //optional
                            .withRack(rack) //架机号  可选
                            .withSlot(slot) //插槽号  可选
                            .withTimeout(timeout) //连接超时时间
                            .build();
            S7Serializer s7Serializer2L = S7SerializerFactory.buildSerializer(s7connector);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return s7connector;
    }

    /**
     * 读取PLC中的整型数据
     **/
    public static int readPlcIntData(S7Connector s7Connector, int db, int dataLength, int offset) {
        //第一个参数:DaveArea.DB 表示读取PLC的地址区域为DB
        //第二个参数:DB块地址,若plc中是DB1000,则填1000
        //第三个参数:数据长度
        //第四个参数:偏移量
//        byte[] getBytes = s7Connector.read(DaveArea.DB, 150, 2, 0);
        byte[] getBytes = s7Connector.read(DaveArea.DB, db, dataLength, offset);
        Integer intData = new BigInteger(getBytes).intValue();
        System.out.println("getIntData:" + intData);
        try {
            s7Connector.close();
            return intData;
        } catch (IOException e) {
            e.printStackTrace();
            return -1;
        }
    }

    /**
     * 向PLC中写短整型(2字节,对应PLC INT类型)数据
     **/
    public static void writePlcShortIntData(int bytesL, S7Connector s7Connector, int db, int offset, short data) {

        //第一个参数:DaveArea.DB 表示读取PLC的地址区域为DB
        //第二个参数:DB块地址,若plc中是DB1000,则填1000
        //第三个参数:偏移量
        //第四个参数:写入的数据 二进制数组byte[]
        byte[] bytes = ByteBuffer.allocate(bytesL).putShort(data).array();
        System.out.println("bytes length:" + bytes.length);
        s7Connector.write(DaveArea.DB, db, offset, bytes);
        try {
            s7Connector.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


3.API接口

package com.nwpusct.csal.controller.s7plc;

import com.github.s7connector.api.S7Connector;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;




@CrossOrigin
@RestController
@Api(tags = {"PLC接口信息"})
@RequestMapping(value = "/plcApi")
public class S7TcpController {

    @Value(value = "${plc-ip}")
    private String plcIP;

    @GetMapping(value = "/readPlcIntData")
    public String readPlcIntData( @RequestParam(value = "db") Integer db,
                                  @RequestParam(value = "dataLength") Integer dataLength,
                                  @RequestParam(value = "offset") Integer offset
    ) {
        try {
            S7Connector s7Connector = S7Utlis.initConnect(plcIP);
            System.out.println("readPlcIntData------连接成功");
            int i = S7Utlis.readPlcIntData(s7Connector,db,dataLength,offset);
            return String.valueOf(i);
        } catch (Exception e) {
            e.printStackTrace();
            return "读取失败!!!";
        }
    }

    @GetMapping(value = "/writePlcIntData")
    public String writePlcIntData(@RequestParam(value = "bytesL") Integer bytesL,
                                  @RequestParam(value = "db") Integer db,
                                  @RequestParam(value = "offset") Integer offset,
                                  @RequestParam(value = "data") short data
    ) {
        try {
            S7Connector s7Connector = S7Utlis.initConnect(plcIP);
            System.out.println("writePlcIntData-----连接成功");
            S7Utlis.writePlcShortIntData(bytesL,s7Connector, db, offset, data);
            return "写入成功!!!";
        } catch (Exception e) {
            e.printStackTrace();
            return "写入失败!!!";
        }
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_37239798/article/details/127528232